Spring 기초 정리 - Interceptor

Zyoon·2025년 6월 12일
0

Spring 기초정리

목록 보기
13/18
post-thumbnail

📘Interceptor 의 사용이유와 사용법 정리


Interceptor 란?

  • 만약 요청이 컨트롤러에 도달하기 전 이나 후에 공통적으로 하고 싶은 작업이 있다고 가정해본다.
  • 예를들어 로그인 확인, 요청 정보 로깅, 응답 시간 측정, 권한 체크 등등
  • 이런 작업을 모든 컨트롤러마다 한다고 해서 모든 코드에 직접 코딩하면 너무 비효율적이 된다.
  • 그럴때 사용하는게 바로 Interceptor 이다.

Interceptor 의 역할

  1. preHandle()
    • 요청 전, 컨트롤러 실행 전에 시작되는 메서드
    • 주로 로그인 유무, 로그 기록 시작, 권한 체크 등
  2. postHandle()
    • 컨트롤러 실행 후, 응답 전에 실행되는 메서드
    • 주로 응답 데이터 추가, View 전처리 등
  3. afterCompletion()
    • 응답 완료 후
    • 처리 시간 측정, 리소스 정리, 로그 마무리

Interceptor 예시

요청 전, 후 로그를 남기는 기능

  • 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);
    }
}

  • Interceptor 클래스 생성 - 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 레벨의 컨트롤러 전후 처리기
  • 실행 흐름 : 요청 → 필터 → 인터셉터 → 컨트롤러 → 인터셉터 → 응답 → 필터
항목필터 (Filter)인터셉터 (Interceptor)
실행 위치서블릿 이전 (가장 먼저 실행됨)컨트롤러 실행 전/후
대상 요청모든 요청 (정적 자원 포함)스프링 MVC 요청만
주요 용도인코딩, CORS, 인증, 로깅 등로그인 체크, 권한 검사, 로깅 등
DI 가능 여부X (의존성 주입 어려움)O (스프링 빈 주입 가능)
View 접근불가능가능 (postHandle에서 Model 접근 가능)
사용 위치web.xml 또는 FilterRegistrationBeanWebMvcConfigurer.addInterceptors()
profile
기어 올라가는 백엔드 개발

0개의 댓글