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에서 파라미터들을 꺼내어 별도의 객체로 만들어 준 후, 이벤트 퍼블리셔에 전달하는 방식으로 진행했다.