Interceptor & Filter

김수혁·2023년 12월 23일

Spring

목록 보기
1/4

Filter



Filter는 요청과 응답을 거른 뒤 정제하는 역할을 하며 Spring에서 Filter는 Dispatcher Servlet 전후에 실행된다.

Filter는 FilterChain을 통해 여러 필터가 연쇄적으로 동작 가능하게 한다.

어디에 사용하는가

주로 요청에 대한 인증, 권한 체크에 사용한다.
예를 들어 요청이 Dispatcher Servlet으로 전달되기 전 헤더를 검사하여 인증 토큰이 있는지, 혹은 올바른 인증 토큰인지 검사할 수 있다.

사용 방법

3가지의 메소드를 이용해서 사용한다.

  1. init() : 필터가 생성될 때 수행되는 메소드
  2. doFilter() : Request, Response가 필터를 거칠 때 수행되는 메소드
  3. destroy() : 필터가 소멸될 때 수행되는 메소드

Interceptor


정의

스프링 MVC 프레임워크에서 HTTP 요청을 가로채어 처리하는
컴포넌트이다. 클라이언트의 요청이 컨트롤러로 전달되기 전에 사전 작업을 수행하거나, 컨트롤러의 실행 이후에 사후 작업을 수행할 수 있다.

  • 서버에 들어온 Request 객체를 컨트롤러의 핸들러로 도달하기 전 낚아채 개발자가 원하는 추가적인 작업 이후 핸들러로 보낼 수 있도록 해주는 것
사용 이유

개발자가 특정 컨트롤러의 핸들러가 실행되기 전후에 추가적인 작업을 원할 때 사용
이를 통해 코드 중복을 줄이고 관심사를 분리하여 핵심 비즈니스 로직에 집중이 가능

특징

1. 전역적인 작업 처리
스프링 인터셉터는 여러 컨트롤러에서 공통으로 처리해야 하는 작업을 중앙에서 관리 가능
ex) 인증, 권한 검사와 같은 전역 작업을 인터셉터에서 처리 가능

2. 요청 처리 제어
HTTP 요청 전후 처리 흐름을 제어 가능
클라이언트의 요청이 컨트롤러에 도달하기 전에 사전 작업을 수행하거나 컨트롤러 실행 이후 사후 작업을 수행하는 것과 같은 제어가 가능

3. 유연한 설정
XML, 어노테이션, JavaConfig 등의 설정 방법을 사용하여 인터셉터를 등록하고 관리 가능

4. 다양한 용도에 활용 가능
인증, 권한 검사, 로깅, 트랜잭션 관리 뿐 아니라 요청 처리의 어떤 단계에서든 원하는 작업을 수행할 수 있어 다양한 용도로 활용 가능
ex) 캐싱, 데이터 변환, 압축같은 것도 가능

5. 다중 인터셉터 지원
스프링이 다중 인터셉터를 지원하여 여러 개의 인터셉터를 등록하고 순차적으로 실행 가능
이를 통해 여러 개의 인터셉터가 각자의 작업 수행 후 결과를 조합하여 최종 처리 가능

작동 순서
  1. HandlerMapping 검색
  2. Interceptor 체인 생성
  3. PreHandle 매서드 호출
  4. 컨트롤러 호출
  5. PostHandle 메서드 호출
  6. View 렌더링 및 응답
  7. AfterCompletion 메서드 호출

HandlerInterceptor 인터페이스

  • preHandle() : 컨트롤러 실행 전 호출되는 메서드
    요청을 가로채고 사전 작업을 수행 가능
  • postHandle() : 컨트롤러 실행 이후 호출되는 메서드
    컨트롤러의 실행 결과에 대한 후처리 작업 수행 가능
  • afterCompletion() : 뷰 렌더링 완료 후 호출되는 메서드
장점

1. 중앙 집중적인 공통 기능 관리
로그인 체크, 권한 검사와 같은 공통적인 기능을 중앙에서 관리 가능
2. 재사용성과 확장성
여러 컨트롤러에 적용될 수 있으며 Interceptor 체인을 구성하여 여러 개의 Interceptor를 조합 가능
3. 요청 처리 과정 제어
요청 전(preHandle)과 후(postHandle)에 실행되는 메서드를 제공하여 요청 처리 과정을 세밀하게 제어 가능
4. 전역 예외 처리
Interceptor를 사용하면 예외 처리를 중앙에서 처리 가능하다
이를 통해 일관된 방식으로 예외를 처리하고 사용자에게 적절한 응답을 보내는 것이 가능

단점

1. 성능 영향
인터셉터가 요청과 응답 사이에 위치하므로 요청마다 인터셉터 체인이 실행되어야 한다.
이 때문에 인터셉터가 너무 많은 경우 성능에 영향을 줄 수 있다.
2. 컨트롤러와의 결합도
인터셉터는 컨트롤러와 긴밀하게 결합되어 있어 컨트롤러 변경 시 인터셉터도 변경 될 수 있다.
3. 작업의 순서와 조건 제어
조건 제어와 실행 순서를 올바르게 설정해줘야 한다.
4. 제한된 범위
웹 애플리케이션에서만 적용 가능하고 다른 종류의 요청이나 서비스에는 사용 불가

필터와 인터셉터의 차이

  • Filter는 Servlet 컨테이너, Interceptor는 스프링 컨테이너에서 관리된다.
  • Filter의 경우 스프링 예외처리가 안되어있고 인터셉터는 되어있다.
  • Filter의 경우 Request와 Response 객체 조작이 가능하지만, Interceptor는 불가하다.
  • Filter의 경우 공통 보안, 모든 요청에 대한 로깅 또는 감사, 이미지/데이터 압축 및 문자열 인코딩, Spring과 분리되어야 하는 기능에서 사용하고 Interceptor의 경우 세부적인 보안, API 호출에 대한 로깅 또는 감사, Controller로 넘겨주는 정보 가공 시 사용한다
profile
안녕안녕안녕

0개의 댓글