Filter, Interceptor, AOP 차이

devdo·2021년 12월 31일
0

Spring

목록 보기
9/9
post-thumbnail

웹 개발을 하다 보면 공통적으로 처리해야 할 기능들이 존재하는데
대표적인 예로 Logging, 인증, 인가, 인코딩 변환 등이 있다.

이런 공통적인 기능을 담당하는 방식이 있는데
Filter, Interceptor, AOP 가 있다.

이들의 가장 큰 차이는 호출되는 시점이 다르다는 것이다.


Filter, Interceptor, AOP 실행순서

이들의 실행순서를 정리하면 이렇다.

실행순서 : Web 영역 {Filter} -> Spring영역 {DispactherServelt -> Interceptor -> AOP -> Controller}

  • Filter와 Interceptor는 Servlet 단위에서 실행된다.
  • AOP는 메소드 앞에 Proxy패턴의 형태로 실행된다.

Filter

DispactherServelt이 도달하기 전, 요청과 응답을 거른뒤(filter) 정제하는 역할을 한다.

필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다.

서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.

또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다.
보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된다.

Spring Security는 Filter로 구성되어 있다.

Enables Spring Security’s default configuration, which creates a servlet Filter as a bean named springSecurityFilterChain.

필터의 실행메서드
ㆍinit() - 필터 인스턴스 초기화
ㆍdoFilter() - 전/후 처리
ㆍdestroy() - 필터 인스턴스 종료


Interceptor

인터셉터는 스프링 MVC 구조에 특화된 필터 기능을 제공한다고 이해하면 된다. 스프링 MVC를 사용하고, 특별히 필터를 꼭 사용해야 하는 상황이 아니라면 인터셉터를 사용하는 것이 편리하다.(김영한)

인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 가로채는 역할을 한다.

필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작하는 것이다.

인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다. HandlerInterceptor 객체가 그것이다.

스프링의 모든 빈 객체에 접근할 수 있다.

인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 업무처리 등에 사용된다.

인터셉터의 실행메서드

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

AOP

OOP를 보완하기 위해 나온 개념이다.
OOP를 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리했다면, AOP는 횡단으로 관점을 돌리는 것이다.

Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.
Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이다.
Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출한다.
반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.

AOP는 주로 비즈니스 로직에서 실행한다.

주로 '로깅', '트랜잭션', '에러 처리'등 중복 코드가 발생할 경우 중복을 줄이기 위해, 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다.

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



참고

profile
배운 것을 기록합니다.

0개의 댓글