본문 바로가기
IT/Java

SpringBoot 인터셉터(Interceptor) 란?

by 성준하이 2023. 9. 5.
반응형

Interceptor라고 하면 순수 뜻은 낚아채다라는 의미를 갖고 있는데,

스프링 내에서도 비슷한 의미로 동작을 한다.

 

특정 서비스가 돌기 전이나 후에 서비스를 낚아채서 그 순간 특정 작업을 넣을수 있다.

예를 들어 페이지 이동할 경우마다 로그를 찍거나,

페이지 이동마다 로그인이 되어있는지 체크 등 기능을 하기 위해서 주로 사용하곤 한다.

 

비슷하게 Spring 기능 중에 AOP라고 존재하는데 인터셉터의 기능을 좀더 발전 시켰다고 생각하면 된다.

AOP에 관해서는 아래 참고 포스팅 참고 바란다.

 

그럼 먼저 그림을 보면서 Interceptor가 언제 작동하는지 확인해보면

스프링 영역 중간에 자리잡고있다.

 

간단하게 request와 response의 흐름을 얘기하면 

요청이 들어오면 프론트컨트롤러인 디스패쳐 서블릿이 먼저 어느서비스를 호출할지 넘겨주고 넘겨 주기전에 interceptor에서 중간 작업을 하고 controller로 요청을 넘겨준다.

 

그림에는 나와있지 않지만 interceptor와 controller사이에 AOP가 존재하다고 생각을 해보면

 

요청이 들어오고 디스패쳐서블릿이 서비스 호출을 도와주면서 먼저 interceptor를 통해서 낚아채지고 AOP기능이 돌고 controller까지 도달하게 된다.

response로 돌아오는 역방향 역시 반대로 생각하면 편하다.

 

그럼 예시 코드를 보면 

아무 API 서비스를 하나 구현해두고,

HandlerInterceptor를 받는 Interceptor 클래스 하나,

이 Interceptor를 등록할 WebMvcConfigurer를 상속받는 config파일 하나가 필요하다.

 

Intercepter.Java

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;


import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


@Component
public class Intercepter implements HandlerInterceptor{


@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
String requestURI = request.getRequestURI();
System.out.println("[interceptor] requestURI : " + requestURI);

return true; 
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("[interceptor] postHandle");
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("[interceptor] afterCompletion");
}
}

 

WebMvcConfig.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class WebMvcConfig implements WebMvcConfigurer {


    @Autowired
    Intercepter apiInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(apiInterceptor)
                .addPathPatterns("/**") // 해당 경로에 접근하기 전에 인터셉터가 가로챈다.
                .excludePathPatterns("/tests"); // 해당 경로는 인터셉터가 가로채지 않는다.
    }
}

 

코드에 주석으로도 적혀있지만 특정 url은 가능하고 특정 url은 불가능하도록 지정하려면 addpath와 excludepath를 잘 사용하면 된다.


참고 포스팅

https://thenicesj.tistory.com/144

 

Spring 에서 IOC, AOP, DI 에 대하여

이번 포스팅에서는 SPRING의 핵심요소인 IOC, AOP, DI에 대해서 다뤄볼 것이다. 다른 특징들도 많지만 이 세가지는 스프링의 장점으로 많이 알려져있다. 하나씩 다뤄보도록 해보자. IOC(Inversion of Contro

thenicesj.tistory.com

https://thenicesj.tistory.com/564

 

springboot AOP 설정하기

자바에서 aop 에 대해서 이전 포스팅에서 다룬 글이 있다. 자세한 사항은 아래 참고 포스팅 참고 바란다. 이번 포스팅에서는 springboot 에 aop 설정하는법에 대해서 다뤄 볼것이다. 개발 환경 springboo

thenicesj.tistory.com

 

반응형

댓글