[ 스프링부트 / Spring Boot ] Interceptor
백엔드/SpringBoot

[ 스프링부트 / Spring Boot ] Interceptor

#시작하기 전..

이전 글 - [ 스프링부트 / Spring Boot ] Filter 

 

위에 글에도 언급했지만, Spring Life Cycle 에는 Filter, Interceptor, AOP, 등 많은 기능들이 존재한다.

그 중 Interceptor에 대해 이해한 것에 대해 정리를 한거라 부족한게 많을 수 있다..


1. Interceptor는 무엇인가?

Interceptor 단어 그대로 데이터를 가로채서 처리하는 영역이다. 

Interceptor는 컨트롤러에 접근하기 전 request, response를 받아 처리가 가능하다.

 

그럼 여기서 의문이 생길 수 있다.

Filter와 Interceptor는 같은 역할인 것이 아닌가?

그러나 두개는 큰 차이가 있다. 그것은 바로 스프링 컨테이너에 포함 여부다.

 

아래의 그림에서도 알 수 있듯 스프링 영역에 Interceptor는 포함이 되어있다.

그래서 Filter와 다르게 Interceptor는 스프링에 기능을 사용할 수 있다는게 큰 차이다. 

 

2. Interceptor는 어떤 용도로 사용할 수 있을까?

다양한 사용 방법이 있겠지만, 내가 써보고 경험한 경우는 2가지가 있었다.

  1. 사용자 권한 체크
    -> 특정 url에 접근하는 사용자가 로그인을 했는지, 특정 권한에 맞는 사람인지를 체크할 수 있다.
  2. Request, Response에 log 표시하기
    -> 위에서 언급한 것과 같이 Request, Response를 받을 수 있으므로 로그를 표기할 수 있다.

 

3. Interceptor 사용 방법

- Interceptor 등록 (@Slf4j는 Lombok plugin이 필요하다.)

@Slf4j
@Component
public class TestInterceptor implements HandlerInterceptor {

	//preHandle 컨트롤러에 접근 전에 실행되는 메소드
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    	String url = request.getRequestURI();
        log.info("===============================================");
        log.info("==================== BEGIN ====================");
        log.info("request url : {}", url);
        return super.preHandle(request, response, handler);
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		log.info("==================== END ======================");
		log.info("===============================================");
	}
}

- WebMvcConfigurer를 구현할 class 등록 (@RequiredArgsConstructor는 Lombok plugin이 필요하다.)

@Configuration
@RequiredArgsConstructor
public class MvcConfig implements WebMvcConfigurer {

    private final TestInterceptor testInterceptor;
    //private final SomethingInterceptor somethingInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //interceptor를 여러개 지정할 수 있다. 메소드 순서대로 실행
        
        registry.addInterceptor(testInterceptor).addPathPatterns("/api/test/*");
        //registry.addInterceptor(somethingInterceptor).addPathPatterns("/api/something/*");
    }
}

#마무리하며..

Filter와 Interceptor를 잘 몰랐을 때는 비슷하다고 생각했다.

지금 보면 얼마나 무지했는지 알 수 있다. 글을 쓰며, 스프링을 이해하지 않고 썼던 나를 반성하게 된다.

Interceptor에 대해서 좀 더 경험하고 공부해서 글을 첨삭해야 할 것 같다.

 

Filter, Interceptor, AOP를 어느 때 쓰는게 좋은지에 대해 고민이 필요하다고 느꼈다.