본문 바로가기
Study/JSPDP

WebWork - Architecture

by epro 2007. 6. 29.

AJN에서 JSP Design Patterns의 Front Controller Pattern 부분을 공부하다가, 여러 웹 MVC를 비교해보자는 의견이 나왔다.

비교대상으로 물망에 오른 것은,
Spring MVC
Struts
Struts2
WebWork
그 중에 현재 쓰고있는 프레임워크라는 이유로 WebWork를 맡게 되었다. -.-;

WebWork를 쓴 지는 이제 막 두달쯤 된 것 같다. 급하게 프로젝트에 붙이느라 이전 소스를 비교해가며 대충 Copy&Paste를 했는데, 이번에 숙제한다는 핑게로 좀 들여다보게 되었다.

현재 쓰고있는 WebWork의 버젼은 2.2.2이다. (현재 최신버젼은 2.2.5 / 2007년 4월 릴리즈)

우선, 구조를 그림으로 보면 아래와 같다.
( 이미지 출처 http://wiki.opensymphony.com/display/WW/Architecture )
사용자 삽입 이미지


다른그림 보기

최초로 request는  Servlet container(Tomcat or Resin)로 들어오고, 그  Request는 standard filter chain을 통과한다.
만약, SiteMesh같은걸 추가한다면 옵션으로 ActionContextCleanUp을 추가할 수도 있지만, 최초로 호출되는 건 FilterDispatcher이다. FilterDispatcher는 web.xml에 설정되어 있다.
( 그럼 WW2의 FrontController는 FilterDispatcher란 얘기~! )
FilterDispatcher는 ActionMapper를 이용하여 request URL에 매핑될 Action클래스를 찾는다.
( url과 매핑될 action들은 xwork.xml에 정의되어 있겠지..)
이렇게 Action클래스를 찾으면, ActionProxy에 모든 작업을 위임한다.
ActionProxy는 ActionInvocation을 생성한다.
적용할 Interceptor가 있다면, Action 전,후로 Interceptor가 차례대로 실행된다.
(Filter Chain을 생각하면 쉽게 이해되겠지?)
Action이 실행된 다음 ( execute()가 실행된다는 의미겠지?), 결과값(result)을 얻는다.
result에 해당하는 데이터를 xwork.xml로부터 찾아와 해당 페이지(jsp or siteMesh or Tiles..)로 이동하게 된다.

여기까지가 전체적인 개요이고, 원문은 아래 more를 클릭.


가장 흥미로운 것은 Interceptor부분인데, 이전 시간에 FilterChain을 공부했던 것이 이해하는데 큰 도움이 됐다.
인터셉터는 action이 실행되기 전, 후 모두 호출될 수 있다.
또, 인터셉터 스택은 xwork.xml에 쉽게 선언할 수 있다. 단 이때 각 interceptor 사이에 의존성이 있다면 그 순서는 매우 중요하다.

ActionMapper와 ActionProxy는 그 의미가 약간 헛갈리는데...
내 생각으론 ActionMapper에서 xwork.xml을 직접 쳐다보고 매핑할 Action을 찾을거 같았는데 위 다이어그램을 보면, ActionProxy에서 xwork.xml을 Configuration Manager를 통해 쳐다보는 걸로 그려져있어서 약간 아리까리 하다.
( 소스를 열어보면 뭔가 좀 알게되려나....)

ActionProxy에 대해 좀 더 상세한 그림이 있어 가져와봤다. (출처 : 오픈심포니닷컴)

사용자 삽입 이미지


ServletDispatcher(위의 다이어그램에선 FilterDispatcher겠지)란 녀석이 ActionProxy를 생성하고, execute()를 호출한다.

ActionProxy는 Action의 전,후에 Interceptor처리를 하고, Action이 실행 완료되면 Result를 리턴받는다.
Result는 적당한 View를 결정하는데 쓰인다.

설정파일을 샘플로 좀 보면..

1) web.xml
 <filter>
  <filter-name>webwork</filter-name>
  <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
 </filter>

 <filter-mapping>
  <filter-name>webwork</filter-name>
  <url-pattern>/*</url-pattern>
  <dispatcher>REQUEST</dispatcher>
  <dispatcher>FORWARD</dispatcher>
  <dispatcher>INCLUDE</dispatcher>
 </filter-mapping>

모든 url에 대해 webwork의 FilterDispatcher를 타도록 설정했다.

2) xwork.xml

<xwork>
    <include file="common/xwork-common.xml"/>
    <package name="net.agilejava.jspdp.example" extends="net.agilejava">

          <action name="auth" class="net.agilejava.actions.AuthAction">
                <result name="success">/success.jsp</result>
          </action>
      ...
    </package>
</xwork>

만약, http://www.agilejava.net/auth.do 라는 url로 request 가 들어온다면, net.agilejava.actions.AuthAction 클래스를 execute시키고 result로 success가 리턴되면, /success.jsp를 display하게 된다.
(설정파일에 대한 자세한 설명은 http://wiki.opensymphony.com/display/WW/Configuration+Files)

Action은 반드시 execute를 구현해 주어야 한다.

public class AuthAction extends ActionsSupport{
    public String execute() throws Exception{
        // TODO
        return SUCCESS;
    }
}

자, 그럼 여기까지 해서..
나의 숙제인 JSPDP 145page에 나오는 아래 그림을 WebWork에 맞춰 그릴 수 있을까?

사용자 삽입 이미지





Reference
http://www.opensymphony.com/webwork/
http://wiki.opensymphony.com/display/WW/WebWork
WebWork in Action

댓글