일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Redis
- Kafka
- 삭제 이상
- 3-way handshaking
- MSA
- buildSrc
- Spring
- 캐시 오염
- 스레드 풀
- 정규화
- 자료구조
- ocp
- 낙관적 락
- AWS
- 네트워크
- gatway
- 페이지네이션
- Kotlin
- DB
- Dirty Checking
- 데이터베이스
- java
- null
- well-know port
- HTTP
- 갱신 이상
- 자바
- JPA
- 비관적 락
- 삽입 이상
Archives
- Today
- Total
어 나 갱수.
[Spring] 필터(Filter)랑 인터셉터(Interceptor) 🐻 본문
728x90
필터(Filter) 란?
필터는 말 그대로 요청과 응답을 거른 뒤 정제하는 역할을 한다.
필터(Filter)는 J2EE 표준 스펙 기능으로 디스패처 서블릿에 요청이 전달되기 전/후에 요청에 대한 부가적인 기능을 해주는 역할을 한다.
디스패처 서블릿은 스프링 가장 앞단에 위치하는 컨트롤러이므로, 필터는 스프링 범위 밖에서 작동한다.
스프링 범위 밖에서 작동하니 스프링이 관리하는 것이 아닌 톰캣과 같은 웹 컨테이너가 관리를 한다.
필터의 흐름
- 동작 과정
- HTTP 요청 → WAS → (필터) → (디스패처)서블릿 → 컨트롤러 순으로 동작한다.(스프링에선 서블릿이 디스패처 서블릿이 된다.)
- 만약 필터에서 걸러지게 된다면 디스패처 서블릿을 호출하지 않는다.
- 필터 체인
- HTTP 요청 -> WAS -> (필터1) -> (필터2) -> ... -> (디스패처) 서블릿 -> 컨트롤러
- 필터를 연속해서 추가 시킬 수 있다.
- 등록된 순서에 따라서 동작이 달라진다.
필터를 구현할 땐 javax.servlet의 Filter 인터페이스를 사용한다.
Filter 인터페이스의 구조는 다음과 같다.
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException;
public default void destroy() {}
}
- init() - 필터 인스턴스 초기화 시 실행되는 메서드
- doFilter() - 클라이언트의 요청/응답 처리 시 실행되는 메서드
- destroy() - 필터 인스턴스가 제거될 때 실행되는 메서드
인터셉터(Interceptor) 란?
인터셉터는 쉽게 말해 요청에 대한 작업 전/후로 가로챈다고 보면 된다.
인터셉터(Interceptor)는 필터와 달리 스프링에서 제공하는 기술이다.
디스페처 서블릿이 컨트롤러로 요청하기 전/후에 요청에 대한 부가적인 기능을 해주는 역할을 한다. 스프링이 제공하는 기술이기 때문에 웹 컨테이너가 관리하지 않고 스프링 컨테이너가 관리를 한다. 작동도 스프링 컨테이너에서 작동한다.
인터셉터의 흐름
- 동작 과정
- HTTP 요청 -> WAS -> 필터 -> (디스패처)서블릿 -> (인터셉터) -> 컨트롤러 순으로 동작
- 인터셉터에서 걸러지게 된다면 컨트롤러가 동작하지 않는다.
- 인터셉터 체인
- HTTP요청 -> WAS -> 필터 -> (디스패처)서블릿 -> (인터셉터 1) -> (인터셉터 2) ->... -> 컨트롤러
핸들러를 구현할때는 HandlerInterceptor를 사용한다.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
- preHandle() - preHandle 메서드는 지정된 컨트롤러의 동작 이전에 가로채는 역할로 사용합니다.
- postHandle() - 지정된 컨트롤러의 동작 이후에 처리한다.
- afterCompletion() - Dispatcherserlvet의 화면 처리(뷰)가 완료된 상태에서 처리합니다.
Reference
728x90
'Spring' 카테고리의 다른 글
[Spring] @Bean과 @Component의 차이 👏 (1) | 2023.11.13 |
---|---|
[SpringBoot] Spring Security란? 👏🏿 (0) | 2023.09.02 |
[gradle] buildSrc를 사용해보자!!😜 (0) | 2023.08.28 |
[Spring] 디스패처 서블릿(Dispatcher Servlet)이란? 👍 (1) | 2023.08.02 |
[Spring] 아직도 스프링의 3요소 모르는 사람?(DI, IOC, AOP) (0) | 2023.07.28 |