이번 프로젝트는 이런저런 이유로 해서 Framework Stack을 SiteMesh+WebWork+Spring+SqlMap으로 구성하게 되었습니다.

Struts1을 사용할때 Webwork에 대한 관심이 있었지만,Webwork으로 사이트를 빌딩한 경험이 전무한 저로써는 Struts1/SpringMVC 스타일과 좀 (많이) 다른 Webwork이 신기했었습니다. 

특히 Webwork은 PageController 이라는 패턴을 사용할수 있는데요. 간단하게 말해, 대개의 WebMVC는 Controller/Action이 중앙 집권적인 제어를 위해 View 레이어가 랜더링 되기 전에 제어를 하지만. PageController 패턴은 View에서 특정 Action을 호출 할수 있는. 즉 페이지의 특정 논리적인 단위를 재사용하거나 파티셔닝 하는  좋은 방법이 있습니다. 사용법도 매우 간단한데요.

 

  1. <div>
  2. <ww:action name="noticeList" namespace="/tiles" executeResult="true" />
  3. </div>

 

mvc4.JPG

 

SiteMesh와 함께 자바에서 많이 사용하는 Tiles(원래 Struts의 서브 프로젝트이었지만,Top Project으로 승격되었습니다.)도   비슷한 것을 가지고 있습니다.

특히 SpringFramework와 함께 Tiles 사용한다면,

org.springframework.web.servlet.view.tiles.ComponentControllerSupport을 구현상속해서 쉽게 구성할수 있습니다.

 

FrontController에 비해, 몇가지 생각해야 하는 부분이 있습니다. 우선 제어의 선후가 바뀌기  때문에, Action에 대한 제어가 쉽지 않습니다. 가령. X,Y,Z에서 동일한 쿼리를 발생한다면 한 페이지를 랜더링 하기 위해 동일한 데이터를 얻기 위해 쓸모없는 퀴리를 날리게 됩니다. 물론 1초캐쉬같은 것등으로 해결이 가능합니다만.

 

물론 한 페이지에서 여러 독립적인 Action이 존재하여 페이지의 각 요소를 재사용하는 일도 있지만, Sitemesh와 같은 페이지 레이아웃/데이코레이션을 구성하는 라이브러리를 사용할 경우 복잡한 레이아웃이 아닌 경우, 아직까지는 크게 사용하지 않을 듯 합니다.

 

그래서 이번에 다시 레이아웃을 잡을때 SiteMesh의 Decorator마다 Action을 하나만 두는 방식은 어떤가 생각해봤습니다. 

webwork-sitemesh-dia.png

 

즉 SiteMesh/Decorator에서 호출하는 Webwork/Action이 Result을 가지고 있지 않고. 단지 해당하는 작업을 한 후 화면에 바인딩할 객체를 ServletRequest의 속성(attribute)에 담기만 하고 Decortator에서 그 정보를 출력하는 것입니다. 

즉 제어가 두군데의 Action으로만 나누어 지는 것입니다. 

 

 <ww:action> 태그에서 result을 실행하지 않기 위해서 (executeResult="true"으로해도 Action의 execute()메소드의 리턴이 NONE이기 때문에 view가 보이지 않습니다. )

  1. <html>
  2. <head>
  3. <ww:action name="noticeList" namespace="/tiles" executeResult="false" />
  4. </head>
  5. <body>
  6. ...
  7.   <c:out value="${tileNotice}" /> 
  8. ...

 

  1. public class NoticeTileAction extends ActionSupport {
  2.     public String execute() throws Exception {
  3.        ServletActionContext().getRequest().setAttribute("tileNotice","hello world!");
  4.        return NONE;
  5.     }
  6. }

 

사실 별거 아닌데. 글만 길어지고 그림만 생겼군요. :-) 물론 SiteMesh가 없이도 사용할수 있는 방법입니다.  

정리도 안되어 있고 두서도 없는 글 읽어 주셔서 감사합니다. (...) 

 

관련 링크

http://www.opensymphony.com/webwork/wikidocs/action.html

Webwork In Action

 

 


 

 

 

 

 

Leave a Reply

Website

Email