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의 차이.


SERVLETREQUESTHTTPSERVLETREQUEST
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

+ Recent posts