Spring Boot를 사용할 때 AOP, Filter, Interceptor를 통해 어플리케이션의 일반적인 로직을 처리할 때 자주 사용된다.
이 세 가지 차이점을 알고 활용하면 더 깨끗한 코드를 작성할 수 있습니다.
그래서 AOP, Filter, Interceptor의 차이점에 대해 간단히 설명하겠습니다.
AOP, 필터 및 인터셉터의 차이점
-
Spring으로 개발할 때
공통적으로 처리해야 할 업무
많이있다.
로그인, 토큰 처리 및 로그 처리와 같은 많은 작업이 모든 공통 프로젝트에 적용되어야 합니다.
하지만 모든 코드에 적용하면 코드가 복잡해지고 가독성이 떨어질 가능성이 높습니다.따라서 Tomcat과 Spring은 공통 작업을 구분하여 별도로 처리하는 기능을 제공합니다.
- 필터 – WAS(Tomcat): Servlet 엔터티에서 실행
- Interceptor – Spring: 서블릿 단위로 실행
- AOP – Spring: 메소드 이전에 프록시 패턴 형태로 실행
AOP, 필터 및 인터셉터 흐름
- 서버가 실행되고 서블릿이 로드되는 동안 init()이 실행된 후 doFilter가 실행됩니다.
- 컨트롤러에 들어가기 전에 PreHandler가 실행됩니다.
- Controller, postHandler, Completion 및 doFilter에서 나오는 것은 괜찮습니다.
- 서블릿이 종료되면 Destroy가 실행됩니다.
필터
- WAS로 들어온 요청을 Servlet으로 보내고 또 Servlet이 작성한 응답을 클라이언트로 보내기 전에 특별한 처리가 필요한 경우에 사용되는 필터.
- 체인 형태의 구조
- 클라이언트 요청 정보를 제공하는 SerlvetRequest 객체를 정의함.
- Servlet 컨테이너는 ServletRequest 객체를 생성하고 이를 Servlet service() 메소드에 인수로 전달.
-
왜 사용
- 서블릿 실행 전후에 일부 작업을 수행하는 데 사용됩니다.
- 반복적으로 수행해야 하는 작업을 수행하기 위해 서블릿에서 공동 작업을 수행하는 이점.
ex) 데이터 암호화, 복호화(JWT), 문자 인코딩, 디코딩, 로그
- 서블릿 실행 전후에 일부 작업을 수행하는 데 사용됩니다.
-
방법
-
init() : 필터 객체가 생성되고 준비를 위해 한 번만 호출됩니다.
-
doFilter() : doFilter()는 필터와 관련된 URL에 대한 요청이 수신될 때마다 호출됩니다.
- filterChain은 다음 필터를 가리키고
filterChain.doFilter()
다음 필터를 호출합니다. - 필터가 없으면 서블릿의 Service()가 내부적으로 호출됩니다.
- filterChain은 다음 필터를 가리키고
-
Destroy() – WAS를 종료하기 전에 한 번만 호출됩니다.
$
서블릿이 실행되기 전의 작업은 filterChain.doFilter() 이전 코드에 써야한다.
$
서블릿이 실행된 후 응답하는 작업은 filterChain.doFilter() 이후 코드에 써야한다.
-
-
필터 배열
- 필터를 배치하는 방법에는 web.xml 및 Java 주석의 두 가지가 있습니다.
- 필터를 배치하는 방법에는 web.xml 및 Java 주석의 두 가지가 있습니다.
인터셉터
-
요청 전/후 작업을 가로채십시오. Filter는 Spring 컨텍스트 외부에 존재하므로 Interceptor는 Spring의 DispatcherServlet이 컨트롤러를 호출하기 전과 후에 개입합니다.
컨트롤러 관련 요청 및 응답을 내부적으로 처리하고 Spring의 모든 빈 개체에 액세스할 수 있습니다.Interceptor
여러개를 사용할 수 있습니다.1.preHandler() – 컨트롤러 메서드가 실행되기 전
2.postHandler() – 컨트롤러 메서드가 실행된 직후 및 보기 페이지가 렌더링되기 전
3.afterCompletion() – 보기 페이지가 렌더링된 후
AOP
-
OOP를 보완하는 개념
-
객체지향 프로그래밍에서 중복을 줄이는 기능을 제공합니다.
-
비지니스 단의 메서드에서 조금 더 세밀하게 조정 할 때 사용한다.
인터셉터, 필터와 달리 메소드 전후에 자유롭게 설정할 수 있으며 주소, 매개변수, 주석 등 다양한 방식으로 대상을 지정할 수 있다.
반면에 HandlerInterceptor는 HttpServletRequest와 HttpServletResposne을 필터와 유사한 매개변수로 취합니다.- @Before : 대상 메서드를 실행하기 전
- @After: 대상 메서드 실행 후
- @After-returning: 대상 메서드의 정상 실행 후
- @After-throwing: 예외가 발생한 후
- @Around : 대상 메서드 실행 전/후
졸업 증서
필터
- 전체적인 request단 에서 처리가 필요 할 떄.
- URL 및 기타 정보를 캐시하는 Filter
인터셉터
- 세션 및 쿠키 체크하는 Http프로토콜 단위로 처리해야 하는 업무.
- 로그인 토큰 체크 등..
AOP
- 비지니스 단에서 세밀하게 조정하고 싶을 떄
- 로깅, 트랜잭션, 에러처리