[Spring] 서블릿 필터 / 스프링 인터셉터

📝 Spring
🖥️ 1. 서블릿 필터
1-1. 필터
- hTTP 요청 → WAS → 필터 → 서블릿 → 컨트롤러 → ...
1-2. 필터 체인
- HTTP 요청 -> WAS -> 필터1 -> 필터2 -> 필터3 -> ...
- 필터는 체인으로 구성되는데, 중간에 필터를 자유롭게 추가할 수 있다. 예를 들어서 로그를 남기는 필터를 먼저 적용하고, 그 다음에 로그인 여부를 체크하는 필터를 만들 수 있다.
1-3. 필터 구현
- 필터 인터페이스를 구현하고 등록하면 서블릿 컨테이너가 필터를 싱글톤 객체로 생성하고 관리한다.
init() : 필터 초기화 메서드, 서블릿 컨테이너가 생성될 때 호출된다.
doFilter() : 고객의 요청이 올 때마다 해당 메서드가 호출된다. 필터의 로직을 구현하면 된다.
destroy() : 필터 종료 메서드, 서블릿 컨테이너가 종료될 때 호출된다.
🖥️ 2. 스프링 인터셉터
2-1. 인터셉터란
- 스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다.
- 서블릿 필터가 서블릿이 제공하는 기술이라면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다. 둘다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용 방법이 다르다.

2-2. 스프링 인터셉터 흐름
- HTTP 요청 → WAS → 필터 → 서블릿 → 스프링 인터셉터 → 컨트롤러
- 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출된다.
- 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다.
- 스프링 MVC의 시작점이 디스패처 서블릿이라고 생각하면 이해가 빠르다.
- 스프링 인터셉터에도 URL 패턴을 적용할 수 있는데, 서블릿 URL 패턴과는 다르고 매우 정밀하게 설정할 수 있다.

2-3. 스프링 인터셉터 체인
- HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 컨트롤러
- 스프링 인터셉터는 체인으로 구성되는데 중간에 인터셉터를 자유롭게 추가할 수 있다.
- 스프링 인터셉터는 서블릿 필터보다 편리하고, 더 정교하고 다양한 기능을 지원한다.
2-4. 인터셉터 인터페이스
- HandlerInterceptor 인터페이스를 구현
- 서블릿 필터의 경우 단순하게 doFilter() 하나만 제공된다. 인터셉터는 호출 전 (preHandle), 호출 후 (postHandle), 요청 완료 이후 (afterCompletion) 같이 단계적으로 잘 세분화 되어있다.
- 서블릿 필터의 경우 단순히 request, response만 제공했지만, 인터셉터는 어떤 컨트롤러가 호출되는지 호출 정보도 받을 수 있다.
2-5. addPathPatterns("...")
- 2개의 페이지에 대해 중복하여 interceptor를 쓰려면 addPathPatterns("/sub1/test1", "/sub1/test2")를 사용한다.
- 1개의 "어떠한" 경로에 상관 없이 쓰려면 addPathPatterns("/*")를 사용한다.
- 1개를 넘어서서 몇 개의 어디든지의 경로에 추가하고 싶을 경우 addPathPatterns("/**")를 사용한다.