본문 바로가기
Java & Spring

[Spring] 인터셉터(Interceptor) 적용

by WhoamixZerOne 2022. 4. 17.

✔ Interceptor

Intercept은 (중간에) 가로막다[가로채다] 라는 의미이고, 의미와 같이 사용자가 서버로 어떠한 요청을 보낸다.
서버에서는 DispatcherServlet이 HandlerMapping을 통해 컨트롤러를 찾아 실행하기 전에, 인터셉터가 등록되어 있다면 순차적으로 인터셉터를 거쳐서 컨트롤러가 실행이 된다. 등록된 인터셉터가 없다면 바로 컨트롤러가 실행된다.
인터셉터의 정식 명칭은 HandlerInterceptor이고, HandlerInterceptor에는 3개의 메서드가 있다.

✔ Interceptor 구현

인터셉터를 구현하기 위해서는 HandlerInterceptor 인터페이스의 3개 메서드를 오버라이딩해서 사용할 수 있고,
인터셉터를 따로 등록해 줘야 한다.

@Component
public class CustomInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request,
                            HttpServletResponse response, Object handler) throws Exception {
        return false;
    }
}
@Configuration
public class MvcConfig implements WebMvcConfigurer {
    private final CustomInterceptor customInterceptor;

    public MvcConfig(CustomInterceptor customInterceptor) {
        this.customInterceptor = customInterceptor;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(customInterceptor)
                .addPathPatterns("/**")
                .excludePathPatterns("/swagger-resources/**", "/webjars/**",
                        "/v3/api-docs", "/swagger-ui/**")
                .excludePathPatterns("/member/login");
    }
}

◾ HandlerInterceptor

  • preHandler : 핸들러(controller)가 실행되기 전에 실행되며 boolean 값을 반환한다. 반환 값이 true 이면 요청한 handler를 처리하고, false 이면 처리하지 않는다.
  • postHandler : 핸들러(controller)가 실행된 후 처리된다러
  • afterCompletion : 전체 요청이 끝나고 난 후 마지막에 실행된다.

WebMvcConfigurer 인터페이스에서 addInterceptors 메서드를 오버라이딩해서 구현한 인터셉터 클래스를 registry에 등록해 준다.
addPathPatterns로 인터셉터를 허용할 패턴을 등록하고, excludePathPatterns를 통해 제외할 패턴을 등록할 수 있다.
위에선 swagger-ui에 접근할 때는 제외하도록 했고, 로그인 url일 경우 제외했다.

✔ Interceptor 구현 이유

그러면 왜 굳이 인터셉터를 구현해야 하는지, 혹은 인터셉터가 아닌 필터(Filter) 등 다른 것을 통해 구현하면 안 되는지 궁금하다.
일단 인터셉터를 구현해야 하는 이유는 세션(session), 토큰(token) 검증 처리에 대한 것으로 예를 들어보겠다.
사용자가 게시물을 등록, 수정, 삭제 등 어떠한 처리를 요청할 때마다 세션이 있는지 혹은 토큰이 정상적인지 등 검증 처리를 해야 할 것이다.
검증 처리를 서비스 처리마다 구현하게 된다면 코드의 양은 대폭 늘어날 것이고, 자원 낭비도 심할 것이다.

이러한 문제로 인터셉터를 구현하고 등록해서 세션이나 토큰 검증 처리를 하고 핸들러를 실행한다면 중복된 코드가 줄어들 수 있을 것이다.

그러면 이제 필터 등 다른 것이 아닌 인터셉터로 구현해야 하는지 알아보자.

✔ Interceptor & Filter 차이

필터(Filter)는 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 요청에 대해 부가 작업을 처리할 수 있는 기능을 제공한다.

SpringMVC life cycle

필터는 스프링 컨테이너가 아닌 톰캣 등과 같은 웹 컨테이너에 의해 관리가 된다.
위의 그림과 같이 디스패처 서블릿 전에 필터가 먼저 호출이 되고, 인터셉터는 디스패처 서블릿 이후 호출이 된다.
그래서 필터는 공통된 보안, 로깅, 이미지/데이터 압축 및 문자열 인코딩 등 스프링과 무관하게 전역적으로 처리할 때 사용하고, 인터셉터의 경우는 인증/인가 등과 같은 공통 작업, API 호출에 대한 로깅, Controller로 전달하는 데이터 가공 등과 같은 작업을 처리할 때 사용한다.

🔗 Reference

'Java & Spring' 카테고리의 다른 글

자바 정리 (1)  (0) 2024.01.22
Java 버전 관리 도구  (0) 2023.11.18
JPA @MappedSuperclass  (0) 2022.03.07
JWT Token(JSON Web Token)  (0) 2022.03.07
JUnit @Before & @After  (0) 2022.03.07

댓글