[Spring] Spring Interceptor에 대해 알아보자!

Euiyeon Park·2025년 2월 21일
0

Spring / SpringBoot

목록 보기
3/4
post-thumbnail

Spring Interceptor

  • 스프링 인터셉터는 요청(HttpRequest)와 응답(HttpResponse) 사이에서
    특정 작업을 수행할 수 있도록 해주는 기능
  • 인터셉터는 컨트롤러에 들어오는 HttpRequestHttpResponse를 가로채는 역할
  • HandlerInterceptor 인터페이스를 구현해 필터처럼 동작하며,
    컨트롤러 실행 전후에 특정 로직을 추가할 수 있다.

Interceptor의 주요 메서드

1. preHandle() -컨트롤러 실행 전

  • 요청이 컨트롤러에 도달하기 전에 실행
  • true를 반환하면 요청이 계속 진행되고, false를 반환하면 요청이 중단
  • 주로 인증(Authentication), 권한 체크(Authorization), 로깅, API 요청 검증 등에 사용

2. postHandle() - 컨트롤러 실행 후(view 렌더링 전)

  • 컨트롤러 실행이 끝난 후, view가 렌더링되기 전에 실행
  • ModelAndView 객체를 수정할 수 있어, View에 공통 데이터 추가 가능
  • 주로 공통 데이터 설정, 응답 데이터 변환, 로깅 등에 사용

3. afterCompletion() - 요청 완료 후(예외 발생과 관계없이 실행)

  • View까지 렌더링이 완료된 후 실행
  • 예외가 발생하더라도 실행되며, 요청의 마무리 작업을 처리할 수 있음
  • 주로 리소스 정리, 성능, 로깅, 트랜잭션 종료 등에 사용

Interceptor 구현

  • HandlerInterceptor 인터페이스를 구현해, 세 가지 메서드를 오버라이딩

💡 @Congiguration은 Spring에서 설정 클래스를 정의할 때 사용하는 어노테이션

  • 이 어노테이션이 붙은 클래스는 Spring의 설정 정보를 포함하는 클래스로 인식
  • Bean 등록과 관련된 설정을 정의하는 역할 - Spring IoC 컨테이너가 설정 정보 로드시 사용
public class MyInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
    						 HttpServletResponse response, 
                             Object handler) throws Exception {
        System.out.println("preHandle: 요청 처리 전에 실행됩니다.");
        return true; // true: 컨트롤러 실행 계속 / false: 요청 중단
    }

    @Override
    public void postHandle(HttpServletRequest request, 
    					   HttpServletResponse response, 
                           Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle: 컨트롤러 실행 후 실행됩니다.");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, 
    							HttpServletResponse response, 
                                Object handler, 
                                Exception ex) throws Exception {
        System.out.println("afterCompletion: 요청 처리가 끝난 후 실행됩니다.");
    }
}

Interceptor 등록

  • Interceptor를 Spring에서 사용하려면 WebMvcConfigurer를 구현해 등록해야 한다.
@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor()) // 인터셉터 등록
                .addPathPatterns("/api/**")  // 특정 패턴의 요청만 적용
                .excludePathPatterns("/api/public/**"); // 특정 경로 제외 가능
    }
}

그런데 JSON 응답을 주는 @RestController에서는 어떻게 동작할까?

  • 위에서 설명한 HandlerInterceptor의 주요 메서드의 동작은 view를 기반으로 동작
  • 그럼 JSON 응답을 내려주는 @RestController에서는 어떻게 동작할지 궁금하다 ..!

@RestController에서 Interceptor의 동작

  • @RestController를 사용하는 경우, View를 렌더링하지 않고 JSON 데이터를 직접 반환하므로
    인터셉터의 동작 방식도 조금 달리진다.

✨ Rest API에서는 ViewResolver없이 JSON을 바로 응답을 반환한다.

1. preHandle()

  • 컨트롤러 실행 전에 호출

2. postHandle()

  • 컨트롤러 실행 후, JSON 응답이 생성된 후 호출
  • 이 때 ModelAndViewnull

3. afterCompletion()

  • 응답이 클라이언트에게 전달된 후에 호출

💡postHandle()ViewResolver 없이 실행되는 점만 다르고, 나머지는 동일하게 동작한다.

profile
"개발자는 해결사이자 발견자이다✨" - Michael C. Feathers

0개의 댓글