Filter,Interceptor,AOP 모두 요청 중간에 가로채서 사전처리,사후처리를 하는 의미는 비슷하다.
로깅처리 또한 셋다 가능.
차이점이라고 하면 ,
1. 셋의 시점이 다르다는것
: Filter > Interceptor > AOP
2. 적용하는 방식이 다름
: Filter : web.xml ,
Interceptor : servlet-context.xml
###Filter
클라이언트 요청정보를 제공하는 객체를 정의 : ServletRequest 객체
서블릿 컨테이너는 ServletRequest 객체를 생성하고 이를 서블릿의 Service 메소드에 인수로 전달한다.
ServletRequest 객체는 매개 변수 이름과 값, 속성 및 입력 스트림을 포함하는 데이터를 제공한다.
-클라이언트 요청 정보를 제공하는 객체를 정의
-IP, hostname, 프로토콜 형식, 서버이름, 포트번호, ContentType 등을 가져올 수 있다.
-일반적인 네트워크 통신 기반에 의해서 사용되는 것들
-Servlet 의 web.xml에서 정의
-요청과 응답을 함께 다룰 수 있다.
-doFilter 메소드의 chain.doFilter(request,response) 를 기점으로 전/후 처리가능
###Interceptor
ServletRequest 인터페이스를 확장하여 HTTP 서블릿에 대한 요청 정보를 제공한다.
즉 , ServletRequest의 자식 Interface가 HttpServletRequest이다.
서블릿 컨테이너는 HttpServletRequest 객체를 생성하고 이를 서블릿의 서비스 메소드 (doGet, doPost등)에 인수로 전달
-public interface HttpServletRequest extends ServletRequest
-Http 프로토콜에 존재하는 정보들
-요청 파라미터, HTTP 헤더, 세션 및 쿠키 데이터, 요청에 사용된 URL 등을 가져올 수 있다.
-Spring에서 실행될 컨트롤러 빈 오브젝트, 컨트롤러가 돌려주는 ModelAndView, 발생한 예외 등을 제공받을수 있음.
-servlet-context.xml에 정의
### Filter :
- init() : 필터 초기화
- doFilter() : 전, 후처리용 메소드, 내부에서 filterChain.doFilter를 호출하여 해당 비즈니스처리를 계속해서 수행할 수 있다.
- destory() : 필터 종료이후 실행.
### Interceptor :
- preHandle() : 핸들러가 수행되기 전에 실행됨.
- postHandle() : 핸들러가 수행되고 나서 실행됨.
- afterCompletion() : View작업까지 완료되고 나서 실행됨.
### 파라미터의 차이
- Filter는 ServletRequest, ServletResponse등을 받게 된다.
- Interceptor은 HttpServletRequest, HttpServletResponse, 그리고 대상핸들러 등을 받아서 처리할 수 있다.
### ServletRequest와 HttpServletRequest의 차이.
SERVLETREQUEST | HTTPSERVLETREQUEST |
---|---|
javax.servlet패키지에 포함됨. | javax.servlet.http 패키지에 포함됨. |
ServletRequest의 하위 인터페이스임 | |
getParameter()와 같은 많은 메소드를 제공 | ServletRequest의 다양한 메소드를 상속받음. getQueryString()등과 같은 추가 메소드를 제공함 HTTP프로토콜의 헤더, 바디, 컨텐츠타입, 쿠키, 세션등 다양한 정보를 쉽게 사용할 수 있도록함. |
GenericServlet과 함께 사용됨. | HttpServlet과 함께 사용됨. |
프로토콜에 독립적으로 사용가능 | 프로토콜에 독립적이나, HTTP프로토콜 에 특화되어 사용 |
HTTP가 사용되지 않았을때 클라이언트에서 요청이 들어오면 web container는 servletRequest 객체를 생성하고 service()메소드로 전달하는 방식으로 운용되었다. | 클라이언트에서 요청이 HTTP프로토콜을 이용하여 들어온경우 Web container는 HttpServletRequest 객체를 생성하고 service()메소드에 전달하여 사용한다. |
### AOP
AOP의 여러가지 기능들을 이용하여 메소드가 시행되기 전, 후 등에 처리
: 개념이나 사용법에 대해선 http://hayunstudy.tistory.com/49 참고
### 결론
세군데 전부 로깅이 가능하지만, AOP에 하는 것이 가장 적절하다고 판단.
Filter에 하면 모든 로깅이 다 체크되므로 비효율적이고 시스템에 부하가 걸릴수있다.
Interceptor에 로깅한다면 적당한 controller 및 ModelAndView 예외처리에 다 로깅 가능하다.
하지만 비지니스업무상 insert 또는 update 하는부분에만 로깅하고싶다거나 특정 에러처리 부분만 로깅할때 즉 세밀한 로깅처리불가
AOP 에서 로깅 처리를 하면 개발자가 원하는 시점에 로깅처리가 가능하기때문에 적절.
*Filter
-전체적인 Request단에서 어떤 처리가 필요할때
-인증, 이미지변환, 데이터압축, 암호화필터, 토크나이징 필터,
XML 컨텐츠를 변형하는 XSLT 필터,
URL 및 기타정보를 캐시하는 필터
-문자 인코딩등
*Interceptor
-세션 및 쿠키 체크하는 http 프로토콜 단위로 처리해야 하는 업무가 있을 때
-로그인 세션 체크, 업로드파일처리 등
*AOP
-비즈니스 단에서 세밀하게 조정하고 싶을때
-로깅, 트랜잭션, 예외처리, 권한체크 등
구분 | Filter | Interceptor | AOP |
---|---|---|---|
실행 위치 | 서블릿 | 서블릿 | 메서드 |
실행 순서 | 1 | 2 | 3 |
설정 위치 | web.xml | xml or java | xml or java |
실행 메서드 | init(), doFilter(), destroy() | preHandler(), postHanler(), afterCompletion() | 포인트 컷으로 @After, @Before, @Around 위치를 지정 |
출처
:
http://blog.naver.com/PostView.nhn?blogId=fortunerain&logNo=220964510870&parentCategoryNo=&categoryNo=69&viewDate=&isShowPopularPosts=true&from=search
https://uncle-bae.blogspot.kr/2016/05/spring-interceptor-and-filter.html
'Programming > Spring' 카테고리의 다른 글
ModelAndView 와 ViewResolver (0) | 2018.02.14 |
---|---|
파일 업로드/ 다운로드 (0) | 2018.02.09 |
MariaDB Auto_Increment (0) | 2018.02.08 |
DAO, DTO, VO (0) | 2018.02.08 |
@Autowired, @Resource, @Inject (0) | 2018.02.05 |