본문 바로가기

새롭게 쌓은 지식

Filter, Interceptor, AOP, ArgumentResolver

중고거래 플랫폼 API 서버 토이 프로젝트 도중 

Filter, Interceptor, AOP를 모두 사용하게 되었는데 각각 어떤 상황에서 적용해야하는지 정확히 알고 싶었다.

 

 

이 세가지는 모두 공통 관심사를 처리한다.

 

 

 

1. Filter

 

- Filter는 스프링의 ApplicationContext 영역 밖 WebContext 영역에 위치한다. 

- J2EE 표준 기술이다. ( 톰캐소가 같은 웹 컨테이너에 의해 관리된다.

 

# 실행 시점

- doFilter() : 요청이 DispatcherServlet 에 전달되기 전에 수행된다.

- doFilter() : 응답이 DispatcherServlet 을 거치고 난 후 수행된다.

 

- FIlter는 Request, Response 객체 자체를 조작할 수 있다.

 : 조작 할 수 있다는 것은 다른 객체로 변경하여 전달 할 수 있다는 뜻이다!

 

 

# 용도

- 스프링과 분리 되어야 하는 기능을 적용 가능하게 해준다.

 

 

# 빈 등록 여부

- Filter는 서블릿에서 제공하지만 스플이에서 제공하는 DelegatingFilterProxy 로 프록시 필터 형태로 빈 등록이 가능하다.

- 하지만 스프링 부트에서는 내장 톰캣을 이용해 서블릿 컨테이너까지 스프링 부트가 제어하게 되므로 DlegatingFilterProxy로 감싸서 등록할 필요가 없다.

 

 

 

 

 

2. Interceptor

 

 

- Interceptor 은 Handler 동작 전 후 과정에 추가적으로 부가로직을 입힐 수 있다.

- Filter와 다르게 스프링 ApplicationContext 영역 안에 존재한다.

 

 

# 실행 시점

- preHandle() : 요청이 DispatcherServlet 에 전달된 이후 Handler에 도달하기 전에 수행된다.

- postHandle() : 응답이 DispatcherServlet을 거치기 전에 수행된다.

 

 

# 용도

- 스프링 내부에 존재하므로 스프링 종속적인 작업을 하기 쉽다. ( 빈 호출에 대한 로그, Auditing 등 )

 

# 빈 등록 여부

- 스프링기술이기 때문에 당연히 빈으로 등록 가능하다.

 

 

 

 

 

3. AOP

 

 

- 주로 '로깅', '트랜잭션', '에러 처리'등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용

- Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.

- Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

 

 

# AOP 만의 특징

- Advice의 경우 JoinPoint 를 활용해서 호출하지만 Interceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.

 

- 요청과 응답에 항상 특정 처리가 필요하다면 AOP 보다는 Interceptor를 사용하자!

 

 

 

 

 

 

 

4. ArugumentResolver

 

 

- 어떠한 요청이 Handler에 들어왔을 때, 요청에 들어온 값으로부터 원하는 객체를 만들어 내는 일을 간접적으로 해줌.

ex) 요청 파라미터에 

GET /users?name=park&page=1&size=20&sort=id,DESC

 

라고 요청 시 Handler의 파라미터에 Pageable 객체를 넣어두면 page 관련 메타정보를 바탕으로 Pageable 객체를 만들어준다. 이는 어떻게 가능한 걸까??

 

바로 비밀은 PageableHandlerMethodArgumentResolver 에 있다.

 

Spring의 수많은 ArgumentResolver 중 하나로 페이징 관련 파라미터 처리시 사용된다.

 

supportsParameter의 MethodParameter 를 통해 메타정보를 받아

resolverArgument에서 Pageable 객체를 생성하여 반환 한다.

 

 

처음 가장 유명한 Jackon 을 통해서 ArgumentResolver를 접하게 되었는데 정말 너무너무 신기했다. 요청의 JSON을 어떻게 객체로 파싱해주는지 몰랐지만 ArgumentResolver 중 MessageConverter의 Jackson2HttpMessageConverter 를 사용한다는 것에 정말 신기했다.

 

 

 

 

 

 

 

 

 

 

# 정리

 

요청, 응답에 항상 공통으로 처리해야하면 Interceptor를 사용해야겠다. 실제 중고거래 플랫폼 API 서버 토이 프로젝트 에서 로그인 회원확인 기능을 Intercepter로 처리했다. Parameter의 정보는 ArgumentResolver로 처리해야겠다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

꾸준히 다시보자.

 

1. 221008

2. 221019

3. 221101

Recent Posts
Popular Posts
Recent Comments