-
Spring-4[Filter, AOP, Interceptor]Spring 2021. 6. 12. 21:10
자바 웹 개발에서 굉장히 공통적으로 처리해야 할 부분이 많다.
페이지 인코딩이 가장 대표적이고 로그인 세션 처리, 로그 등이 있다.
이런 공통적인 코드들을 모든 페이지마다 작성해야 한다면 중복된 코드가 많아지게 되고, 관리하는 것도 굉장히 힘들어지게 된다.
그렇기 때문에 공통적인 부분은 따로 빼서 관리하는 게 좋은데
이러한 공통 처리를 위한 방법이 3가지 존재한다.
- Filter
- Interceptor
- AOP
위의 3가지는 모두 실행 전과 후로 나뉘어서 실행된다.
우선 Interceptor와 Filter는 Servlet 단위에서 실행된다. 반면 AOP는 메서드 앞에 Proxy패턴(?)의 형태로 실행된다.
실행 순서를 보면 Filter가 가장 바깥이고 그 안에 Interceptor, 또 그 안에 AOP가 있는 형태이다.
정리하면 어떠한 요청이 들어오면
Filter -> Interceptor -> AOP -> Interceptor -> Filter 순으로 처리가 이루어진다.
- 서버를 실행시켜 서블릿이 올라오는 동안에 init이 실행되고, 그 후 doFilter가 실행된다.
- 컨트롤러에 들어가기 전 preHandler가 실행된다.
- 컨트롤러에서 나와 postHandler. after Completion, doFilter 순으로 진행된다.
- 서블릿 종료 시 destory가 실행된다.
그렇다면 Filter에 대해서 먼저 알아보자
말 그대로 요청과 응답을 걸러주는 역할을 한다.
서블릿 필터는 DiapatchServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청 내용을 변경하거나, 여러 가지 체크를 할 수 있다.
또 자원의 처리가 끝난 후 응답 내용에 대해서도 변경하는 처리를 할 수 있다. 보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리 등에 사용된다.
필터의 실행 메서드
- init() - 필터 인스턴스 초기화
- doFilter() - 전/후 처리
- destroy() - 필터 인스턴스 종료
Interceptor는 무엇일까?
요청에 대한 작업 전/후로 어떤 것을 낚아채서 작업을 하는 것
필터는 스프링 콘텍스트 외부에 존재함 스프링과 무관한 자원에 대해 동작했다면, Interceptor는 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다.
스프링의 모든 빈 객체에 접근 가능하다.
Interceptor는 여러 개를 사용할 수 있고 로그인 체크, 권한 체크 등 업무처리가 가능하다
Interceptor 실행 메서드
- preHandler() - 컨트롤러 메서드가 실행되기 전
- postHandler() - 컨트롤러 메서드 실행 직후 view페이지 렌더링(?) 되기 전
- afterCompletion() - view페이지가 렌더링 된 후
마지막으로 AOP란 무엇일까?
OOP를 보완하기 위해 나온 개념
객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다.
주로 '로깅', '트랜잭션', '에러 처리'등 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다.
Interceptor나 Filter와는다르게 메서드 전후의 지점에서 자유롭게 설정이 가능하다.
Interceptor와 Filter는 주소로 대상을 구분해서 걸러내는 반면, AOP는 주소, 파라미터, Annotation 등 다양한 방법으로 대상을 지정할 수 있다.
AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파리미터의 차이이다.
Advice의 경우 JoinPoint나 ProceedingJoingPoint등을 활용해서 호출한다.
반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.
AOP의 pointcut
- @Before : 대상 메서드의 실행 전
- @After : 대상 메서드의 수행 후
- @After-returning : 대상 메서드의 정상적인 수행 후
- @After-throwing : 예외발생 후
- @Around : 대상 메서드의 수행 전/후
'Spring' 카테고리의 다른 글
reCAPTCHA v2 (0) 2021.06.26 @RequestBody / @ResponseBody (0) 2021.06.22 HttpSession (0) 2021.06.20 Spring-3[log4j] (0) 2021.06.11 Spring-1 (0) 2021.06.08