📘Interceptor 의 사용이유와 사용법 정리
preHandle()
postHandle()
afterCompletion()
요청 전, 후 로그를 남기는 기능
logRequest()
- 로그 전용 클래스에 로그만 남기는 메서드 생성@Slf4j
public class InterceptorLogger {
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static void logRequest(HttpServletRequest request, String phase) {
String requestUri = request.getRequestURI();
String method = request.getMethod();
String timestamp = LocalDateTime.now().format(FORMATTER);
log.info("[{}] {} {} - {}", timestamp, method, requestUri, phase);
}
}
HandlerInterceptor
구현@Component
public class AdminInterceptor implements HandlerInterceptor {
}
preHandle()
- 컨트롤러 진입 전 관리자 권한 확인 후 로그 생성@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String roleStr = (String) request.getAttribute("userRole");
UserRole userRole = UserRole.valueOf(roleStr);
if (!UserRole.ADMIN.equals(userRole)) {
response.sendError(HttpServletResponse.SC_FORBIDDEN, "관리자 권한이 없습니다.");
return false;
}
InterceptorLogger.logRequest(request, "요청 시작");
return true;
}
postHandle()
- 컨트롤러 실행 후 로그 생성@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
InterceptorLogger.logRequest(request, "컨트롤러 처리 완료 (postHandle)");
if (modelAndView != null) {
modelAndView.addObject("interceptedAt", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
}
afterCompletion()
- 응답 완료 후 로그 생성@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
if (ex != null) {
InterceptorLogger.logRequest(request, "요청 실패");
} else {
InterceptorLogger.logRequest(request, "요청 정상 완료");
}
}
WebConfig
추가@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
private final AdminInterceptor adminInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(adminInterceptor)
.addPathPatterns("/admin/**"); //이 패턴만 인터셉터로 진행
}
}
항목 | 필터 (Filter) | 인터셉터 (Interceptor) |
---|---|---|
실행 위치 | 서블릿 이전 (가장 먼저 실행됨) | 컨트롤러 실행 전/후 |
대상 요청 | 모든 요청 (정적 자원 포함) | 스프링 MVC 요청만 |
주요 용도 | 인코딩, CORS, 인증, 로깅 등 | 로그인 체크, 권한 검사, 로깅 등 |
DI 가능 여부 | X (의존성 주입 어려움) | O (스프링 빈 주입 가능) |
View 접근 | 불가능 | 가능 (postHandle 에서 Model 접근 가능) |
사용 위치 | web.xml 또는 FilterRegistrationBean | WebMvcConfigurer.addInterceptors() |