Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#259 중복된 요청에 대한 에러 처리 #260

Merged
merged 50 commits into from
May 13, 2024
Merged

#259 중복된 요청에 대한 에러 처리 #260

merged 50 commits into from
May 13, 2024

Conversation

KWY0218
Copy link
Member

@KWY0218 KWY0218 commented May 8, 2024

✒️ 관련 이슈번호

Key Changes 🔑

  1. Wrapping Filter 변경
  • 기존의 Wrapping ContentCachingWrapping 객체가 Request Wrapping이 잘 진행되지 않아서 커스텀 Wrapping 객체로 변경하였습니다!
  1. Interceptor를 통해 중복된 요청 에러 처리
  • 요청이 발생하면 Redis Hash Map에 IP와 RequestBody 값을 Key로 저장한 후 정삭적으로 실행되었을 때 postHandle 을 통해 Rmap에 담겨 있는 값을 삭제, 중간에 예외가 발생했을 때 afterCompletion에서 Rmap 내부의 값을 삭제
  • 도중에 같은 요청이 들어온다면, Too Many Request 예외 발생
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    if (lock(request)) return true;
    throw new TooManyRequestException(Error.TOO_MANY_REQUEST_EXCEPTION);
    }
  • Interceptor를 사용하여 GlobalExceptionHandler가 해당 예외를 처리하고 반환할 수 있게 구현하였습니다.

To Reviewers 📢

테스트 코드

  • 처음엔 @WebMvcTest 를 통해 컨트롤러 테스트로 진행하려 했지만, 해당 테스트는 redis의 사용도 필요했기 때문에 인수 테스트가 적합하다고 생각해 @SpringBootTest 로 작성했습니다.
  • @SpringBootTest 에는 MockMvc를 @Autowired 할 수 없기 때문에 @AutoConfigureMockMvc 를 통해서 MockMvc를 @Autowired 합니다.
  • numberOfThread 수만큼 스레드를 생성해서 회의 생성 API를 호출한 뒤, andReturn()을 통해 수행 결과를 list에 추가합니다.
    • RMap key를 만들 때, x-real-ip 주소 값을 사용하기 때문에 테스트 시 x-real-ip 헤더를 추가합니다.
    • 람다 내부에서는 final 변수만 사용할 수 있기 때문에 외부에서 해당 결과를 테스트하기 위해서 MvcResult를 list에 추가했습니다.
    • numberOfThread 수만큼 스레드를 생성하기 때문에 MvcResult를 add하는 과정에서 여러 스레드가 동시에 add한 결과 numberOfThread-1 만큼 add가 되는 상황이 발생할 수 있습니다. 그렇기 때문에 synchronized를 통해서 results에 lock을 걸며 순차적으로 perform 결과를 add합니다.
  • 모든 스레드의 작업이 끝날 때까지 latch.await()를 통해 기다립니다.
  • 이후 results를 순회하며 200이 나온 횟수과 429가 나온 횟수를 구해서 테스트 결과를 검증합니다.
  • 이 때, 결과는 200이 나온 횟수는 단 1번이 나와야 하고, 429가 나온 횟수는 numberOfThread-1 만큼 나와야 합니다.

@KWY0218 KWY0218 requested a review from sohyundoh May 8, 2024 15:56
@sohyundoh sohyundoh changed the title #259 #259 중복된 요청에 대한 에러 처리 May 9, 2024
Copy link
Member

@sohyundoh sohyundoh left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

확인했습니다!
혹시 strategy에 node-version은 왜 쓰신건지!!

@KWY0218
Copy link
Member Author

KWY0218 commented May 13, 2024

@sohyundoh
고것은... 마켓플레이스에서 사용법 따라했습니다..!

@KWY0218 KWY0218 merged commit 9a49aa0 into develop May 13, 2024
4 checks passed
@KWY0218 KWY0218 deleted the feat/#259 branch May 13, 2024 11:45
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

갑자기 궁금점 !

요고 Record로 바꾼 이유는?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트 코드 작성하면서 request dto 만들겸 바꿨어

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[feat] 같은 유저에게 동시에 들어오는 요청 제한하기
2 participants