필터(Filter)란?
필터 개념
필터는 Dispatcher Servlet에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다.
Dispatcher Servlet은 스프링 가장 앞단에 존재하는 프론트 컨트롤러(Front Controller)라고도 한다. 즉 필터는 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리가 된다. (스프링 범위 밖에서 처리)
필터 구조
필터 메소드
필터를 추가하하기 위해서 Filter 인터페이스를 구현해야한다. (implements)
이때 3가지 메소드를 구현한다,
- init()
- doFilter()
- destroy()
1) init()
init 메소드는 필터 객체를 초기화하고 서비스에 추가하기 위한 메소드이다. 웹 컨테이너가 1회 init 메소드를 호출하여 필터 객체를 초기화하면 이후 요청을 doFilter를 통해 처리된다.
2) doFilter()
doFilter 메소드는 url 패턴에 맞는 모든 http 요청이 디스패처 서블릿을 전달되기 전에 웹 컨테이너에 의해 실행되는 메소드입니다.
doFilter의 파라미터로 FilterChain이 있는데 FilterChain의 doFilter를 통해 다음 대상으로 요청을 전달하게 됩니다.
chain.doFilter() 전/후에 원하는 로직을 넣어주어 처리할 수 있습니다.
3) destory()
필터 객체를 서비스에서 제거하고 사용하는 자원을 반환하기위한 메소드로 웹 컨테이너에 의해 1번 호출되며 이후에는 doFilter에 의해 처리되지 않습니다.
인터셉터(Interceptor)란?
인터셉트 개념
인터셉터(Interceptor)는 필터와 달리 스프링이 제공하는 기술로 디스패처 서블릿(Dispathcer Servelet)이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다. 즉 웹 컨테이너에서 동작하는 필터와 다르게 인터셉터는 스프링 컨텍스트 내부에서 동작한다.
인터셉트 구조
인터셉터 메소드
인터셉터를 추가하기 위해서 HandlerInterceptor 인터페이스를 구현(Implements)해야 한다.
이는 아래와 같은 3가지 메소드를 가지고있다.
- preHandle()
- postHandle()
- afterCompletion()
1) preHandle()
클라이언트 요청을 컨트롤러에 전달하기 전에 호출합니다. 따라서 컨트롤러 이전에 처리해야하는 전처리 작업이나 요청 정보를 가공, 추가하는 경우 사용합니다.
preHandle의 3번째 파라미터인 handler 파라미터는 핸들러 매핑이 찾아준 컨트롤러 빈에 매핑되는 HandlerMethod라는 새로운 타입의 객체로 @RequestMapping이 붙은 메소드 정보를 추상화한 객체입니다.
preHadle의 리턴 타입은 boolean 타입으로 return 값이 true이면 다음 단계로 진행, false라면 작업을 중단하여 이후의 작업 (다음 인터셉터 또는 컨트롤러)은 진행되지 않습니다.
2) postHandle()
클라이언트의 요청을 처리한 후 view에 응답을 전달하기 전에 호출합니다. 따라서 컨트롤러 이후에 처리해야하는 후처리 작업에 사용됩니다.
이 메소드에 컨트롤러가 반환하는 ModelAndView 타입의 정보가 제공되는데 최근에는 Json 형태로 데이터를 제공하는@RestController를 사용하여 자주 사용되진 않습니다.
3) afterCompletion()
클라이언트의 요청을 처리한 후페 view에 응답을 전달한 후 호출합니다. 즉 모든 뷰에서 최종 결과를 생성하는 일을 포함해 모든 작업이 완료된 후 실행됩니다. 요청 처리 중에 사용한 리소스를 반환할 때 사용합니다. postHandler와 다르게 컨트롤러 하위 계층에서 작업을 진행하다가 중간에 예외가 발생해도 afterCompletion은 반드시 호출됩니다.
4) afterConcurrentHandlingStarted
비동기 요청 시 호출되는 메소드로, 비동기 요청 시 postHandle, afterCompletion은 호출되지 않습니다.
📍요약
대상 | 필터 | 인터셉터 |
관리되는 컨테이너 | 웹 컨테이너 | 스프링 컨테이너 |
Requeset/Response 조작 가능 여부 | O | X |
용도 | - 보안 관련 공통 작업 - 모든 요청에 대한 로깅 또는 감사 - 이미지/데이터 압축 및 문자열 인코딩 |
- 인증/인가 같은 공통 작업 - Controller 로 넘겨주는 정보의 가공 - API 호출에대한 로깅 또는 감사 |
'스터디 > Spring' 카테고리의 다른 글
[Spring] 스프링 @MockBean, @SpyBean (0) | 2023.03.12 |
---|---|
[Spring] 스프링 캐시 알아보기 (@Cacheable, @CachePut, @CacheEvict) (0) | 2023.03.12 |
[Spring] @ResponseBody와 @ModelAttribute 차이점 (0) | 2021.08.17 |
[Spring] @NotNull @NotEmpty @NotBlank 차이점 (0) | 2021.08.17 |
[Spring] 싱글톤 패턴 (Singleton pattern) (0) | 2021.08.17 |
댓글