그라가승훈
[SpringBoot] - 인터셉터(Interceptor) 본문
- 인터셉터(Interceptor)
Spring의 인터셉터는 어떠한 URI를 호출했을 때 해당 요청의 컨트롤러가 처리되기 전 또는 후에 작업을 하기 위해서 사용한다. 이러한 역할은 필터와 인터셉터로 수행할 수 있다. 둘의 차이를 알아보자.
1. 필터와 인터셉터의 차이
- 필터는 디스패처 서블릿 앞 단에서 동작하지만 인터세터는 디스패처 서블릿에서 핸들러 컨트롤러로 가기 전에 동작
- 필터는 J2EE 표준 스펙에 있는 서블릿의 기능 중 일부, 인터셉터는 스프링 프레임워크에서 제공되는 기능. 따라서 필터와 달리 인터셉터는 스프링 빈을 사용할 수 있다.
- 일반적으로 문자열 인코딩과 같은 웹 전반에서 사용되는 기능은 필터로 구현, 클라이언트의 요청과 관련이 있는 여러가지 처리(로그인, 인증, 권한 등)는 인터세터로 처리한다.
2. 인터셉터(Interceptor) 구현
- 스프링에서 인터셉터는 HandlerInterceptorAdapter 클래스를 상속받아서 구현한다.
- spring 5.3 이상에서는 HandlerInterceptor 를 implements 하는 것으로 변경!
- HandlerInterceptor 가 제공하는 메서드
- preHandle : 컨트롤러 실행 전에 수행
- postHnadle : 컨트롤러 수행 후 결과를 뷰로 보내기 전에 수행.
- afterCompletion : 뷰의 작업까지 완료된 후 수행
- 시작과 끝을 보여주는 로그를 출력해주는 인터셉터를 작성
@Slf4j
// spring 5.3 이상에서는 HandlerInterceptor 를 implements 하는 것으로 변경..
// public class LoggerInterceptor extends HandlerInterceptorAdapter {
public class LoggerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
log.debug("=========================== START ==========================");
log.debug("Request URI \t : {}", request.getRequestURI());
// impl 하는 방식으로는 true 반환.
// return super.preHandle(request, response, handler);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception{
log.debug("=========================== END ==========================");
}
}
- 인터셉터 등록
스프링 3.x 버전에서는 스프링에 관련된 설정을 XML에 등록했지만, 스프링4.0 이상에서는 자바 기반의 설정을 지원한다.
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggerInterceptor());
}
}
인터셉터를 등록할 때에는 addPathPatterns() 메서드와 excludePathPatterns() 메서드를 이용하여 요청 주소의 패턴과 제외할 요청 주소의 패턴을 지정할 수 있다. 여기서는 모든 요청에 대해서 인터셉터를 적용하기 때문에 따로 지정하지 않음.
3. 로그 확인
위 로그처럼 컨트롤러의 호출이 일어나기 전, 모든 로직이 정상적으로 수행된 후에 로그가 남는것을 확인할 수 있다.
'Spring' 카테고리의 다른 글
[SpringBoot] - @ControllerAdvice 를 이용한 전역 예외처리 (0) | 2023.10.15 |
---|---|
[SpringBoot] - AOP (2) | 2023.10.15 |
[SpringBoot] -Logback 사용하기 - (Slf4j, log4jdbc, p6spy) (0) | 2023.10.13 |
[유튜브-메타코딩] - 나만의 블로그 만들기 - 13. 전형적인 방식의 로그인 방법 (0) | 2022.08.21 |
[유튜브-메타코딩] - 나만의 블로그 만들기 - 12. DB 격리 수준 (0) | 2022.08.21 |
Comments