Team of 2 · Spring Boot Starter Library

Rate Limiter Starter

『가상면접 사례로 배우는 대규모 시스템 설계 기초』의 처리율 제한기를 실제 배포 가능한 Spring Boot 스타터 라이브러리로 구현. 어노테이션 한 줄로 5가지 알고리즘을 선언적으로 적용. 2인 공동 개발 — AOP 진입점·SpEL 키 해석·분산 락·Auto Configuration을 담당.

Java 21Spring Boot 3.4Redis · RedissonAOPGradle Multi-ModuleTestcontainers

핵심 기술 구현

알고리즘 5종 전략 패턴, AOP 선언적 적용, 분산 락까지 — 재사용 가능한 라이브러리 설계의 핵심 과제 해결

5가지 알고리즘 전략 패턴

Token Bucket · Leaky Bucket · Fixed Window Counter · Sliding Window Logging · Sliding Window Counter를 Handler 전략으로 격리. 설정값 한 줄로 알고리즘 교체.

@RateLimiting 선언적 적용

AOP 어드바이스가 비즈니스 로직 밖에서 제한을 처리. 메서드에 어노테이션 하나만 붙이면 키 해석 → 락 획득 → 알고리즘 판정 → 헤더 세팅까지 자동.

SpEL 동적 키 · 조건부 실행

"#userId" 같은 표현식으로 요청별 키를 동적 생성. executeCondition으로 "프리미엄 사용자는 제한 제외" 같은 조건부 Rate Limiting 지원.

Redisson 분산 락

멀티 인스턴스 환경에서 카운터 갱신 경합을 분산 락으로 제어. waitTime·leaseTime 설정 가능, 단일 서버는 ConcurrentHashMap 락으로 스왑.

Fallback + X-RateLimit 헤더

제한 초과 시 지정한 대체 메서드로 우아하게 응답. X-RateLimit-Remaining / Limit / Retry-After 표준 헤더를 자동 세팅해 클라이언트 백오프 지원.

제로 설정 Auto Configuration

스타터 의존성 추가만으로 동작. spring.factories 기반 자동 구성으로 캐시(Redis/로컬)·락·알고리즘을 프로퍼티로 조립.

아키텍처 하이라이트

01

멀티모듈 스타터 구조

핵심 로직(rate-limiter)과 Spring Boot 자동 구성(autoconfigure), 사용 예제(example)를 모듈로 분리. 라이브러리 소비자는 스타터 의존성만 추가.

core · autoconfigure · example
02

AOP 요청 처리 흐름

어노테이션 감지 → SpEL 키 해석 → 락 획득 → 알고리즘 핸들러 판정 → 응답 헤더 세팅. 각 단계가 인터페이스로 분리되어 구현 교체 가능.

@RateLimiting → RateLimitAop → Handler
03

Testcontainers 검증 체계

실제 Redis 컨테이너로 알고리즘·자동구성·분산 락을 통합 테스트. docs/에 아키텍처·알고리즘 비교·성능 튜닝·부하테스트 문서화.

Testcontainers · docs/load-test
04

오픈소스 운영 체계

CI 워크플로 4종, 이슈·PR 템플릿, CONTRIBUTING 가이드까지 갖춘 라이브러리 운영. 2인 협업으로 리뷰 기반 개발.

GitHub Actions ×4 · PR templates
5
Algorithms
127
Commits
4
CI Workflows
AOP·Lock
주도 설계 파트

기술적 의사결정

DECISION 01

왜 앱이 아닌 스타터인가

Rate Limiting은 어떤 서비스에나 필요한 횡단 관심사. 애플리케이션에 박아넣는 대신 Auto Configuration을 갖춘 스타터로 만들어, 의존성 추가와 프로퍼티 설정만으로 어느 서비스든 재사용하도록 설계.

DECISION 02

왜 전략 패턴인가

알고리즘마다 정확성·메모리·버스트 허용의 트레이드오프가 다름. Handler 인터페이스 뒤로 5종을 격리해 설정값으로 교체하고, 새 알고리즘은 Handler 구현 추가만으로 확장.

DECISION 03

왜 Redisson 분산 락인가

멀티 인스턴스에서 같은 키의 카운터를 동시에 갱신하면 초과 허용이 발생. Redisson 락으로 갱신을 직렬화하되, 락·캐시를 각각 추상화해 단일 서버는 로컬 자료구조로 동작하도록 이원화.

DECISION 04

역할 분담과 담당 파트

2인 공동 개발. AOP 진입점(RateLimitAop·SpEL 파서)과 분산 락 모듈, Auto Configuration을 직접 설계·구현했고(해당 디렉토리 커밋 대부분 담당), 알고리즘별 핸들러 구현은 팀원과 분담.