Spring Boot 게시판 구현하기 7 (인터셉터 사용하기)
'[책] 스프링부트 시작하기 (김인우)'를 공부하면서 적은 내용입니다.
인터셉터 사용하기
스프링의 인터셉터는 어떠한 URI을 호출했을 때 해당 요청의 컨트롤러가 처리되기 전 또는 후에 작업을 하기 위해 사용된다. 이러한 역할은 필터(Filter)와 인터셉터(Interceptor)로 수행할 수 있다.
필터는 디스패처 서블릿 앞 단에서 동작하지만, 인터셉터는 디스패처 서블릿에서 컨트롤러로 가기 전에 동작합니다.
필터와 달리 인터셉터는 스프링 빈을 사용할 수 있습니다.
HandlerInterceptorAdapter로 인터셉터 구현하기
Spring에서 인터셉터는 HandlerInterceptorAdapter 클래스를 상속받아 구현할 수 있다.
메소드 | 역활 |
preHandle | 컨트롤러 실행 전에 수행 |
postHandle | 컨트롤러 수행 후 결과를 뷰로 보내기 전에 수행 |
afterCompletion | 뷰의 작업까지 완료된 후 수행 |
com/insight/board 패키지 아래에 interceptor 패키지를 생성하고 LoggerInterceptor 클래스를 생성합니다.
LoggerInterceptor.java
package com.insight.board.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Slf4j
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());
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.debug("==================== END ====================");
}
}
public boolean preHandle() : 컨트롤러가 수행 되기 전 수행
public void postHandle() : 컨트롤러가 정상적으로 실행 된 후 수행
Interceptor 등록하기
앞서 만든 LoggerInterceptor를 스프링 빈으로 등록해보겠습니다.
configuration 패키지 안에 WebMvcConfiguration 클래스를 생성하고 아래 내용을 작성합니다.
WebMvcConfiguration.java
package com.insight.board.configuration;
import com.insight.board.interceptor.LoggerInterceptor;
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 WebMvcConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggerInterceptor());
}
}
registry.addInterceptor(new LoggerInterceptor()) : 인터셉터를 등록
addPathPatterns() 와 excludePathPatterns() 메소드를 이용하여 요청 주소의 패턴과 제외할 요청 주소의 패턴을 지정하여 선택적으로 적용할 수도 있습니다.
여기서는 모든 요청에 대해 인터셉터를 적용하므로 따로 패턴 적용하지 않았다.