Article 요약:
Web tier Design Guideline 및 Servlet 2.3 API의 Filter interface의 사용 용도 및 Example 소개
Article 내용:
Servlet 2.3 spec에서 추가된 Filter interface는 Web component에 대한 Request하기전, Response후에 기능의 확장및 변경을 지원하기 위한 interface이다. 이전까지, Servlet/JSP를 개발할때, 코드를 재사용하기 위한 방법, 즉 공통적인 기능을 하나의 소스파일로 관리하기 위해, 상속을 이용하거나, RequestDispatcher의 include(),forward()를 이용했다. 혹은 Web tier design guideline으로 재시된 Model -Ⅱ를 이용하기도 했다.
Model -Ⅰ 위의 Model -Ⅰ은 각각의 jsp를 request하면, jsp는 presetation을 담당하고, JSP Bean, Custom Tag Handler가 Businsess logic을 담당하게 되는 것이다. 여기서 코드를 재사용하거나 공통적인 기능 통합 관리 하기 위해서는 RequestDistpatcher의 include(), forward()를 이용하는 것이다. 그리고, Servlet은 권한 check, logging과 같은 화면과는 관련 없는 부분의 컴포넌트로 이용이 되어 지는 것이다.
Model -Ⅱ Model -Ⅱ는 Facade Pattern이다. 코드의 재 사용성, 공통적 기능을 통합 관리하기 위한 Design이라 할수 있겠다. 모든 Request는 Front Controller인 Conversational Controller가 먼저 받아 공통적인 기능을 처리하게 된다. 그리고, 이 Front Controller는 실재 파라미터로 넘어오는 request를 dispatch(Action)하여 Presentation과 business logic을 처리하게 되는 것이고, response를 modify하거나, 공통적인 presentation을 위해 JSP,servlet을 include할수도 있다. 위에서 간단하게 설명한 이러한 guideline과는 별도로 Servlet2.3에서는 Filter라는 interface를 제공한다. Model -Ⅱ와 같은 Design을 손쉽게 구현할수 있고, 개발된 소스를 변경하지 않고, Security, Logging, CRM을 위한 request data 분석등의 기능을 손쉽게 확장하기 위한 기능으로써 Filter interface를 사용할수 있다. Filter는 Web Container에 의해 지원되어 지는 것으로, Request전, Response후의 어떤 기능을 추가할수 있다. 다음은 Filter의 사용예이다.
1) Authentication Filters
2) Logging and Auditing Filters
3) Image conversion Filters
4) Data compression Filters
5) Encryption Filters
6) Tokenizing Filters
7) Filters that trigger resource access events
8) XSL/T filters
9) Mime-type chain Filter
Filter를 관련된 interface는 다음과 같다.
Filter : 특정 Resource에 대한 Request나, Resource로 부터의 response에 추가적인 Filtering 작업을 수행하기 위한 object를 정의 하기 위한 interface이다. Web container의 configuration에 의해 Filter class와 Resource가 설정된다. 이렇게 설정되면, 설정된 resource에 대한 request는 Filter의 doFilter() 메소드가 실행이 되어 진다.
FilterConfig : Servlet container에 의해 만들어 지는 filter Configuration object이다. ServletContext객체를 얻어 낼수 있고, web Container에 설정된 정보(name, init parameter)들을 얻어 낼수 있다.
FilterChain : Filter의 doFilter() 메소드의 parameter로 Container에 의해 생성되어 넘어오는 객체로, chain을 형성하기 위해, 즉 Filter를 실행하고 다음 Filter로 dispatch하기위해 제공되는 객체이다. Filter의 제일 끝에는 결국 request한 resource를 dispatch해야 한다.
자 그럼.. Filter가 실재 어떻게 동작을 하는지 알아 보기위해 간단한 소스와 설정방법을 살펴 보겠다.
package specular.servlet;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ServletFilter implements Filter
{
private FilterConfig filterConfig;
private ServletContext context;
//FilterConfig 객체를 초기화 하기위한 callback method
//초기화 잡업을 구현 한다.
public void setFilterConfig(FilterConfig filterConfig)
{
System.out.println("ServletFilter.setFilterConfig()");
this.filterConfig = filterConfig;
this.context = filterConfig.getServletContext();
//init parameter 얻기
System.out.println(filterConfig.getInitParameter("info"));
}
public FilterConfig getFilterConfig(){
return this.filterConfig;
}
//설정된 Resource에 대한 request시 실행된다.
public void doFilter(ServletRequest request,
ServletResponse response,
FilterChain chain)
throws java.io.IOException, ServletException
{
//Request시 공통기능 구현
System.out.println("ServletFilter.doFilter() : start");
//실재 Reousrce를 dispatch
chain.doFilter(request,response);
//Response시 공통기능 구현
System.out.println("ServletFilter.doFilter() : end");
}
}
|
테스트 환경은 Servlet 2.3 API를 구현한 Servlet/JSP container를 이용해야 하는데, 저는 Resin2.0 beta를 사용했습니다. Resin의 doc\WEB-INF\ 디렉토리 밑에 다음과 같이 web.xml 파일은 만든다.
<web-app>
<filter-mapping url-pattern='/*'
filter-name='specular.servlet.ServletFilter'>
<init-param info='Servlet Filter Class'/>
</filter-mapping>
</web-app> |
위의 설정사항을 보면, document root 밑의 모든 resource에 대한 request는 specular.servlet.ServletFilter class에 의해 동작된다는 것을 설정했고, 그리고, init parameter를 추가로 하나 설정했다. web container마다 이 설정사항은 약간의 차이가 있다.
테스트 결과는 다음과 같다.
1. resin start
D:\web\resin2.0\bin>httpd
Resin 2.0.b2 (built Tue Apr 17 09:41:58 PDT 2001)
Copyright(c) 1998-2001 Caucho Technology. All rights reserved.
Starting Resin on Mon, 09 Jul 2001 11:08:43 +0900 (GMT+09:00)
http listening to *:8080
srun listening to 127.0.0.1:6802
| 2. hello.jsp
<%
System.out.println("Hello Wrold");
%> | 3. http://localhost:8080/hello.jsp Request후 console 출력 결과
D:\web\resin2.0\bin>httpd
Resin 2.0.b2 (built Tue Apr 17 09:41:58 PDT 2001)
Copyright(c) 1998-2001 Caucho Technology. All rights reserved.
Starting Resin on Mon, 09 Jul 2001 11:22:19 +0900 (GMT+09:00)
http listening to *:8080
srun listening to 127.0.0.1:6802
ServletFilter.setFilterConfig()
Servlet Filter Class
ServletFilter.doFilter() : start
Hello Wrold
ServletFilter.doFilter() : end | 위 결과를 보면, hello.jsp에 대한 request가 ServletFilter class에 의해 처리가 되는 것을 확인할 수 있다. Filter를 통해 Web tier단의 개발된 코드를 변경하지 않고, 기능의 추가 및 변경이 가능하고, 공통적인 기능을 Filter를 통해 통합 관리 할수있겠죠.
2001.07.09 written by Jeon HongSeong |