Search results for 'Intercepting Filter'

프리젠테이션(Presentation) 티어 패턴 - Intercepting Filter

2007/05/26 17:11
1. 고려해야 할 사항
  • 요청시마다 압축 해제와 같은 프로세싱이 공통적으로 필요.
  • 요청과 응답시 공통적으로 필요로 하는 프로세싱 로직이 여러 콤포넌트에 중복되어 나타나지 말아야 함.
  • 선처리 또는 후처리를 위한 액티비티들은 기존 콤포넌트에 영향을 주지 않으면서 쉽게 추가 또는 삭제할 수 있어야 함.

2. 해결방안
요청시 선처리가 필요한 경우, 또는 응답시 후처리가 필요한 경우, 필요에 따라 꽂아서 쓸 수 있는 Intercepting Filter를 사용. 즉, 클라이언트의 요청시 바로 요청을 처리할 프라이머리 핸들러가 클라이언트의 요청을 처리하도록 하는 것이 아니라 먼저 선언된 필터를 통해 적절한 선처리를 수행 하도록 함.

이 해결 방안은 환경 구성 파일에 선언적인 방식의 체인형태로 구성되어 있는 프로세싱에 원하는 기능을 가지고 있는 필터를 추가 또는 삭제할 수 있음. 다른 콤포넌트의 수정 또한 필요치 않음.

Java Servlet API 버전 2.3 이후부터 필터 기능이 추가적으로 지원됨. 개발자는 java.servlet.Filter 인터페이스를 구현함으로써 필터를 생성함. 이렇게 만든 필터는 특정 서블릿이 사용할 수 있도록 정의할 수 있는데, 그 방법은 디플로이먼트 스크립터 문서인 web.xml 파일에 선언적인 방식으로 추가.


3. 해결방안 - 구조
사용자 삽입 이미지

4. 해결방안 - 시퀀스
사용자 삽입 이미지


5 구현 전략
  • Custom Filter
    Java Servlet API 2.3 이전 버전을 기반으로 하고 있는 웹 컨테이너에서 필터를 사용하고자 할 경우, 직접 필터를 구현. FilterManager 클래스, FilterChain 인터페이스, Filter 인터페이스, 인터페이스를 구현한 클래스를 구현해함.
  • Standard Filter
    Java Servlet API 2.3 이후 번전을 사용하고 있을 경우, Filter 인터페이스를 구현하고 web.xml 디플로이먼트 디스크립터 파일에 작성한 필터를 선언만 해주면 됨. FilterManager 클래스는 클라이언트 요청을 수신하는 컨테이너 클래스가 됨. FilterChain 오브젝트가 생성되어 있지 않을 경우, FilterManager 오브젝트는 web.xml 문서에 명시되어 있는 각 Filter들의 오브젝트를 생성해서, 새로운 FilterChain 오브젝트에 추가. 그리고 나서, FilterChain의 doFilter 메소드를 호출.
  • Application Service Layer Strategy
    Application Service 레이어를 여러 개 정의할 수 있음. 이때 위쪽에 존재하는 레이어는 클라이언트가 직접 사용하게 될 레이어로 인터페이스를 클라이언트 중심으로 정의하게 됨.
  • Base Filter
    Base Filter 클래스는 모든 다른 필터 클래스들이 공통적으로 필요로 하는 기능을 상속받아서 사용할 수 있는 슈퍼 클래스임.
  • Template Filter
    Base Fiter는 GoF의 Template Mthod 패턴을 사용할 수 있음.
  • JAX-PRC Filter
    필터는 클라이언트와 통합 티어에서도 사용될 수 있음. 일반적으로 메시지 핸들러로 알려져 있는 웹 서비스 필터는 웹 요청시 선처리와 후처리를 수행할 수 있음. JAX-RPC에서의 메시지 핸들러는 SAAJ로 작성될 수 있음.

6. 예제 및 코드

web.xml (Language : xml)
  1. <filter>
  2.    <filter-name>TimerFilter</filter-name>
  3.    <filter-class>sl500.TimerFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6.    <filter-name>TimerFilter</filter-name>
  7.    <url-pattern>/*<url-pattern>
  8. </filter-mapping>

TimerFilter.java (Language : java)
  1. package sl500;
  2.  
  3. import java.io.*;
  4. import javax.servlet.*;
  5.  
  6. public class TimerFilter implements Filter {
  7.    private FilterConfig filterConfig = null;
  8.  
  9.    public void init(FilterConfig filterConfig) throws ServletException {
  10.       this.filterConfig = filterConfig;
  11.    }
  12.  
  13.    public void destroy() {}
  14.  
  15.    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  16.       long start = System.currentTimeMillis();
  17.       chain.doFilter(request, response);
  18.       long end = System.currentTimeMillis();
  19.  
  20.       filterConfig.getServletContext().log("Request processed in" + (end - start) + " milliseconds");
  21.    }
  22. }


7. 결과
  • 장점
    필터는 코드 중복현상 없이 모든 클라이언트 요청시 쉽게 적용시킬 수 있음.
    필터와 필터가 제공하는 기능을 필요로 하는 요청간 커플링이 느슨함. 따라서, 클라언트의 요청시 다른 기능을 필요로 할 경우 쉽게 변경시킬 수 있음.
    필터의 응집력이 높아지고, 다른 위치에서 재사용하기가 쉬움.
    필터는 선언적인 방식으로 추가 및 제거될 수 있음.
  • 단점
    필터들은 서로 독립적인 형태로 존재하야 하기 때문에, 필터간 많은 양의 데이터를 공유해야 하는 경우 비효율적임.

8. 관련 패턴
  • Decorator
  • Front Controller
이올린에 북마크하기

happyness Programming/J2EE Patterns ,

2007/05/26 17:11 2007/05/26 17:11
[로그인][오픈아이디란?]