공통 프로세스
웹개발을 하다보면 공통적으로 처리해야 할 부분들이 많다. 로그인 관련 처리, 권한 체크, pc와 모바일웹의 분기처리 등등 이 있다.
공통업무에 관련된 코드를 중복해서 작성한다면 소스관리도 안될뿐더러 유지보수도 힘들어진다.
그러므로 공통 부분은 빼서 관리하는 것이 좋다.
이러한 공통업무를 프로그램의 앞,중간,뒤에 추가하여 자동으로 처리할 수 있는 방법이 있다.
위와 같은 공통처리를 위해 활용할 수 있는 것이 3가지가 있다.
1. Filter
2. Interceptor
3. AOP
스프링에서 사용되는 Filter,Interceptor,AOP 세 가지 기능은 모두 무슨 행동을 하기전에 먼저 실행하거나, 실행한 후에 추가적인 행동을 할 떄 사용되는 기능들이다.
Filter, Interceptor, AOP의 흐름
출처:https://goddaehee.tistory.com/154
init
이 실행되고, 그 후 doFilter
가 실행된다. preHandler
가 실행된다 postHandler,
after Completion
, doFilter
순으로 진행이 된다.destroy
가 실행된다.말 그대로 요청과 응답을 거른뒤 정제하는 역할을 한다.
서블릿 필터는 DispatcherServlet
이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러가지 체크를 수행할 수 있다.
또한 자원의 처리가 끝난 후 응다밴용에 대해서도 변경하는 처리를 할 수 있다. 보통 web.xml에 등록하고, 일반적으로 인코딩 변환 처리, XSS방어 등의 요청에 대한 처리로 사용된
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뿐만 아니라 이미지와 같은 모든 자원의 요청에도 호출 된다.
요청에 대한 작업 전/후로 가로챈다고 보면 된다.
필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다.
하지만 인터셉터는 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전,후로 끼어들기 때문에 스프링 컨텍스트(Context,영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다.
스프링의 모든 빈 객체에 접근할 수있다.
인터셉터는 여러 개를 사용할 수 있고, 로그인체크,권한체크,프로그램 실행시간 계산작업 로그확인 등의 업무처리를 할 수 있다.
OOP를 보완하기 위해 나온 개념
Filter
를 조금 더 확장하여 스프링에서 제공하는 필터가 있는데 그것이 바로 GenericFilterBean
이다.GenericFilterBean
은 기존 Filter에서 얻어올 수 없는 정보였던 Spring의 설정 정보를 가져올 수 있게 확장된 추상 클래스이다.GenericFilterBean
,Filter
)는 한 가지 공통점이 있다. 매 서블릿마다 호출이 된다는 것이다.dispatch
되는 경우가 있을 수 있다.Filter
로 구현되어진다.RequestDispatcher
클래스에 의해 다른 서블릿으로 dispatch
되게 되는데, 이 때 이동할 서블릿에 도착하기 전에 다시 한번 filter chain
을 거치게 된다.Filter
나 GenericFilterBean
로 구현된 filter
를 또 타면서 필터가 두 번 실행되는 현상이 발생할 수 있다.OncePerRequestFilter
이다.OncePerRequestFilter
는 그 이름에서도 알 수 있듯이 모든 서블릿에 일관된 요청을 처리하기 위해 만들어진 필터이다.Filter
가 있다. 이러한 경우 Filter
는 다시 한번 더 실행된다.OncePerRequestFilter
는 이 동작을 방지한다. 한 번의 request에 대해, OncePerRequestFilter
는 정확하게 한 번만 실행된다. 이러한 동작은 보안 인증에 도움이 된다.