J2EE 표준 스펙
javax.servlet 패키지 안에 있는 필터 인터페이스
Servlet API 2.3부터 등장
Dispatcher Servlet에 요청이 전달되기 전후에 부가작업을 처리하는 객체
스프링의 가장 앞단에 존재하는 프론트 컨트롤러
동작 과정
클라이언트로부터 어떤 요청이 왔을 때, 디스패처 서블릿이 가장 먼저 받는다. 그리고 디스패처 서블릿이 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야 하는 컨트롤러를 찾아서 위임한다.
필터 객체를 초기화하고 서비스에 추가하기 위한 메소드
default 메소드로, 선택적으로 오버라이딩 가능
필터가 생성될 때 웹 컨테이너에 의해 1회 호출
필터링이 이루어지는 메소드
오버라이딩 필수
지정한 URL 패턴에 맞는 HTTP 요청이 들어올 때마다 호출
Dispatcher Servlet으로 전달되기 전에 웹 컨테이너에 의해 실행
파라미터로 FilterChain 객체를 받음
필터가 여러개 모여 형성된 체인
마지막에 FilterChain의 doFilter
메서드 호출
-> 다음 개체로 요청 및 응답을 전달
-> 체인을 통과할 때마다 컨테이너에 의해 호출되어 필터가 연속적으로 수행됨
필터 객체를 서비스에서 제거하고 사용한 자원을 반환하기 위한 메소드
default 메소드로, 선택적으로 오버라이딩 가능
필터가 소멸될 때 웹 컨테이너에 의해 1회 호출
Spring이 제공하는 기술
org.springframework.web.servlet 패키지 안에 있는 인터페이스 HandlerInterceptor
Dispatcher Servlet이 컨트롤러를 호출하기 전후에 요청과 응답을 참조하거나 가공
디스패처 서블릿은 핸들러 매핑을 통해 적절한 컨트롤러를 찾도록 요청하는데, 그 결과로 실행 체인(HandlerExecutionChain)을 돌려준다. 이 실행 체인은 1개 이상의 인터셉터가 등록되어 있다면 순차적으로 인터셉터들을 거쳐 컨트롤러가 실행되도록 하고, 인터셉터가 없다면 바로 컨트롤러를 실행한다.
컨트롤러가 호출되기 전 실행
컨트롤러 이전에 처리해야 하는 작업에 사용
default 메소드로, 선택적으로 오버라이딩 가능
리턴 타입은 Boolean
true -> 다음 단계 진행
false -> 작업 중단
컨트롤러가 호출된 후 실행
컨트롤러 이후에 처리해야 하는 작업에 사용
default 메소드로, 선택적으로 오버라이딩 가능
컨트롤러 하위 계층에서 예외가 발생하면 호출되지 않음
모든 작업이 완료된 후 실행
요청 처리 중에 사용한 리소스를 반환할 때 사용
default 메소드로, 선택적으로 오버라이딩 가능
컨트롤러 하위 계층에서 예외가 발생해도 반드시 호출됨
필터 | 인터셉터 | |
---|---|---|
관리되는 컨테이너 | 서블릿 컨테이너 | 스프링 컨테이너 |
스프링의 예외처리 여부 | X | O |
Request/Response 객체 조작 가능 여부 | O | X |
용도 | - Spring과 분리되어야 하는 기능 - 공통된 보안 및 인증/인가 처리 | - 세부적인 보안 및 인증/인가 처리 - Controller로 넘겨주는 정보의 가공 |
관리되는 컨테이너
필터는 J2EE 표준 스펙으로, 서블릿 컨테이너가 관리
스프링 예외처리 여부
스프링이 제공하는 기술이 아니므로 스프링 예외처리 불가
Request/Response 객체 조작 가능 여부
필터 사용 시 doFilter
메서드에 파라미터로 request와 response 객체를 넘겨주기 때문에, 개발자가 원하는 객체로 조작 가능
용도
필터는 주로 스프링과 무관하게 전역적으로 처리해야 하는 작업에 사용됨
관리되는 컨테이너
인터셉터는 스프링이 제공하는 기술로, 스프링 컨테이너가 관리
스프링 예외처리 여부
스프링이 제공하는 기술이므로 스프링 예외처리 가능
Request/Response 객체 조작 가능 여부
인터셉터는 true 또는 false를 반환하므로 Request/Response 객체 조작 불가
용도
인터셉터는 클라이언트의 요청과 관련되어 전역적으로 처리해야 하는 작업에 사용됨
HTTP 요청 -> 서버 -> 필터 1 -> 필터 2 -> 필터 3 -> 서블릿 -> 컨트롤러
HTTP 요청 -> 서버 -> 필터 -> X
HTTP 요청 -> 서버 -> 필터 -> 서블릿 -> 인터셉터 1 -> 인터셉터 2 -> 인터셉터 3 -> 컨트롤러
HTTP 요청 -> 서버 -> 필터 -> 서블릿 -> 인터셉터 -> X
참고자료
https://mangkyu.tistory.com/173
https://goddaehee.tistory.com/154
https://hoestory.tistory.com/24
https://velog.io/@hyun6ik/Servlet-Filter
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html
https://docs.oracle.com/javaee%2F6%2Fapi%2F%2F/javax/servlet/Filter.html