Spring에서는 컨트롤러의 핸들러가 호출되기 전/후, 실행 후 를 중심으로 요청/응답을 낚아채서 처리를 할 수 있는데, 이것이 인터셉터이다.

인터셉터에서는 주로

등을 처리하면 된다.

요청에 대한 로깅을 인터셉터에서 진행했고, 이 값들은 전부 외부 솔루션(AWS athena) 를 사용하여 해결 할 수 있었다.

@RequiredArgsConstructor
@Slf4j
public class logInterceptor implements HandlerInterceptor {
    private final ApplicationEventPublisher eventPublisher;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
            if (handler instanceof HandlerMethod method) {
                if (method.getMethod().getName().contains("{methodName}") {
                    String page = request.getParameter("page");

                    // 첫 페이지가 아닐 경우에만 이벤트 발생
                    if (!Objects.equals(page, "0")) {
                        try {
                            LogSearch search = new LogSearch(
                                    request.getParameter("{parameterName1}"),
                                    request.getParameter("{parameterName2}"),
                                    request.getParameter("{parameterName3}"),
                            );

                            // 이벤트 발행
                            eventPublisher.publishEvent(new GetEvent(this, request, search));
                        } catch (Exception e) {
                            log.info("error in recruitment interceptor: " + e.getMessage());
                        }
                    }
                }
            }
        } catch (Exception e) {
            log.info("error in recruitment interceptor: " + e.getMessage());
        }
        return true;
    }
}

먼저 HandlerIntercepter 인터페이스를 구현하는 클래스를 생성, 이후

preHandle(), PostHandle(), afterCompletion() 중에 필요한 로직에 따라 선택해서 사용하면 된다.

나의 경우는 유저가 메인 페이지에 들어왔을 때 행동 이력을 수집하기 위해 요청에 대한 로깅을 진행했다.

if (!Objects.equals(page, "0")) { 사이트 최초 접속 시 자동으로 page 가 0인 경우를 요청하는데, 들어와서 아무 것도 안하고 나가는 경우도 존재하기 때문에 이를 제외했다. (혹은 봇에 의한 접근)

인터셉터에서는 request에서 파라미터들을 꺼내어 별도의 객체로 만들어 준 후, 이벤트 퍼블리셔에 전달하는 방식으로 진행했다.