일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- 서블릿의 응답
- 오라클
- 톰캣9
- 서블릿 계층구조
- get방식
- 톰캣
- 내장함수
- 서블릿 동작 과정
- 숫자형
- 애너테이션
- HttpServletRequest
- NextSTEP
- HttpServletResponse
- 딕셔너리
- Python
- 웹 애플리케이션
- 자료형
- 리스트
- doHandle
- 튜플
- annotation
- POST방식
- TDD강의
- 배치
- 파이썬
- 넥스트스탭
- ORA-65096
- 서블릿 생명주기
- 서블릿
- Servlet
- Today
- Total
괴발개발 공부하는 블로그
filter, interceptor, argument resolver 의 역할과 차이 본문
로그인 처리를 하면서 servlet filter, spring interceptor, spring argument resolver 에 대해서 공부했다.
모두 공통의 관심사를 처리할 때 사용한다는 특징이 있다.
어떠한 상황에 어떤 것을 사용해야 하는지 정확히 구분하기 위해 정리해보기로 했다.
servlet filter
디스패처 서블릿에 요청이 전달되기 전 처리를 할 수 있다.
url 패턴에 맞는 모든 요청에 대해서 처리가 가능하다.
필터는 J2EE 표준 스펙 기능으로서 spring 과 분리된 기능을 처리해야할 때 사용한다. 웹 컨테이너에서 동작하기 때문에 올바르지 않은 요청일 경우 사전에 차단 가능하여 스프링 컨테이너까지의 진입이 차단되어 안정성을 높일 수 있다.
spring interceptor
컨트롤러를 호출하기 전과 후의 처리를 할 수 있다.
디스패처 서블릿은 핸들러 매핑을 통해 컨트롤러를 찾는데, 그 결과로 실행체인(HandlerExecutionChain)을 돌려준다. 이 실행 체인은 1개 이상의 인터셉터가 등록이 되어 있다면, 인터셉터를 거쳐 컨트롤러를 실행하게 한다. 인터셉터가 없다면 바로 컨트롤러를 실행한다.
로그인 된 사용자만이 마이페이지에 접속할 수 있다면, 인터셉터에서 검증이 필요하다.
spring argument resolver
컨트롤러에 어떠한 요청이 들어왔을 때, 요청에 들어온 값을 이용해 원하는 객체를 만들 수 있다.
메서드 파라미터를 인자값들에 주입해주는 전략적 인터페이스이다.
jwt 토큰과 함께 요청이 들어온다면 이 토큰이 유효한 토큰인지 확인 후, 토큰에 저장된 id 를 꺼내서 로그인 유저 객체를 생성해야 한다. 만약 이것을 컨트롤러마다 구현하게 된다면 중복된 코드가 생기고 컨트롤러의 책임이 증가한다.
동작 순서
- client request
- filter
- dispatcher servlet
- client request 에 대한 handler mapping 처리
- (1) request mapping
- (2) interceptor
- (3) argument resolver
- controller
filter vs interceptor vs argument resolver
- 필터는 스프링과 무관한 전역적으로 처리하는 작업(보안 등) 과 같은 것을 처리할 때 사용한다.
- 필터는 서블릿 컨테이너, 인터셉터는 스프링 컨테이너에서 관리한다.
- 인터셉터는 스프링에 들어온 요청을 전역적으로 처리하는 작업(로그인 인가)
- 인터셉터는 컨트롤러가 실행되기 전에 요청을 가로채며, 특정 객체를 반환할 수 없다. 오직 boolean 또는 void 만 반환이 가능하다.
- 리졸버는 인터셉터 이후에 동작하며, 요청이 컨트롤러로 들어왔을 때 값으로 원하는 객체를 생성할 수 있다.
interceptor 로 로그인 상태인지 확인 후,
argument resolver 로 받아온 요청을 통해 authUser 객체를 생성하는 방식을 사용하였다.
'프로젝트' 카테고리의 다른 글
웹 소켓과 tcp/ip 소켓의 차이점 (0) | 2023.06.07 |
---|---|
cognito와 oauth2.0 (0) | 2023.05.24 |
프로젝트 인프라 구성 (0) | 2023.04.04 |
세션 방식을 선택한 이유 (0) | 2023.02.28 |
jwt 토큰 방식을 선택한 이유 (0) | 2022.10.13 |