김영한 님의 '스프링 MVC 2편 - 백엔드 웹 개발 활용 기술' 강의를 듣고 내용을 정리한 것.
(https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2#)
공통 관심사(cross-cutting concern) - 애플리케이션 여러 로직에서 공통으로 관심이 있는 것
공통 관심사는 AOP로 해결할 수 있지만, 웹에 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이
좋다고 한다.
서블릿 필터
필터 흐름
HTTP 요청 > WAS > 필터 > 서블릿(스프링의 dispatcher servlet) > 컨트롤러
제한도 걸 수 있고, 필터 여러 개를 체인 형태로 묶어 적용할 수 있다.
필터 인터페이스(javax.servlet.Filter)를 구현하고 등록하면 서블릿 컨테이너가 필터를 싱글톤 객체로 생성, 관리
서블릿 컨테이너 생성 시 init(), 클라이언트의 요청마다 doFilter(), 서블릿 컨테이너 종료될 때 destroy()
필터 등록
스프링 부트를 사용한다면 FilterRegistrationBean 사용
스프링 인터셉터
스프링 인터셉터 흐름
HTTP 요청 > WAS > 필터 > dispatcher servlet > 스프링 인터셉터 > 컨트롤러
인터셉터도 체인으로 구성이 가능하다
사용하려면 HandlerInterceptor 인터페이스를 구현하면 된다.
preHandle, postHandle, afterCompletion 세 가지를 제공하는데,
preHandle은 핸들러 어댑터 호출 전, postHandle은 컨트롤러 호출 후, afterCompletion은 뷰가 렌덜이 된 후 호출된다.
예외 발생 시에는 postHandle은 호출되지 않으며, afterCompletion의 파라미터로 제공되는 @Nullable Exception ex를
사용하여 예외를 처리할 수 있다.
인터셉터 등록
WebMvcConfigurer의 addInterceptors를 사용해서 등록
addPathPatterns, excludePathPatterns에 사용하는 PathPattern은 스프링이 제공하니
필요한 경우 공식 문서에서 예제와 사용법을 볼 수 있다.(링크)