https://medium.com/javarevisited/rest-api-how-to-prevent-duplicate-requests-effectively-d3be88ef7838
구현 아이디어
- 요청 데이터 필드 사용: API 호출 시, 요청 본문에서 특정 필드를 선택하여 Redis 키를 생성합니다.
- MD5 해시 생성: 선택한 필드를 기반으로 키를 생성하고, MD5로 해시합니다.
- Redis 중복 키 확인: Redis에서 해당 키가 존재하는지 확인합니다. 존재하면 중복 오류를 반환하고, 존재하지 않으면 키를 Redis에 저장하고 만료 시간을 설정합니다.
- 키 만료 시간 설정: 생성된 키는 40초 동안 유지됩니다(데모에서는 40초).
주요 클래스 및 설명
PreventDuplicateValidator
: 중복 요청 방지를 위한 어노테이션. 요청 필드와 만료 시간을 설정할 수 있습니다.
PreventDuplicateValidatorAspect
: 중복 요청 검증을 수행하는 AOP 클래스.
Utils
: 요청 본문에서 데이터를 추출하고 MD5 해시를 생성하는 유틸리티 클래스.
HandleGlobalException
: 중복 요청 시 발생하는 DuplicationException
을 처리하는 클래스.
Redis 설정
- Redis는 Docker를 통해 설정되며, Spring Boot 애플리케이션은 Redis와 연결됩니다.
테스트 시나리오
- Postman을 사용하여 API를 호출하면, 첫 번째 요청은 정상적으로 처리되고 Redis에 키가 저장됩니다.
- 동일한 요청을 다시 보내면 Redis에 이미 해당 키가 존재하므로 중복 요청으로 오류 메시지를 반환합니다.
결론
- 중복 요청을 방지할 필드 선택이 중요합니다.
- Redis 키의 만료 시간은 비즈니스 요구에 맞게 조정해야 합니다.
- MD5 해시를 사용할지 여부는 성능 최적화 관점에서 고려해야 합니다.