Kim Hyeong
Filter, Interceptor, AOP 차이 및 정리 본문
[Spring] Filter, Interceptor, AOP 차이 및 정리
일단, 우리가 왜 저것들이 필요한지를 알아야 한다.
우리가 프로그램을 만들거나 작업을 할 때 공통되는 부분이 굉장히 많다.
예를 들어 인증 처리라던지 외부의 공격을 막기위한 방어, 로그도 찍어야되고 페이지 인코딩도 포함이 될 것이다,
이렇게 같은 기능을 하는 애들이 여러군데에서 사용되고 있으면 소스의 양도 늘어날 것이고 프로젝트도 규모가 작을 때는 잘 모르겠지만
커지면 커질수록 서버에 대한 부하 또한 커질게 분명하다.
그래서 우리는 저런 공통되는 기능, 부분은 따로 뽑아서 선언이나 호출을 하게되면 소스의 양도 줄고 보기에도 편하지 않겠는가?
보기 좋은 떡이 먹기도 좋다고 , 보기 좋은 소스가 관리 하기에도 좋지 않을까 생각해 봅니다.
위와 같은 공통되는 기능, 부분의 처리를 위해 활용할 수 있는 것이 3가지가 있다.
Filter, Interceptor, AOP
위의 3가지는 간단하게 말하면 어떤 행동을 실행하기 전과 후에 추가적인 행동을 시킬 때 사용하는 기능이라고 생각하면된다.
일단 저것들의 개념부터 알아보자.
Filter, Interceptor, AOP의 개념
1. Filter(필터)
말그대로 요청과 응답을 거른뒤 정제하는 역할을 한다.
서블릿 필터는 DispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.
또한 자원의 처리가 끝난 후 응답내용에 대해서도 변경하는 처리를 할 수가 있다.
보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS(cross site script)방어 등의 요청에 대한 처리로 사용된다.
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>
<!-- springSecurityFilterChain-->
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
이렇게 web.xml에 등록을 해 두면 DispatcherServlet보다 먼저 실행이 되어 한글처리와 security를 위한 작업도 해줄 수가 있다.
여기에서 url-pattern이 /* 로 되어있는데 이것은 모든 자원의 요청에도 호출이 된다는 뭐 그런 말이다.
[ 필터의 실행메서드 ]
ㆍinit() - 필터 인스턴스 초기화
ㆍdoFilter() - 전/후 처리
ㆍdestroy() - 필터 인스턴스 종료
2. Interceptor(인터셉터)
' Intercept - 중도에서 빼앗다 ' 이런 뜻이니 무엇이겠습니까?
말 그대로 엄마가 뭘 사오라고 시키셔서 마트에 가려고 하는데
갑자기 할머니가 다른일을 시키셔서 할머니가 시키신 일을 했다.
할머니가 시키신 일을 마치고 엄마가 시키신 일을 했다.
엄마가 시키신 일을하고 엄마한테 다 했다고 말하려고 가는데 할아버지가 다른일을 시키셨다.
할아버지가 시키신 일도 끝내고 엄마한테 다 했다고 말한 후 쉬려는데 이번엔 아빠가 무언갈 시키신다.
여기까지가 쉽게 설명한 인터셉터의 모든것 입니다.
일단 저는 흐름(?) 뭐 그정도로 하고, 엄마가 스프링에서 DistpatcherServlet입니다. 마트가 Controller구요
엄마가 저를 마트에 보냈습니다. 근데 가는 도중에 할머니(preHandler)가 다른일을 시키셨구요 저는 그걸 하고 다시 마트에 갑니다.
마트에서 뭐좀 사서 집에 가는데 할아버지(postHandler)가 저를 끌고 다른 일을 잠깐 시키시고 다시 출발 합니다.
엄마에게 물건(data)을 주고 모든일이 끝나서 쉬려고 앉았는데 이번엔 아빠(afterCompletion())가 다른일을...
여기에서 필터와 인터셉터의 차이가 보이시죠?
필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작합니다.
하지만 인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다.
인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 업무처리를 할 수 있습니다.
인터셉터의 실행메서드
할머니 preHandler() - 컨트롤러 메서드가 실행되기 전
할아버지 postHanler() - 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전
아버지 afterCompletion() - view페이지가 렌더링 되고 난 후
3. AOP(관점 지향 프로그래밍)
OOP를 보완하기 위해 나온 개념입니다.
객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 다른관점에서 바라보고 처리한다.
주로 '로깅', '트랜잭션', '에러 처리'등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용합니다.
Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다.
Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.
joinpoint – 클라이언트가 호출하는 모든 비즈니스 method, joinpoint 중에서 pointcut되기 때문에 pointcut의 후보로 생각할 수 있다.
pointcut – 특정 조건에 의해 필터링 된 joinpoint, 수 많은 joinpoint 중에 특정 메소드에서만 횡단 공통기능을 수행시키기 위해서 사용한다.
advice : 횡단 관심에 해당하는 공통 기능의 코드, 독립된 클래스의 method로 작성한다.
advice 동작 시점
@Before 메소드 실행 전에 동작
@After 메소드 실행 후에 동작
@After-returning 메소드가 정상적으로 실행된 후에 동작
@After-throwing 예외가 발생한 후에 동작
@Around 메소드 호출 이전,이후,예외발생 등 모든 시점에서 동작
weaving 포인트컷으로 지정한 핵심 관심 메소드가 호출될 때, 어드바이스에 해당하는 횡단 관심 메소드가 삽입되는 과정을 의미한다. 이를 통해 비즈니스 메소드를 수정하지 않고도 횡단 관심에 해당하는 기능을 추가하거나 변경이 가능해진다.
Aspect 포인트 컷과 어드바이스의 결합니다. 어떤 포인트컷 메소드에 대해 어떤 어드바이스 메소드를 실행할지 결정한다.
AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이입니다.
Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출하는 반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.
HandlerInterceptor 와 AOP 차이
둘은 비슷하지만, 가장 큰 차이는 AOP가 Joinpoint를 이용해 메소드의 매개변수에만 접근할 수 있다는 것이다. 물론 컨트롤러의 메소드가 httpservletRequest를 사용한다면 HandlerInterceptor와 동일할 수 있다.
따라서 요청과 응답에 항상 무언가를 수행을 해야 한다면 aop보단 HandlerInterceptor가 맞다.
이렇게 공통되는 기능, 부분의 처리를 위해 활용할 수 있는 3가지의 개념을 알아보았다.
뭐 대충봐서는 잘 모르지만 천천히 읽고 실습을 해보면 금방 이해하고 사용할 수 있을 것이다.