[STK6-03] 임계치 통합 테스트 + 예외 핸들러 추가

작업 내용 (설계 의도)

변경 사항

RateLimiter 임계치까지의 정상 흐름과 초과 시 예외 발생을 검증하는 통합 테스트를 작성한다. GlobalExceptionHandlerTossRateLimitException → 429, TossCircuitOpenException → 503 매핑을 추가한다.

변경 범위:

  1. GlobalExceptionHandler — 2개 예외 핸들러 추가
  2. TossRateLimiterFacadeIntegrationTest — RateLimiter/CircuitBreaker 임계치 통합 테스트
  3. GlobalExceptionHandlerTest — 예외 → HTTP 상태코드 매핑 테스트

예외 매핑

예외HTTP 상태코드응답 메시지
TossRateLimitException429 Too Many Requests”Toss API 요청 한도를 초과했습니다”
TossCircuitOpenException503 Service Unavailable”Toss API를 일시적으로 사용할 수 없습니다”

다이어그램

처리 흐름

sequenceDiagram
    participant C as Controller
    participant EH as GlobalExceptionHandler
    participant F as TossRateLimiterFacade

    C->>F: execute(MARKET_DATA) { block }
    F-->>C: TossRateLimitException
    C-->>EH: 예외 전파
    EH-->>C: ResponseEntity(429)

테스트 케이스

  • MARKET_DATA 그룹 10 req 연속 실행 시 모두 정상 완료한다
  • MARKET_DATA 그룹 11번째 req 시 TossRateLimitException 을 throw한다
  • ACCOUNT 그룹 1 req 성공 → 2번째 req TossRateLimitException 을 throw한다
  • ORDER 그룹 6 req 연속 성공 → 7번째 req TossRateLimitException 을 throw한다
  • CircuitBreaker 실패율 50% 초과 (20건 슬라이딩 윈도우, 10건 실패) 시 OPEN 전이한다
  • CircuitBreaker OPEN 상태에서 호출 시 TossCircuitOpenException 을 즉시 throw한다
  • TossRateLimitException 발생 시 HTTP 429 응답을 반환한다
  • TossCircuitOpenException 발생 시 HTTP 503 응답을 반환한다
  • 1초 대기 후 RateLimiter가 리셋되어 다시 정상 호출된다