웹 개발을 하다보면, 로그인(세션체크) 처리, 권한체크, XSS방어, pc와 mobile웹의 분기 처리, 로그, 페이지 인코딩 변환 등의 공통 처리를 해야 할 업무가 생긴다.
이런 공통 처리를 위해 활용할 수 있는 3가지 방법으로
1. Filter
2. Interceptor
3. 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의 차이
'삽 푸는 곳' 카테고리의 다른 글
부모JSP에서 iframe으로 호출된 JSP와 include된 JSP 가지고 놀기 (0) | 2024.04.25 |
---|---|
javascript 뒤로가기 방지 이벤트 (0) | 2020.06.26 |
이클립스(eclipse) 프로젝트 가지고 다니기 - 포터블화(portable) (0) | 2020.04.28 |
[Spring] 동작과정 이해하기 (0) | 2019.11.12 |
톰캣과 아파치 연동 (0) | 2018.12.18 |