Interceptor, Filter, AOP의 차이점은 어느정도 이해하고 있지만 언제까지나 두루뭉실하게 알고 있을 순 없다는 생각이 들기 시작했다...
생각 난 김에 정리해야겠다고 마음을 먹었고 관련 내용들을 찾아보고 알아보면서 정리 작성하기로 하였다.
먼저, Interceptor, Filter, AOP는 주로
- 로그인 관련(세션체크),
- 권한체크,
- XSS(Cross site script) 방어,
- PC와 모바일 웹의 분기처리,
- 로그,
- 페이지 인코딩 등
공통 업무를 프로그램 흐름의 앞, 중간, 뒤에서 공통처리를 위해 전, 후에 추가적으로 이루어지는 작업에 활용하기 위해 사용된다.
위 사진을 보면 실행 순서는 Filter가 가장 밖에 위치하고, Interceptor, AOP 순서이다.
Filter와 Interceptor의 경우 Dispatcher Servlet 안 쪽과 바깥 쪽에서 Servlet 단위에서 실행되고, AOP의 경우는 메서드 앞에서 Proxy 형태로 실행된다.
- 서버를 실행시켜서 서블릿이 올라오는 동안에 init이 실행되고, 그 후 doFilter가 실행
- 컨트롤러에 들어가기 전 preHandler가 실행
- 컨트롤러에서 나와 postHandler, after Completion, doFilter 순으로 진행
- 서블릿 종료 시 destroy가 실행
서블릿 필터는 Dispatcher Servlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.(Dispatcher Servlet 이전)
자원의 처리가 끝난 후 응답내용에 대해서도 변경 처리를 할 수 있다.(Dispatcher Servlet 이후 실행 )
Web.xml에 등록하고, 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용
필터의 실행 메서드
Init() - 필터 인스턴스 초기화
doFilter - 전/후 처리
Destroy - 필터 인스턴스 종료
인터셉터는 스프링의 Dispatcher Servlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트 내부에서 Controller에 관한 요청과 응답에 대해 처리한다.
인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한 체크, 프로그램 실행 시간 계산작업 로그확인 등 업무에 사용
인터셉터의 실행 메서드
preHandler() - 컨트롤러 메서드 실행되기 전
postHandler() - 컨트롤러 메서드 실행 직 후 view페이지 렌더링 되기 전
afterCompletion() - view페이지가 렌더링 되고 난 후
주로 로그, 트랜잭션, 에러 처리 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용한다.
Interceptor나 Filter는 주소로 대상을 구분해서 걸러야하고, AOP는 주소, 파라미터 애노테이션 등 다양한 방법으로 대상을 지정할 수 있음.
파라미터는 JoinPoint, ProceedingJoinPoint 등을 활용한다.
AOP의 포인트 컷
@Before : 대상 메서드의 수행 전
@After : 대상 메서드의 수행 후
@After-returning : 대상 메서드의 정상적인 수행 후
@After-throwing : 예외발생 후
@Around : 대상 메서드의 수행 전/후
AOP에 관해서 추 후에 더 정리해서 내용을 추가해보려고 한다.
참고
갓대희의 작은공간
https://goddaehee.tistory.com/154