Filter vs Interceptor vs AOP

정미·2022년 7월 8일
0

Computer Science

목록 보기
19/81

공통 특징

  • 공통적인 업무를 따로 관리, 처리
  • 로그인 관련(세션 체크) 처리, 권한 체크, XSS(Cross site script) 방어, pc와 모바일웹 분기처리, 로그, 페이지 인코딩 변환 등

처리 흐름

  • 순서: Filter → Interceptor → AOP → Interceptor → Filter
  1. 서버를 실행시켜 서블릿이 올라오는 동안 init() 실행, 그 후 doFilter() 실행
  2. 컨트롤러 전 preHandler() 실행
  3. 컨트롤러 후 postHandler(), afterCompletion(), doFilter() 순으로 진행
  4. 서블릿 종료시 destroy() 실행

차이점

  • Interceptor, Filter는 Servlet 단위로, AOP는 메소드 앞에서 Proxy 패턴의 형태로 실행된다.
  • Interceptor, Filter는 주소를 대상으로 구분, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

Filter

특징

  • 디스패처 서블릿에 전달되기 전/후에 패턴에 일치하는 모든 요청과 응답을 거르고 정제하는 역할
  • J2EE 표준 스펙
  • Tomcat과 같은 Web Container에 의해 관리됨
    • Web Context(영역)의 스프링과 무관한 자원에 대해 동작
  • 지정된 자원의 앞단에서 요청 내용 변경, 여러 가지 체크
  • 자원 처리가 끝난 후 응답을 변경하는 처리
  • Spring bean으로 등록 및 빈 주입 가능
  • 인코딩 변환 처리, XSS 방어 등
  • 예: web.xml에 등록, SpringSecurity(Spring MVC에 종속적이지 않음)

예시

<!-- 한글 처리를 위한 인코딩 필터 -->
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

실행 메서드

// javax.servlet.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

특징

  • DispatcherServlet이 Controller(Handler)를 호출하기 전/후의 요청과 응답을 가로채서 처리
  • Spring 제공 기술
    • Spring Context 내부에 위치
  • Spring의 모든 bean 객체에 접근 가능
  • Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용
  • 로그인 체크, 권한 체크, 프로그램 실행시간 계산, 로그 확인 등

실행 메서드

// org.springframework.web.servlet.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 {
    }
}
  • preHandler() : 컨트롤러 메서드가 호출되기 전
  • postHandler() : 컨트롤러 메서드가 실행된 후, view 페이지가 렌더링 되기 전
  • afterCompletion() : view 페이지가 렌더링된 후

Filter vs Interceptor

FilterInterceptor
관리 컨테이너웹 컨테이너스프링 컨테이너
Request/Response 파라미터 교체 가능 여부가능불가능
용도1. 공통 보안 및 인증/인가 관련 작업 2. 모든 요청에 대한 로깅 또는 감사 3. 이미지/데이터 압축 및 문자열 인코딩 4. Spring과 분리되어야 하는 기능1. 세부적인 보안 및 인증/인가 공통 작업 2. API 호출에 대한 로깅 또는 감사 3. Controller로 넘겨주는 정보의 가공

AOP

특징

  • OOP에서 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다
  • 메서드 전후 지점에 자유롭게 설정 가능
  • 로깅, 트랜잭션, 에러 처리 등

PointCut

  • @Before : 대상 메서드 수행 전
  • @After : 대상 메서드 수행 후
  • @After-returning : 대상 메서드의 정상적인 수행 후
  • @After-throwing : 예외발생 후
  • @Around : 대상 메서드의 수행 전/후

Interceptor vs AOP

컨트롤러 호출 과정에 적용되는 부가기능을 advice(aop)로 적용하기보다 인터셉터를 사용하는 편이 낫다.

  1. Spring 컨트롤러는 파리미터, 반환값이 일정하지 않다.
  2. Spring 컨트롤러는 타입과 실행 메서드가 모두 제각각이라 포인트컷의 작성이 어렵다.

출처

0개의 댓글