[퍼비톡] 인터셉터 및 필터

xyzw·2023년 9월 9일
0

Spring

목록 보기
22/22

필터

필터란?

  • J2EE 표준 스펙

  • javax.servlet 패키지 안에 있는 필터 인터페이스

  • Servlet API 2.3부터 등장

  • Dispatcher Servlet에 요청이 전달되기 전후에 부가작업을 처리하는 객체

Dispatcher Servlet

  • 스프링의 가장 앞단에 존재하는 프론트 컨트롤러

  • 동작 과정
    클라이언트로부터 어떤 요청이 왔을 때, 디스패처 서블릿이 가장 먼저 받는다. 그리고 디스패처 서블릿이 공통적인 작업을 먼저 처리한 후에 해당 요청을 처리해야 하는 컨트롤러를 찾아서 위임한다.

필터의 메서드

✔️init

  • 필터 객체를 초기화하고 서비스에 추가하기 위한 메소드

  • default 메소드로, 선택적으로 오버라이딩 가능

  • 필터가 생성될 때 웹 컨테이너에 의해 1회 호출

✔️doFilter

image
  • 필터링이 이루어지는 메소드

  • 오버라이딩 필수

  • 지정한 URL 패턴에 맞는 HTTP 요청이 들어올 때마다 호출

  • Dispatcher Servlet으로 전달되기 전에 웹 컨테이너에 의해 실행

  • 파라미터로 FilterChain 객체를 받음

FilterChain

image
  • 필터가 여러개 모여 형성된 체인

  • 마지막에 FilterChain의 doFilter 메서드 호출
    -> 다음 개체로 요청 및 응답을 전달
    -> 체인을 통과할 때마다 컨테이너에 의해 호출되어 필터가 연속적으로 수행됨

✔️destroy

  • 필터 객체를 서비스에서 제거하고 사용한 자원을 반환하기 위한 메소드

  • default 메소드로, 선택적으로 오버라이딩 가능

  • 필터가 소멸될 때 웹 컨테이너에 의해 1회 호출




인터셉터

인터셉터란?

  • Spring이 제공하는 기술

  • org.springframework.web.servlet 패키지 안에 있는 인터페이스 HandlerInterceptor

  • Dispatcher Servlet이 컨트롤러를 호출하기 전후에 요청과 응답을 참조하거나 가공
    디스패처 서블릿은 핸들러 매핑을 통해 적절한 컨트롤러를 찾도록 요청하는데, 그 결과로 실행 체인(HandlerExecutionChain)을 돌려준다. 이 실행 체인은 1개 이상의 인터셉터가 등록되어 있다면 순차적으로 인터셉터들을 거쳐 컨트롤러가 실행되도록 하고, 인터셉터가 없다면 바로 컨트롤러를 실행한다.

인터셉터의 메서드

✔️preHandle

  • 컨트롤러가 호출되기 전 실행

  • 컨트롤러 이전에 처리해야 하는 작업에 사용

  • default 메소드로, 선택적으로 오버라이딩 가능

  • 리턴 타입은 Boolean
    true -> 다음 단계 진행
    false -> 작업 중단

✔️postHandle

  • 컨트롤러가 호출된 후 실행

  • 컨트롤러 이후에 처리해야 하는 작업에 사용

  • default 메소드로, 선택적으로 오버라이딩 가능

  • 컨트롤러 하위 계층에서 예외가 발생하면 호출되지 않음

✔️afterCompletion

  • 모든 작업이 완료된 후 실행

  • 요청 처리 중에 사용한 리소스를 반환할 때 사용

  • default 메소드로, 선택적으로 오버라이딩 가능

  • 컨트롤러 하위 계층에서 예외가 발생해도 반드시 호출됨





필터와 인터셉터 차이

필터인터셉터
관리되는 컨테이너서블릿 컨테이너스프링 컨테이너
스프링의 예외처리 여부XO
Request/Response 객체 조작 가능 여부OX
용도- Spring과 분리되어야 하는 기능
- 공통된 보안 및 인증/인가 처리
- 세부적인 보안 및 인증/인가 처리
- Controller로 넘겨주는 정보의 가공

필터

  1. 관리되는 컨테이너
    필터는 J2EE 표준 스펙으로, 서블릿 컨테이너가 관리

  2. 스프링 예외처리 여부
    스프링이 제공하는 기술이 아니므로 스프링 예외처리 불가

  3. Request/Response 객체 조작 가능 여부
    필터 사용 시 doFilter 메서드에 파라미터로 request와 response 객체를 넘겨주기 때문에, 개발자가 원하는 객체로 조작 가능

  4. 용도
    필터는 주로 스프링과 무관하게 전역적으로 처리해야 하는 작업에 사용됨

인터셉터

  1. 관리되는 컨테이너
    인터셉터는 스프링이 제공하는 기술로, 스프링 컨테이너가 관리

  2. 스프링 예외처리 여부
    스프링이 제공하는 기술이므로 스프링 예외처리 가능

  3. Request/Response 객체 조작 가능 여부
    인터셉터는 true 또는 false를 반환하므로 Request/Response 객체 조작 불가

  4. 용도
    인터셉터는 클라이언트의 요청과 관련되어 전역적으로 처리해야 하는 작업에 사용됨





필터와 인터셉터의 흐름

필터의 흐름

⭕적절한 요청

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

0개의 댓글