AOP, Filter, Interceptor의 설명에 앞서 공통 프로세스에 대해 기본 흐름을 알아야 한다.
프런트엔드 개발 도중에는 공통적으로 처리해야 할 업무들이 많습니다.
로그인, 페이지 혹은 SPA 컴포넌트 간의 권한, XSS( Cross site script ) 보안, 로그, 인코딩 등 많은 공통 프로세스가 있다.
공통 프로세스를 관련된 페이지( 컴포넌트 )마다 작성해야 한다면 중복 코드가 많아지게 되고
Project( 혹은 SPA )의 단위가 커질수록 서버에 부하가 커지며, 소스의 유지 및 보수도 어려워지게 된다.
개발자인 우리는 클린 코드를 지향하며 좋은 코드를 작성해야 합니다!
따라서 공통 프로세스는 따로 관리하는 방법이 좋은 방법 중 하나이다.
이러한 프로그램의 공통 프로세스를 흐름의 시작, 중간, 끝에 추가하여 자동으로 처리할 수 있는 방법이 있다.
그러한 방법들이 Filter, Interceptor, AOP 이며 3가지 방법 모두 어떠한 요청이나 응답을 하기 전에 먼저
실행하거나, 실행한 다음에 추가적인 행동을 할 때 사용되는 기능들이다.
우선 Interceptor와 Filter는 Servlet 단위에서 실행되며 AOP는 메소드의 앞에 Proxy 패턴의 형태로 실행한다.
Proxy Pattern
Proxy 패턴이란 간단히 설명하면 대리( 대신, 비서 ) 객체이다. ( JPA Proxy 참고 )
Proxy 패턴의 용도는 Client에서 실제 실행된 클래스( 객체 )의 반환 값인지, Proxy 객체를 통한 반환 값인지
Client가 모르게 처리하는 디자인 패턴입니다.
중요한 것은 흐름만 제어할 뿐 반환 값에 대한 조작이나 변경은 하지 않습니다.
다시 AOP로 돌아가서 Filter가 가장 바깥에 위치하고 그안에 Interceptor, 마지막으로는 AOP가 있습니다.
따라서 요청과 응답은 Filter -> Interceptor -> AOP -> Interceptor -> Filter 순서로 거치게 됩니다.
Filter
어원 그대로 Client의 Request와 Response를 정제하는 역할입니다.
Filter는 보통 Spring project의 web.xml에 작성하며 UTF-8의 인코딩, 디코딩 변환 처리를 할 수 있으며
XSS( Cross-Site Scripting ) 방어 등등 Client의 요청정보와 응답 정보를 알맞게 변경할 수 있습니다.
Filter Interface
Filter interface에 내장된 method들로
// 필터를 Web Container에 생성한 후 초기화 할 때 호출하는 메소드
public void init(FilterConfig filterConfig) throw ServletException
// 체인을 따라 존재하는 필터로 이동하며 체인의 가장 마지막에는 클라이언트가 요청한 자원이 위치한다.
public void doFilter(ServletRequest request, SevletResponse response, FilterChain chain) throws java.io.IOException, ServletException
// 필터가 Web Container에서 삭제될 때 호출하는 메소드
public void destory()
이중에 Filter 역할을 하는 메소드가 doFilter() 메서드이다.
Servlet은 Client의 자원 요청시 Filter가 존재하는 경우 Filter 객체 ( 인터페이스 )의 doFilter() 메서드를 호출하며
여기부터 정제가 되기 시작합니다.
Filter 구현의 예로
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
chain.doFilter(request, response);
}
만약에 Client의 요청이 doFilter method를 호출하는 경우 FilterChain 객체를 전달받는데
해당 Request가 자원에 이르기까지 거처가게 될 FilterChain을 나타냅니다.
Filter Setting
Filter를 사용하기 위해 Servlet Container에 알려주어야 합니다.
Servlet 규약에서 WebApplication에 관련된 설정은 /WEB-INF에 존재하는 web.xml을 통해 설정해야 합니다.
web.xml 파일에서 필터를 설정하기 위해서는 아래와 같이 활용합니다.
<web-app>
<filter>
<filter-name>encodingFilter</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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
위의 코드는 encodingFilter를 설정하여 모든 URL을 강제로 UTF-8로 인코딩하는 Filter 방법입니다.
다음 포스팅에서는 요청과 응답에 대한 Filter 흐름의 다음 순서인 Interceptor에 대해 알아보겠습니다.
'Backend > Spring' 카테고리의 다른 글
자주 사용되는 Spring 어노테이션에 대해 알아보자! (0) | 2022.01.21 |
---|---|
Spring AOP의 구동 원리와 Proxy와의 관계 (0) | 2022.01.13 |
AOP, Filter, Interceptor의 정의와 차이점 (3) - AOP편 (0) | 2022.01.11 |
AOP, Filter, Interceptor의 정의와 차이점 (2) - Interceptor 편 (0) | 2022.01.11 |
Spring( 봄 ) ?? 스프링의 원리와 기초 (0) | 2022.01.10 |