본문 바로가기

emotional developer/detect-pattern

How to Prevent Duplicate Requests Effectively

https://medium.com/javarevisited/rest-api-how-to-prevent-duplicate-requests-effectively-d3be88ef7838

 

Rest API: How to Prevent Duplicate Requests Effectively

The solution to prevent duplicate requests that I want to talk about here is that when a user manipulates an API feed

medium.com

 

구현 아이디어

  1. 사용자가 API를 호출할 때, 요청 본문(Request Body)에서 특정 데이터를 추출하여 Redis 키를 생성합니다.
  2. 이 키는 MD5로 해시되어 저장되며, Redis에 키가 이미 존재하는지 여부를 확인합니다.
  3. 만약 Redis에 키가 존재하면 중복 요청으로 간주하고 오류를 반환합니다.
  4. 키가 존재하지 않으면 Redis에 새로운 키를 저장하고, 이 키는 일정 시간이 지나면 만료됩니다.

구현 순서

  • 특정 필드(예: productId, transactionId)를 기반으로 Redis 키를 생성하고, 필요 시 옵션 값을 추가하여 유연하게 중복 요청을 방지할 수 있도록 합니다.
  • 생성된 키는 MD5로 해시하여 저장하고, 키의 유효 시간(예: 40초)을 설정합니다.
  • 중복 요청이 발생하면 DuplicationException을 발생시켜 클라이언트에 오류 메시지를 반환합니다.

주요 클래스 및 설명

  1. PreventDuplicateValidator : 중복 요청 방지를 위한 커스텀 어노테이션. 필드 목록과 키 만료 시간을 설정할 수 있습니다.
  2. PreventDuplicateValidatorAspect : 어노테이션에 지정된 필드를 기준으로 Redis 키를 생성하고, 중복 요청을 확인하는 로직을 구현합니다.
  3. Utils : 요청 본문을 추출하고 MD5 해시를 생성하는 유틸리티 클래스입니다.
  4. HandleGlobalException : 중복 요청 발생 시 던져진 DuplicationException을 처리하여 클라이언트에 적절한 오류 메시지를 반환합니다.

테스트

  1. Postman을 사용하여 API 요청을 보냅니다. 첫 번째 요청은 성공적으로 처리되고 Redis에 키가 저장됩니다.
  2. 두 번째로 동일한 요청을 보내면 Redis에 키가 이미 존재하므로 중복 요청으로 처리되고 오류 메시지가 반환됩니다.

결론

  • 중복 요청 방지를 위해 어떤 필드를 사용할지 신중히 선택해야 합니다.
  • 키의 만료 시간을 비즈니스 요구사항에 맞게 조정할 필요가 있습니다.
  • 성능 최적화를 위해 MD5 해시 사용 여부를 고려해야 합니다.

 

 

 

반응형