[STK6-01] Resilience4j 의존성 추가 + 공통 Rate Limiter 설정

작업 내용 (설계 의도)

변경 사항

Toss Open API의 API 그룹별 TPS 한도를 백엔드에서 자동으로 준수하기 위해 Resilience4j를 도입한다. 이 티켓은 STK6-02 (Gateway 적용)의 공통 병목 산출물로, 의존성·설정·공통 클래스·예외를 모두 확립한다.

변경 범위:

  1. build.gradle.kts — Resilience4j 의존성 추가
  2. application.yml — resilience4j RateLimiter·CircuitBreaker 설정
  3. TossApiGroup enum — API 그룹 이름 관리
  4. TossRateLimiterFacade — RateLimiter + CircuitBreaker 조합 실행 공통 클래스
  5. TossRateLimitException — RateLimiter 초과 예외
  6. TossCircuitOpenException — CircuitBreaker OPEN 예외

다이어그램

클래스 의존

flowchart LR
    subgraph Common["common/infrastructure/toss"]
        FA[TossRateLimiterFacade]
        GRP[TossApiGroup]
        EX1[TossRateLimitException]
        EX2[TossCircuitOpenException]
        CFG[TossRateLimiterConfig]
    end

    FA --> GRP
    FA --> EX1
    FA --> EX2
    CFG --> FA

테스트 케이스

  • TossRateLimiterFacade 를 직접 생성해 MARKET_DATA 그룹 10 req 연속 정상 실행한다
  • TossRateLimiterFacade 에서 11번째 req 시 TossRateLimitException 을 throw한다
  • TossRateLimiterFacade 에서 ACCOUNT 그룹 1 req 성공 → 2번째 req TossRateLimitException 을 throw한다
  • TossRateLimiterFacade CircuitBreaker 실패율 50% 초과 시 TossCircuitOpenException 을 throw한다
  • TossRateLimiterFacadeRuntimeException 을 throw하는 블록 실행 시 예외를 그대로 전파한다