AOP를 활용한 api 중복 요청 방지 (따닥 방지)
2024. 7. 22. 01:00ㆍBackend 취업준비/Spring
숙박 서비스를 만들면서 숙소 등록 / 예약 등록 버튼을 누를 때 버튼을 실수로 여러번 누른다거나 하는 경우가 있었고, 이는 서비스에 안좋은 영향을 끼칠 것이라고 판단하여 이를 방지하고자 하였다.
프론트로 alert창으로 1차적으로 막는걸 시도했지만, 약간의 버튼을 누르고 alert창이 뜰 때 까지 약간의 텀이 있는 경우도 존재해서 충분하지 않았다. 이에 스프링 AOP를 활용하였다.

- HttpServletRequest 객체에서 우저 정보를 가져온 후 시간 정보와 함께 HashMap에 저장한다
- HttpServletRequest는 서블릿 컨테이너(예: 톰캣)가 HTTP 요청에 대한 정보를 제공하기 위해 사용하는 객체. 클라이언트로부터의 요청 정보를 포함하고 있으며, 파라미터, 헤더, 세션 정보 등을 제공
- 특정 기준 시간 이내에 호출이 반복적으로 발생하면 예외를 발생시키고 막는다.

사용자정의 인터페이스를 만들고, @PointCut 어노테이션과 함께 중복요청 방지 기능을 원하는 메서드에 손쉽게 적용할 수 있다.

이렇게 구현하고 나니 문제가 발생했는데, 특정 기준 시간을 정하기가 어려웠다. 처음엔 10분 가량으로 했다가, 불편함을 느껴서 점점 줄이곤 하다가 방식을 바꿔야 겠다고 생각했다. 따라서 플래그 형태로 리팩토링 하였다.
또 메서드 별로 따로 적용이 되도록 구분을 해주어야 겠다고 생각했다.

조금 더 나은 형태가 되었다고 생각한다.
외에도 Get요청만을 제외하고 적용하는 방식도 괜찮다고 생각된다.
'Backend 취업준비 > Spring' 카테고리의 다른 글
@Transactional사용 시 주의 사항과 원인 (2) | 2024.09.21 |
---|---|
스프링MVC, DispatcherServlet, ArgumentResolver, HttpMessageConverter (0) | 2024.08.15 |
@WebMvcTest를 사용한 Controller 단위 테스트 (1) | 2024.07.15 |
@Transactional, 영속성 컨텍스트 (2) | 2024.03.23 |
엔티티와 @RequestBody를 쓰는 DTO에서 기본 생성자, getter/setter의 필요성 (리플랙션) (0) | 2024.03.22 |