feat: Redis 기반 Rate Limit 공통 모듈 추가 - #111
Conversation
…gration test, and 429 handler test
…ken by the global interceptor
…fail-closed strategy
PR 리뷰 요약 (자동 리뷰)머지 전 반드시 확인이 필요한 항목만 정리했습니다. 🔴 Blocker
문제를 찾지 못한 나머지 항목(계층 아키텍처, JPA, 나머지 테스트 등)에 대해서는 별도로 지적하지 않았습니다. |
🔗 관련 이슈
Closes #90
📝 작업 내용
1. Rate Limit 공통 모듈 설계 및 구현
common/ratelimit공통 인터페이스(RateLimiter) 및 관련 DTO/도메인 타입(RateLimitResult,RateLimitRule) 설계RedisRateLimiter) 구현INCR및PEXPIRE연산 적용rate_limit_fail_total) 수집 추가2. AOP 및 Web MVC 설정
@RateLimitedAOP 애노테이션 및 IP 기반 요청 차단을 위한RateLimitInterceptor구현X-Forwarded-For헤더를 우선 참조하도록 IP 추출RateLimitWebConfig를 통한 인터셉터 전역 등록 진행app.rate-limit.rules.*설정 클래스(RateLimitProperties) 추가RateLimitRuleValidator구현3. 예외 및 에러 응답 처리
RateLimitExceededException예외 클래스 추가GlobalExceptionHandler내 429 응답(HTTP statusTOO_MANY_REQUESTS, 에러코드C-005) 처리 구현Retry-After응답 헤더 추가 처리4. 테스트 코드 작성 및 기존 슬라이스 테스트 보완
RedisRateLimiter,RateLimitInterceptor,RateLimitRuleValidator,GlobalExceptionHandler단위/통합 테스트 작성@WebMvcTest슬라이스 테스트 Mocking 보완✅ 체크리스트
💬 리뷰 참고 사항
RateLimitWebConfig에서 인터셉터를 전역 등록함에 따라, Rate Limit 적용 여부와 관계없이 컨트롤러 슬라이스 테스트에 Mock bean이 추가되었습니다. 앞으로 컨트롤러 슬라이스 테스트 작성시 함께 추가 부탁합니다.auth-login처럼 보안이 중요한 규칙은fail-open: false설정으로 Fail-Closed 처리하도록 규칙별로 선택 가능하게 만들었습니다.