스프링 인터셉터는 서블릿 필터와 마찬가지로 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다.
공통 관심 사항이란 로그인을 해야 서비스를 이용할 수 있는 대부분의 웹 서비스에서 로그인을 하지 않은 사용자의 접근을 제한하기위해 모든 컨트롤러 로직에 로그인 여부를 확인하는 코드를 작성하는 비효율적 행위를 막아햐한다.
이렇게 많은 로직에서 공통으로 관심이 있는 부분을 공통 관심사라 한다.
스프링 인터셉터의 흐름
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러
스프링 인터셉터는 스프링 MVC가 제공하는 기능이다. 때문에 디스패처 서블릿 이후에 등장하게 된다.
스프링 인터셉터에 URL 패턴을 매우 정밀하게 적용할 수 있다.
스프링 인터셉터 제한
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 (로그인 사용자)
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 (비 로그인 사용자)
인터셉터에서 적절하지 않은 요청이라고 판단하면 거기서 끝을 낼 수 있다.
스프링 인터셉터 체인
HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 컨트롤러
스프링 필터와 마찬가지로 스프링 인터셉터도 체인으로 구성된다. 그래서 중간에 인터셉터를 자유롭게 추가할 수 있다.
예를 들어서 로그를 남기는 인터셉터를 먼저 적용하고, 그 다음에 로그인 여부를 체크하는 인터셉터를 만들 수 있다.
스프링 인터셉터 인터페이스
스프링의 인터셉터를 사용하려면 HandlerInterceptor인터페이스를 구현하면 된다.
public interface HandelrInterceptor{
default boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception{}
default boolean postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, @Nullable ModelAndView modelAndView) throws Exception{}
default boolean afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, @Nullable Exception ex) throws Exception{}
}
서블릿 필터의 경우 단순하게 doFilter()하나만 제공된다. 인터셉터는 컨트롤러 호출 전(preHandle), 호출 후(postHandle), 요청 완료 이후(afterCompletion)와 같이 단계적으로 잘 세분화 되어 있다.
서블릿 필터의 경우 단순히 request, response만 제공했지만, 인터셉터는 어떤 컨트롤러(handler)가 호출되는지 호출 정보도 받을 수 있다. 그리고 어떤 modelAndView가 반환되는지 응답 정보도 받을 수 있다.
인터셉터의 흐름에서 봤듯이 디스패처 서블릿에서 preHandle를 컨트롤러 호출 전에 호출한다.
preHandle의 응답값이 true이면 다음으로 진행하고, false이면 더는 진행하지 않는다. false인 경우 나머지 인터셉터는 물론이고, 핸들러 어댑터도 호출되지 않는다. 그림에서 보면 1번에서 끝이 나는 것이다.
그 다음은 서블릿이 컨트롤러에 접근하고 난 다음 postHandle을 호출한다.
그리고 view를 내보낸 후 afterCompletion을 호출한다.
예외가 발생하면 postHandle은 호출되지 않는다.
반면에 afterCompletion은 항상 호출된다. 이 경우 예외(ex)를 파라미터로 받아서 어떤 예외인지 로그로 출력할 수 있다.
인터셉터는 스프링 MVC 구조에 특화된 필터 기능을 제공한다고 이해하면 된다. 스프링 MVC를 사용하고, 특별히 필터를 꼭 사용해야 하는 상황이 아니면 인터셉터를 이용하는 것이 편리하다.
'Spring' 카테고리의 다른 글
오류화면 보여주기 (0) | 2023.08.03 |
---|---|
스프링 인터셉터 - 요청 로그 (0) | 2023.08.03 |
오류 메시지 처리(2) (0) | 2023.07.14 |
오류 메시지 처리 (0) | 2023.07.14 |
검증 - Validation (0) | 2023.07.04 |