Backend/Spring

AOP, Filter, Interceptor의 정의와 차이점 (1) - Filter 편

Juwon2106 2022. 1. 10. 19:08
728x90

Filter, Interceptor, AOP 프로세스 흐름도

AOP, Filter, Interceptor의 설명에 앞서 공통 프로세스에 대해 기본 흐름을 알아야 한다.

 

프런트엔드 개발 도중에는 공통적으로 처리해야 할 업무들이 많습니다.

 

로그인, 페이지 혹은 SPA 컴포넌트 간의 권한, XSS( Cross site script ) 보안, 로그, 인코딩 등 많은 공통 프로세스가 있다.  

 

공통 프로세스를 관련된 페이지( 컴포넌트 )마다 작성해야 한다면 중복 코드가 많아지게 되고

 

Project( 혹은 SPA )의 단위가 커질수록 서버에 부하가 커지며, 소스의 유지 및 보수도 어려워지게 된다.

 

개발자인 우리는 클린 코드를 지향하며 좋은 코드를 작성해야 합니다!

 

따라서 공통 프로세스는 따로 관리하는 방법이 좋은 방법 중 하나이다.

 

이러한 프로그램의 공통 프로세스를 흐름의 시작, 중간, 끝에 추가하여 자동으로 처리할 수 있는 방법이 있다.

 

그러한 방법들이 Filter, Interceptor, AOP 이며 3가지 방법 모두 어떠한 요청이나 응답을 하기 전에 먼저 

 

실행하거나, 실행한 다음에 추가적인 행동을 할 때 사용되는 기능들이다.

 

우선 Interceptor와 Filter는 Servlet 단위에서 실행되며 AOP는 메소드의 앞에 Proxy 패턴의 형태로 실행한다.

 

Proxy Pattern

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에 대해 알아보겠습니다.

728x90