본문 바로가기
삽 푸는 곳

[Spring] Filter, Interceptor, AOP

by kkumtree 2019. 11. 12.

웹 개발을 하다보면, 로그인(세션체크) 처리, 권한체크, XSS방어, pc와 mobile웹의 분기 처리, 로그, 페이지 인코딩 변환 등의 공통 처리를 해야 할 업무가 생긴다.

 

이런 공통 처리를 위해 활용할 수 있는 3가지 방법으로

1. Filter

2. Interceptor

3. AOP

가 있다.

 

Filter, Interceptor, AOP의 흐름

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

- 요청이 들어오면 ilter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다.

 

 

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

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

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

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

 

 

1) Filter

요청과 응답을 거른 뒤 정제하는 역할

 

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

 

또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수 있다.

 

보통 web.xml에 등록하고, 인코딩 변환, XSS (lucy) 등의 요청에 대한 처리로 사용.

 

ex)

<!-- 한글 처리를 위한 인코딩 필터 -->

<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>

 

해당 필터의 이름은 encoding, 값은 UTF-8인 파라미터를 정의하고 있다. 

필터의 URL-PATTERN을 /*로 정의하면 servlet, jsp뿐만 아니라 이미지와 같은 모든 자원의 요청에도 호출 된다.

 

Filter 실행 메서드

init() - 필터 인스턴스 초기화

doFilter() - 전/후 처리

destroy() - 필터 인스턴스 종료

 

2) Interceptor

요청에 대한 작업 전/후에 가로챈다.

 

Filter는 스프링 컨텍스트(스프링 영역) 외부에 존재하여 스프링과 무관한 자원에 대해 동작하지만

Interceptor는 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전/후에 끼어들어서 동작하기 때문에 스프링 컨텍스트 내부에서 Controller에 대한 요청과 응답에 대해 처리를한다.

 

또한, 스프링 컨텍스트 내부에 존재하기 때문에 스프링의 모든 빈 객체에 접근할 수 있다.

 

Interceptor는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 로그확인 등의 업무 처리에 사용한다.

 

Interceptor 실행 메서드

ㆍpreHandler() - Controller가 수행하기 전

ㆍpostHandler() - Controller가 수행된 후 View를 호출하기 전

afterCompletion() - View 호출 완료 후

 

3) AOP

OOP를 보완하기 위해 나온 개념

 

중복을 줄일 수 없는 부분을 줄이기 위해

'로깅', '트랜잭션', '에러 처리' 등 비즈니스단의 메서드에서 세밀하게 조정하고 싶을 때 사용.

 

Interceptor나 Filter와는 달리 메소드 전/후의 지점에 자유롭게 설정이 가능.

Interceptor나 Filter는 '주소'만으로 대상을 구분해서 걸러내야 하지만

AOP는 '주소', '파라미터', '어노테이션' 등 다양한 방법으로 대상을 걸러낼 수 있다.

 

 

 

AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이다.

Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출한다.

반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.

 

AOP의 포인트컷

@Before: 대상 메서드의 수행 전

@After: 대상 메서드의 수행 후

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

@After-throwing: 예외발생 후

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

 

 

 

 

출처: https://goddaehee.tistory.com/154 [갓대희의 작은공간]

 

 

 

 

//Interceptor와 Filter의 차이

https://victorydntmd.tistory.com/176