[Spring] Filter, Interceptor, AOP 의 차이

hyeminn·2021년 2월 18일
1

✨ Filter, Interceptor, AOP의 차이


자바 웹 개발을 하다보면 공통적으로 처리해야 할 업무들이 많다. 예를 들어 로그인 관련 처리, 권한체크, XSS 방어 등이 있다. 공통 업무에 관련한 코드를 모든 페이지마다 작성한다면 중복된 코드가 많아지게 되고, 프로젝트 단위가 커질수록 서버에 부하를 줄 수도 있으며 소스 관리도 되지 않는다.

이러한 공통 업무는 따로 분리하여 관리하는 것이 좋으며 다음과 같은 세가지를 활용할 수 있다.

  1. Filter
  2. Interceptor
  3. AOP

스프링 프레임워크에서 사용되는 Filter, Interceptor, AOP 세 가지 기능은 모두 요청 실행 전이나 실행 후에 추가적인 행동을 할 때 사용되는 기능들이다.


Filter, Interceptor, AOP의 흐름

  1. 서버를 실행시켜 서블릿이 올라오는 동안에 init이 실행되고, 그 후 doFilter가 실행된다.

  2. 컨트롤러에 들어가기 전 preHandler가 실행된다

  3. 컨트롤러에서 나와 postHandler, after Completion, doFilter 순으로 진행이 된다.

  4. 서블릿 종료 시 destroy가 실행된다.

img

  • Interceptor와 Filter는 Servlet 단위에서 실행된다. 반면 AOP는 메소드 앞에 Proxy 패턴의 형태로 실행된다.
  • 실행 순서를 보면 Filter가 가장 바깥쪽에 있고, 그 안에 Interceptor, 그 안에 AOP가 있는 형태이다.
  • 요청이 들어오면 Filter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다.

Filter

Filter는 말 그대로 요청과 응답을 거른 뒤 정제하는 역할을 한다. 서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다. 또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다. 보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된다.

  • init() - 필터 인스턴스 초기화
  • doFilter() - 전/후 처리
  • destroy() - 필터 인스턴스 종료

Interceptor

Interceptor는 요청에 대한 작업 전/후를 가로챈다. 필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다. 하지만 Interceptor는 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리하며 스프링의 모든 빈 객체에 접근할 수 있다. Interceptor는 여러 개를 사용할 수 있고 로그인 체크, 권한 체크, 로그 확인 등의 업무 처리로 사용한다.

  • preHandler() - 컨트롤러 메서드가 실행되기 전
  • postHandler() - 컨트롤러 메서드 실행 직 후 view 페이지 렌더링 되기 전
  • afterCompletion() - view 페이지가 렌더링 되고 난 후

AOP

AOP는 객체 지향의 프로그래밍을 했을 때, 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다. 주로 로깅, 트랜잭션, 에러 처리 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다.

InterceptorFilter와 달리 메소드 전 후의 지점에 자유롭게 설정이 가능하며 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있다. 반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.

  • @Before - 대상 메서드의 수행 전

  • @After - 대상 메서드의 수행 후

  • @After-returning - 대상 메서드의 정상적인 수행 후

  • @After-throwing - 예외발생 후

  • @Around - 대상 메서드의 수행 전/후


https://goddaehee.tistory.com/154

profile
성장하는 개발자가 되고 싶어요 😁

0개의 댓글