웹 애플리케이션을 개발하면 특정 단계에서 작동하거나, 여러 곳에서 반복되는 로직을 공통으로 관리해야 되는 경우가 있다. 이때 사용하는 것이 Filter , Interceptor, AOP다.
모든 비즈니스 로직에 공통으로 적용되는 코드가 있다면 중복이 늘어나고, 유지보수가 어려워진다. 이 세 기술은 애플리케이션 계층에서 중복되는 로직을 제거하고, 특정 단계에서의 처리를 가로채거나 추가하는 데 사용된다.
이 글에서는 이 세 가지 기술의 정의와 특징, 각 사용 케이스를 알아본다.
출처 :https://velog.io/@soyeon207/Spring-Filter-
요청이 들어오면 Request → Filter → Servlet → Interceptor → AOP → Controller 순으로 처리된다. 이때 Filter는 Spring과 무관한 Web Context에 속하며 Interceptor와 AOP는 Spring Context에 속한다.
응답은 역순인 Controller → AOP → Interceptor → Filter → Response 순으로 진행된다.
Filter는 Spring 컨테이너와 무관한 웹 컨테이너가 관리하며, DispatcherServlet 전후로 처리 작업을 지원한다.
public interface Filter {
public default void init(FilterConfig filterConfig) throws ServletException
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
public default void destroy() {}
}
init()
: 필터 객체를 초기화하고 서비스에 추가하는 메소드
doFilter()
: DispatcherServlet에 전달되기 전 웹 컨테이너에 의해 실행, 파라미터로 전달된 FilterChain은 doFilter를 통해 다음 대상으로 요청을 전달
destory()
: 필터 객체 삭제, 자원 반환
Spring과 무관하게 전역적으로 처리하는 작업 예컨대, 인증 및 인가 등의 작업에서 사용된다.
DistpatcherServlet이 컨트롤러를 호출하기 전/후로 요청과 응답을 참조하거나 가공하는 기능을 제공한다.
DistpatcherServlet에는 N개의 Interceptor를 등록할 수 있다. 한 개 이상의 Interceptor가 등록되어 있는 경우 요청은 Interceptor를 거쳐 컨트롤러에 전달되며, Interceptor가 존재하지 않는 경우에는 즉시 컨트롤러로 요청이 전달된다.
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()
: 컨트롤러가 호출되기 전에 실행되며, 클라이언트와 관련되어 전역적으로 처리하는 작업 예컨대, 인증 및 인가, 컨트롤러로 넘겨지는 정보 가공, 로그 확인 등의 작업에서 사용된다.
AOP는 관심사의 분리를 통해 코드의 중복을 줄이고, 모듈화를 향상시키는 프로그래밍 패러다임이다.
메서드나 컨트롤러에서 전체 공통 요소는 아니지만, 부분적 공통요소일 경우 또는, 비즈니스 로직 상에서 좀 더 세밀하게 공통 요소를 처리해야하는 예컨대, 로깅, 트랜잭션, 에러 처리에 사용된다.
Interceptor/Filter는 주소로 대상을 구분하는 반면, AOP는 PointCut이 지원하는 방식(ex. 주소, 파라미터, 애노테이션)으로 대상을 지정할 수 있다.
PointCut : Aspect를 적용할 타깃 메서드 지정자
JoinPoint : Aspect를 지정할 수 있는 모든 위치
Advice : PointCut에 적용할 로직
Aspect : Advice 모음 + PointCut 모음
Filter
는 웹 컨테이너 영역에서 동작하며 요청이 DispatcherServlet에 도달하기 전에 실행된다. 응답 전/후 처리에 사용되며 대표적으로 로깅, 인코딩, 보안(CORS 설정, 인증 확인) 등에 사용된다.
Interceptor
는 프레임워크 레벨에서 요청이 컨트롤러에 도착하기 전에 특정 로직, 예컨대 인가, 로깅 등에 사용된다. URL 패턴 기반으로 특정 요청에 대해서만 동작시킬 수 있다는 특징이 있다.
AOP
는 애플리케이션 전반에 걸친 공통적 관심사를 분리할 때 사용된다. Interceptor와 Filter는 URL로 대상을 구분하지만, AOP는 파라미터, 애노테이션 등으로 대상을 지정할 수 있다.
https://velog.io/@soyeon207/Spring-Filter-Interceptor-AOP
https://goddaehee.tistory.com/154