보물창고 블로그

Spring Interceptor 파헤치기 본문

웹 개발/Computer Science Note

Spring Interceptor 파헤치기

홋 메 2025. 5. 11. 10:13
728x90

Spring Interceptor에 대해 알아보겠습니다.

✅ 인터셉터란?

HTTP 요청이 컨트롤러(Handler)로 도달하기 전과 후에 실행되는 객체

스프링 MVC가 제공하는 기능이며, 공통 처리 로직을 삽입할 수 있습니다.

주로 인증/인가 처리나 로깅/모니터링 처리, 요청 헤더 검사에 사용합니다.

 

✅ 인터셉터 호출 흐름

스프링 인터셉터 호출 흐름도

스프링 인터셉터 호출의 흐름도 입니다.

1

 

✅ 인터셉터 구조

인터셉터는 HandlerInterceptor 인터페이스를 구현하여 작성합니다.

@Component
public class MyInterceptor implements HandlerInterceptor {

    // 컨트롤러 실행 전에 호출
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("preHandle 실행");
        return 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 실행");
    }
}

 

  • preHandle : 컨트롤러 호출 전에 호출됩니다. (더 정확히는 핸들러 어댑터 호출 전에 호출됩니다.)
  • preHandle의 응답값이 `true` 이면 다음으로 진행하고, `false` 이면 더는 진행하지 않습니다. `false` 인
  • 경우 나머지 인터셉터는 물론이고, 핸들러 어댑터도 호출되지 않습니다. 
  • postHandle : 컨트롤러 호출 후에 호출됩니다. (더 정확히는 핸들러 어댑터 호출 후에 호출됩니다.)
  • afterCompletion : 뷰가 렌더링 된 이후에 호출됩니다.

서블릿 필터의 경우 단순하게 `doFilter()` 하나만 제공됩니다. 반면에 인터셉터는 컨트롤러 호출 (`preHandle` ), (`postHandle` ), 요청 완료 이후(`afterCompletion` ) 같이 단계적으로 세분화 되어 있습니다.

서블릿 필터의 경우 단순히 `request` , `response` 제공했지만, 인터셉터는 어떤 컨트롤러(`handler` ) 호출되는지 호출 정보도 받을 있습니다. 그리고 어떤 `modelAndView` 반환되는지 응답 정보도 받을 있습니다.

 

다음으로는 인터셉터를 스프링 빈에 등록하는 방법에 대해서 알아보겠습니다.

 

 

WebMvcConfigurer에서 등록

@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final MyInterceptor myInterceptor;

    // 생성자 주입
    public WebConfig(MyInterceptor myInterceptor) {
        this.myInterceptor = myInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/api/**")   // 적용 경로
                .excludePathPatterns("/api/public/**"); // 제외 경로
    }
}

 

 

.addPathPatterns, .excludePathPatterns 메서드를 사용하여 적용할 url , 제외할 url 경로를 설정할 수 있습니다.

 

다음으로 스프링 인터셉터 예외에 대해 알아보겠습니다.

 

스프링 인터셉터 예외

 

예외가 발생시

  • `preHandle` : 컨트롤러 호출 전에 호출됩니다.
  • `postHandle` : 컨트롤러에서 예외가 발생하면 `postHandle` 은 호출되지 않습니다.
  • `afterCompletion` : `afterCompletion` 은 항상 호출됩니다. 이 경우 예외(`ex` )를 파라미터로 받아서 어떤 예외가 발생했는지 로그로 출력할 수 있습니다. afterCompletion은 예외가 발생해도 호출됩니다. 예외가 발생하면 `postHandle()` 는 호출되지 않으므로 예외와 무관하게 공통 처리를 하려면 `afterCompletion()` 을 사용해야 합니다. 예외가 발생하면 `afterCompletion()` 에 예외 정보(`ex` )를 포함해서 호출됩니다.

 

정리해보자면, 인터셉터는 스프링 MVC 구조에 특화된 필터 기능을 제공한다고 이해하면 됩니. 스프링 MVC 사용하고, 특별히 필터를 사용해야 하는 상황이 아니라면 인터셉터를 사용하는 것이 편리합니다.

 

1. [스프링 공식 문서 - HandlerInterceptor]

(https://docs.spring.io/springframework/docs/current/javadocapi/org/springframework/web/servlet/HandlerInterceptor.html)
2. [스프링 MVC 2편- 백엔드 웹 개발 활용 기술](https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2)

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 강의 | 김영한 - 인프런

김영한 | , 원리를 알아야 핵심이 보인다!김영한의 스프링 MVC 활용편 👨‍💻 📌 수강 전 확인해주세요! 본 강의는 자바 스프링 완전 정복 시리즈의 다섯 번째 강의입니다. 우아한형제들 최연소

www.inflearn.com

 

'웹 개발 > Computer Science Note' 카테고리의 다른 글

CORS(Cross-Origin Resource Sharing) 파헤치기  (1) 2025.05.18
Spring filter 파헤치기  (0) 2025.05.10
JWT 파해치기  (0) 2025.05.03
Oauth 파헤치기  (1) 2025.05.02
Comments