<div class="note"> 작성자 : 오승택
네이버블로그 : http://blog.naver.com/paradozz 본페이지는 오직 openframework.or.kr에서만 볼 수 있으며 불펌을 금합니다. 본인이 Tapestry에 대해서 막연하게 나마 기대를 갖게 된것은 프로그래머가 디자이너처럼 생각하고 디자이너가 프로그래머처럼 생각하는 그런 마인드가 되어 주었으면 하는 바램에서 이다. 프로그램을 아무리 잘 짠다 하더라도 UI가 허접하면 그건 프로그램이 아니다. 디자인이 아무리 잘 나왔다고 하더라도 프로그램 관리가 소홀하면 어찌 잘 만든 에플리케이션이라 하겠는가!! 그것을 해소할 수 있는것이 드뎌 터져버렸다... </div>

Tapestry처음에..#


Web 어플리케이션의 개발 현장에는, 많은 경우, 2개의 팀이 존재한다.
디자인을 실시하는 크리에이티브 팀과 시스템의 개발을 실시하는 테크니컬 팀이다.
그러나, 많은 체제나 개발툴은 그것을 경시하고 있어, 화면 디자인으로부터 시스템의 개발까지 통합적인에 개발을 진행시킬 수가 없다.
두개의팀 중에서 하나의 팀은 필요 이상의 노력을 요구한다.

Tapestry의 등장#

2003년 5월, Tapestry라고 하는 Web 어플리케이션전용 체제가, Jakarta 프로젝트에 새롭게 더해졌다.
Tapestry는, 이 문제에 하나의 회답을 나타내 준다. Part1에서는, Tapestry의 특징을 설명해, Tapestry를 사용한 Web 어플리케이션 개발을 개관 한다. Part2에서는, Tapestry의 기초를 설명한 후, Web 어플리케이션에 요구되는 일반적인 기능을, Tapestry의 표준의 컴퍼넌트를 이용해 실현되는 구체적인 방법을 말한다.
open source 개발 서비스 SourceForge.net로 활발하게 개발이 진행되어 온 Web 어플리케이션전용 체제 Tapestry가, Apache Jakarta 프로젝트에 참가했다.
Tapestry는, 새로운 컨셉에 근거해 설계되고 있어 지금까지 없는 극적인 진보를 Web 어플리케이션 에 가져올지도 모른다.
그 진보란, 디자인 프로세스와 시스템 개발 프로세스의 통합적인 결합이다. Part1에서는, Tapestry를 이용한 간단한 어플리케이션을 통해서, Tapestry의 특징과 개요를 소개한다.

Tapestry란
#

한마디로 말하면, Tapestry는, Web 디자이너와 프로그래머의 작업을 완전하게 분리해,
양자가 평행한 작업을 진행시키는 것을 가능하게 하는 프레젠테이션용의 체제다.
게다가, 재사용 가능한 컴퍼넌트를 이용해, 생산성을 올릴 수가 있다.
지금까지의 Web 어플리케이션전용 체제나 개발툴은, 시스템 개발, 혹은 기술에 너무 주목한 나머지,
HTML나 WML등의 리스폰스 생성에, 기술색을 너무 강하게 내고 있다. 그 결과, 단순한 실물 모형 화면으로서 뿐만이 아니고, 동적인 화면 생성에 그대로 이용할 수 있는 화면 디자인을, 디자인팀이 작성할 수 없는 상황에 있다.
그 원인은, 디자인팀에 있어 난해한 독자 태그나 스크립트 릿, 사용하기 어려운(익숙해지지 않았다) 개발툴에 있다. 최신의 Visual Studio . NET나 JavaServer Faces에 대해조차 그렇다.
크리에이티브 팀은, Visual Studio . NET를 사용해 디자인하려고는 생각하지 않을 것이다.
그 결과, 개발팀은, 실물 모형 화면을 시스템으로 이용할 수 있도록(듯이), 빨리 변경해야 하게 된다.
Tapestry는, 이 갭을 묻어 디자인팀의 아웃풋을, 거의 그대로 개발팀이 이용할 수 있도록(듯이) 해 준다.
게다가 개발팀의 도움없이, 디자인팀이 시스템의 화면 디자인을 변경을 하는 일도 불가능하지 않다.
HTML에 개발팀이 손보면(자), 이미 디자인팀에서는 변경 불가능하게 되어 버리는 JSP나 ASP를 이용하는 것과는 대조적이다.

Tapestry의 특징#

심플해 세련 되고 있다
HTTP나 HTML, Java라고 하는 복합적인 개념이나 기술이 필요함 JSP나 Servlet API는 Tapestry에 의해 은폐 되어 HTML(크리에이티브 팀이 담당)와 Java(테크니컬 팀이 담당)를 의식하면 좋아진다.
디자이너는 디자인에, 프로그래머는 프로그램에 집중할 수가 있게 된다.
1.gif
휴대용
Tapestry는 Servlet API 위에 구축되고 있기 때문에, Servlet API를 서포트하는 Web 컨테이너(Tomcat, WebSphere, WebLogic등)이면, Tapestry를 이용할 수 있다. 벌써 보급되어 있는 플랫폼을 그대로 이용할 수 있는 것이다.
재이용 가능 컴퍼넌트
Tapestry에서는, Web 어플리케이션의 presentation layer를, Java Web Component(JWC)라고 하는 재이용 가능한 컴퍼넌트를 조합해 구축한다.
이것은, 컴퍼넌트와 비지니스 논리를, 바인딩이라고 하는 구조나 OGNL라고 하는 간이언어로 연결시키는 것으로, 결합간에 막대한 이점을 받을 수 있다.(OGNL은 차 후에 알아보기로 하자.WebWork가 OGNL기반이다.)
2.gif
액티브한 개발진
Tapestry는, 매우 액티브한 개발진에 의해 유지되고 있어 향후의 한층 더 발전을 기대할 수 있다. 또, 기존의 체제에서는 「할 수 있는 곳을 한다」라고 하는 것에 반해, Tapestry의 기능을 보고 있으면 「할 수 있으면 원하는 곳을 한다」라고 하는 인상을 강하게 받는다. 그것이야 말로 Tapestry의 최대 매력이다.
강력한 인스페크타
Tapestry에는 강력한 인스페크타가 준비되어 있다. 인스페크타는, Web 브라우저를 이용해 어플리케이션의 동작 상황을 확인하는 편리한 툴이다. 복잡한 화면을 작성하는 경우는 매우 편리하게 여겨진다.
3.gif
동적 확장
Tapestry에서는, 동적으로 클래스를 확장하는 구조가 준비되어 있으므로, 과거 정직하게 정해진 코드를 쓰지 않아도 되는 것이 많다. 예를 들면, 기존의 JavaBeans에 프로퍼티를 추가하려면 , 프로퍼티명과 형태를 설정 파일에 기술하는 것만으로 동적메소드까지 자동 생성해 준다. 이러한 것이 프로그래머를 자연 성숙시켜주고 시간을 절약할 수가 있다.
바리데이션 기능
Struts나 JavaServer Faces 같이, Tapestry에도 입력을 체크해, 에러 메세지를 출력하기 위한 바리데이션 기능이 있다. 게다가, Web 브라우저에서의 JavaScript를 사용한 체크도 서포트하고 있어, 서버에의 부담을 줄일 수가 있다.
JavaScript의 서포트
JavaScript는, 사실상 Web 어플리케이션의 작성에 필수인 것에도 불구하고, 직접 이것을 서포트하는 체제는 적다. Tapestry는, JavaScript를 이용한 페이지를 적극적으로 서포트하고 있다. //

Java Web Component#

그러면 우선, 생산성 향상에 크게 공헌하는, 재이용 가능한 컴퍼넌트에 대해 설명한다.
Tapestry에서는, Java Web Component(JWC)로 불리는 컴퍼넌트를 조합해 Web 어플리케이션의 presentation layer를 구축하게 된다.
이 컴퍼넌트를 이해해 활용해 나가는 것이, Tapestry를 잘 다루는 요점이 된다.

Tapestry는 presentation layer를 대상으로 한 체제이므로, 컴퍼넌트도 스스로 HTML등의 프레젠테이션용 마크업 언어에 대응한 것이 기본이 된다.
실제, PageLink, Form, TextField등의 컴퍼넌트가 표준으로 준비되어 있다. 이러한 컴퍼넌트를 조합해, 보다 고도의 컴퍼넌트를 만드는 일도 간단해,
화면 2와 같은 탭 표시나, Palette라고 하는 선택 입력을 실시하는 컴퍼넌트도 만들 수가 있다.
35tapestry_java_10.jpg
화면 2:JWC를 사용해 실현된 탭 표시

컴퍼넌트는, 밑의 트리구조와 같이, 페이지를 뿌리로 한 나무 구조를 형성한다. 페이지는, 부모를 가지지 않는 특수한 컴퍼넌트로서 다루어진다. 어플리케이션은, 1개(살) 이상의 페이지로부터 구성된다.

하나의 컴퍼넌트는, 최대 3개의 요소로부터 구성된다. 필수 요소의 컴퍼넌트 사양은, 컴퍼넌트의 파라미터나 논리를 실장한 클래스(컴퍼넌트 클래스) 명을 지정하는 XML 파일이다. 남는 2개의 요소는 옵셔널이다. 컴퍼넌트에 논리가 필요한 경우는, 컴퍼넌트 클래스를 준비한다. 컴퍼넌트가 출력하는 HTML에 전형적인 부분이 많은 경우는, HTML 템플릿도 준비한다. 독자 컴퍼넌트를 만드는 방법은, 다음에 소개하겠다.

<div class="note" width="200"> Page </div>

  • Body
  • Form
    • textField
    • Submit
  • PageLink
    • Image
그림 3:트리 구조 컴퍼넌트군

디자인과 프로그램의 분리#

디자인과 프로그램의 분리를 위해서, Tapestry에서는 HTML 템플릿을 사용한다. HTML 템플릿은, 생성해야 할 HTML를 Tapestry에게 전하기 위한 것으로, JSP를 옮겨놓는 것이다. JSP와의 최대의 차이는, 「HTML인것 같음」이다.

실제의 HTML 템플릿의 샘플을 리스트 1에, 리스트 1을 Web 브라우저로 표시한 결과를 화면 3에, 리스트 1을 이용해 어플리케이션을 실행한 결과를 화면 4로 화면 5에 나타낸다. 보시는 것처럼, HTML 템플릿은, jwcid라고 하는 속성이 추가되고 있는 것 이외는, 통상의 HTML 파일이다. 따라서, HTML의 지식만 있으면 충분히 취급할 수가 있다. 이것이 Web 어플리케이션으로부터 디자인을 분리하는 포인트가 된다.(그림은 차후 문서에서 제공하겠다.)

덧붙여 HTML 템플릿으로 불리는 것이 많지만, SGML로부터 파생한 XML나 WML등의 마크업 언어에도 이용할 수가 있다.

<html>
 <head>
  <title>Stack Trace</title>
  <link rel="stylesheet" type="text/css" href="listing.css" title="style"
 </head>
 <span jwcid="$content$">
 <span jwcid="shell">
 <body jwcid="body">
  예외 <b><span jwcid="ex">java.lang.Exception</span></b>의 스택 트레이스 정보:
  <table width="80%">
   <tr class="odd">
    <th>Level</th><th>파일명</th><th>행 번호</th><th>메소드명 </th>
   <tr>
   <span jwcid="unlessTrace">
   <tr class="even">
    <td colspan="4">스택 트레이스 정보는 없습니다 </td>
   </tr>
   </span>
   <span jwcid="ifTrace">
   <tr jwcid="eachTrace" class="even">
    <td><span jwcid="number">0</span></td>
    <td><span jwcid="file">Foo.java</span></td>
    <td align="right"><span jwcid="line">20</span></td>
    <td><span jwcid="method">getName</span></td>
   </tr>
   <tr jwcid="$remove$" class="odd">
    <td>1</td>
    <td>Bar.java</td>
    <td align="right">10</td>
    <td>service</td>
   </tr>
   </span>
   <tr>
    <td colspan="4" align="right">
     <a jwcid="nextPage" href="Home_ja.html">
      <img jwcid="nextBtn" src="images/next-normal.png" border="0" alt="다음에 "/>
     </a>
    </td>
   </tr>
  </table>
 </body>
 </span>
 </span>
</html> 

리스트 1:HTML 템플릿의 예

Tapestry의 동작 개요#

Tapestry는, 그림 4와 같은 구성이 되어 있다. 엔진으로 불리는 클래스가, Web 컨테이너로부터 받은 리퀘스트를 처리하는 Tapestry의 중추이다. 엔진은, 리퀘스트의 실제의 처리를 서비스에 위양 한다.
리퀘스트의 처리 방법의 차이로부터, 복수의 서비스가 준비되어 있다. 단지 페이지를 표시하기 위한 page 서비스나, 특정의 메소드를 호출한 후에 페이지를 표시하는 direct 서비스등이 있다. Tapestry에 부속의 샘플 프로그램에는, 동적으로 그래프를 작성해 jpeg 이미지를 돌려주는 chart 서비스의 샘플도 있다. 다만, 서비스는 컴퍼넌트에 의해 은폐 되는 것이 많기 때문에, Tapestry를 이용하는데 있어서 그만큼 의식할 필요는 없다.

서비스는, 페이지를 루트로 한 컴퍼넌트 트리를 참조하면서, 리퀘스트를 처리한다.

5.gif
그림4.Tapestry의 구조

Tapestry 어플리케이션의 구조#

Tapestry의 어플리케이션의 대범한 구조를 밑에 그림에 나타낸다. Tapestry 체제는, 사양(Specification)으로 불리는 XML로 기술된 설정에 근거해 처리를 실시한다. 우선, 어플리케이션 사양에서는, 주로, 어플리케이션이 어떠한 페이지로 구성되어 있는지를 기술한다. 각 페이지는, 페이지 사양, 페이지 템플릿(페이지에 대한 HTML 템플릿), 페이지 컴퍼넌트로 구성된다(페이지도 컴퍼넌트의 1개인 것을 생각해 내 주셨으면 한다). 페이지 컴퍼넌트는, 페이지 고유의 처리나 데이터를 취급하는 클래스이다. 페이지 사양은, 페이지 템플릿과 페이지 컴퍼넌트를 관련지어 페이지 전체를 정리하는 역할을 가진다. 이것들이 삼위일체가 되어 페이지를 구성한다.

Tapestry의 어플리케이션은, 반드시 Home라고 하는 이름의 페이지를 포함하지 않으면 안 된다. Home 페이지는, 유저가 처음 Tapestry 어플리케이션에 액세스 했을 때에 표시되는 특별한 페이지(Web 어플리케이션의 웰컴 페이지에 상당한다)이다.

이러한 구조로부터, Tapestry에서는 다음과 같은 단순한 순서로 어플리케이션을 개발할 수 있다.

  1. 어플리케이션 사양을 작성한다
  2. 페이지 마다, 다음의 작업을 실시한다
  3. 페이지 템플릿을 작성한다
  4. 페이지 컴퍼넌트를 작성한다
  5. 페이지 사양을 작성한다
  6. 어플리케이션 사양에 작성한 페이지를 추가한다
그러면, 실제로 어플리케이션을 실행해 보자.

6.gif

최초의 어플리케이션#

time.gif

이제 위와 같이 현재의 시간을 표시하는 간단하고도 요점적인 어플리케이션을 보자.
F5를 누르게 되면 현재 페이지에 시간이 동적으로 나타나게 된다.
일단 이러한 프로그램들은 jsp,asp,php에서 코딩 한줄로 되는 것들이긴 하지만.
Tapestry의 첫번째 프로그램을 실행하기 위해 위와같은 그림의 간단하고 명료한 예제부터 시작한다.

어플리케이션 사양 #

아래의 소스가, 시계 어플리케이션의 어플리케이션 사양(.application)이다. application 요소로, 어플리케이션의 이름(name 속성으로 자유롭게 명명해도 좋다)과 사용하는 엔진(engine-class 속성을 사용)을 지정한다. 엔진을 독자적으로 확장할 수도 있지만, 통상은 Tapestry에 부속의 org.apache.tapestry.engine.BaseEngine 클래스를 기술한다.

다음에, page 요소를 사용해 어플리케이션을 구성하는 페이지를 기술한다. 시계 어플리케이션은, Home.page 로 구성된다. 이 Home.page의 페이지 사양의 파일명이, specification-path 속성으로 지정되고 있다. 시계 어플리케이션에서는, 하나의 페이지 밖에 필요없기 때문에, 어플리케이션 사양의 기술은 이만큼이다.

<div class="note">clock.application</div>

<?xml version="1.0" encoding="euc-kr">
<!DOCTYPE application PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd>
<application name="clock application" engine-class="org.apache.tapestry.engine.BaseEngine">
   <page name="Home" specification-path="/clock/space/Home.page"/>
</application>

페이지 템플릿#

아래 소스가, Home 페이지의 페이지 템플릿이다. jwcid라고 하는 속성으로 ID( 「date」와「refresh」)를 할당해 Tapestry가 동적으로 처리해야 할 부분을 인식할 수 있도록 하고 있다. (어떻게 처리할까는, 다음에 설명하는 페이지 사양으로 기술한다). <span>태그 및<span>태그로 둘러싸인 범위는, 동적으로 일자가 삽입되는 부분이므로, 「2003년 7월 12일 (토) 13:54」라고 하는 캐릭터 라인은 일종의 예시며 기술할 필요는 없다. (단지 소스단에 박아 둔 이유는일자를 생성하는 프로그램이, 어떠한 포맷으로 일자를 생성해야할 것인가 분명히 하기 위함이다.) 페이지 템플릿을 그대로 브라우저나 HTML 에디터로 표시했을 때, 마치 "HTML"같다고 보여진다.

< a > 태그의 href 속성치도 동적으로 생성되지만, 같은 이유로써, 자기 자신에게로의 URL( 「#」)를 더미로서 기술하고 있다.

덧붙여 페이지 템플릿으로 jwcid 속성을 붙인 태그는, 닫고 태그를 생략 할 수 없다. 다음과 같은 기술은 하지 못하고,

이름 :<input jwcid="name" type="text"><p jwcid="para">나니야연대기

다음과 같이 기술해야 한다.

이름 :<input jwcid="name" type="text"/><p jwcid="para">나니야연대기</p>

이것은, Tapestry가 컴퍼넌트의 영향 범위를 정확하게 파악하기 위한 제한이다. 따라서, XHTML이나 XML을 사용한다고 생각하면 틀림없을 것이다.

<div class="note">Home.html</div>

<html>
  <body>
    현재 시간은 <b><span jwcid="date">2003년 7월 12일 (13:54</span>></b>입니다.<br>
    <a href="#" jwcid="refresh">새로고침</a>
  </body>
</html>

페이지 사양 #

아래의 코드가, Home (*.home)페이지의 페이지 사양이다. 페이지 템플릿으로 ID를 할당한 부분을, 어떻게 처리하는지를 기술한다. 우선, 이 페이지의 처리의 담당하는 것이, clock.Home(①) 클래스 인 것을 기술한다. 페이지 템플릿의 「date」ID를 할당한 부분에는, clock.Home 클래스의 「now」프롭퍼티(③의 expression 속성으로 지정)의 값을 삽입(②의 type 속성으로 Tapestry의 표준 컴퍼넌트 Insert를 지정)하도록(듯이) 기술한다. expression 속성으로 지정하는 값은, OGNL라고 하는 Java의 오브젝트를 조작하기 위한 간단하고 쉬운 표기 방법을 이용해 기술한다.

페이지 템플릿의 「refresh」ID를 할당한 부분에서는, Home 페이지(⑤)의 URL를 href 속성치로서 삽입(④의 type 속성으로 Tapestry의 표준 컴퍼넌트 PageLink를 지정)하도록(듯이) 기술한다.

<div class="note">Home.page</div>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
  "-//Apache Software Foundation//Tapestry Specification 3.0//EN"
  "http://jakarta.apache.org/tapestry/dtd/Tapestry_3_0.dtd">

  <page-specification class="clock.Home">  --- ①
     <component id="date" type="insert">  -- ②
    <binding name="value" expression="now"/>  -- ③
   </component>
   <component id="refresh" type="PageLink">
    <static-binding name="page">Home</static-binding>  -- ⑤
   </component>
  </page-specification>

페이지 컴퍼넌트 #

아래의 컴퍼넌트(clock.Home 클래스)에서는, 「now」프롭퍼티를 실장한다. 실제로는, JavaBeans 사양에 따라, getNow() 메소드를 써야한다. 이 메소드가 돌려주는 값은, 페이지 템플릿으로 더미로서 지정한 일자의 형식에서 포맷 한 현재의 일자와 시각이다.

<div class="note">clock.Home.java</div>

pakcage clock

import java.te
xt.SimpleDateFormat;
import java.util.Date;

import org.apache.tapestry.html.Basepage;

public class Home extends BasePage {
  SimpleDateFormat format = new SimpleDateFormat("yyyy年M月d日(E)K:mm");
  public String getNow(){
    return format.format(new Date());
  }
}

web.xml의 설정정보#

<div class="note">web.xml</div>

<? xml version="1. 0" encoding="UTF-8"? >
<! DOCTYPE web-app
  PUBLIC "-//Sun Microsystems, Inc. //DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
 <display-name>tapestry applications</display-name>

 <servlet>     <! -- (1-->
  <servlet-name>clock</servlet-name>
  <servlet-class>org.apache.tapestry.ApplicationServlet</servlet-class>
  </servlet>

 <servlet-mapping>  <! -- (3-->
  <servlet-name>clock</servlet-name>
  <url-pattern>/clock</url-pattern>
 </servlet-mapping>
</web-app>

배치와 실행 #

이상으로 어플리케이션의 준비를 할 수 있었으므로, 실제로 시계 어플리케이션을 움직여 보자. 이번은 J2SE 1.4. 2로 Tomcat 4.1. 27을 사용하지만, J2SE 1.2이상과 Java Servlet API 2.2이상의 편성이라면, 대부분의 Web 컨테이너로 동작할 것이다.

Tomcat의 인스톨
Tomcat 4.1이상을 다운로드해 인스톨 한다. 이하, 인스톨 한 디렉토리(jakarta-tomcat-4.1)를 CATALINA_HOME으로 Path정보를 설정한다.
Tapestry의 인스톨
이 예제는 3.0기준으로 한다. 4.0라이브러리도 이 예제를 실행할수가 있다.
어플리케이션의 실행
Tomcat를 기동해, Web 브라우저로 「http://localhost:8080/app/clock」에 액세스 하자, refresh도 누르며 확인해보자

복습#

Tapestry에서는, 이상과 같이 어플리케이션을 작성해 나간다. 다소 귀찮게 느껴진 부분이 있을지도 모르지만, 일단 어플리케이션을 움직이는 환경이 생기면, 페이지 마다 파일을 3개씩 추가해 나가는 것만으로 있다.

페이지 템플릿에서는, HTML 파일의 동적으로 생성하는 부분에 jwcid 속성을 추가했다. 그 이외는 표준적인 HTML이며, 브라우저로 표시를 확인할 수도 있었다. jwcid 속성을 붙인 부분을, 페이지 사양(.page)으로, Tapestry 표준의 컴퍼넌트 Insert와 PageLink를 사용해 처리하는 것을 지정했다. 페이지 컴퍼넌트에서는, 일자와 시각을 돌려주는 프롭퍼티를 JavaBeans 사양에 따라 실장했다.

배치에 관해서는, 각종 사양 파일이나 페이지 템플릿도 클래스 로더를 사용해 읽히기 (위해)때문에, WEB-INF/classes안에 둘 필요가 있었다.

workbench 샘플의 실행#

35tapestry_java_15.jpg

Tapestry의 것 좀 더 편리한 기능을 보다 간단하게 실감해 받을 수 있는 workbench라고 하는 샘플이, Tapestry의 디스트리뷰션에 포함되어 있으므로, 실행 방법을 소개하자. 실행 방법은, TAPESTRY_HOME/lib/examples/workbench.war를 CATALINA_HOME/webapps아래에 카피해, Tomcat를 기동하는 것만으로 있다.

Web 브라우저로 「http://localhost:8080/workbench」에 액세스 하면(자), 위와같은 그림이 표시될 것이다. 후는, 탭을 적당하게 선택할 수 있는, 각 샘플을 볼 수가 있다. 다만, 1개만 주의점이 있다. Dates 탭은 L10N 탭보다 먼저 시험하자. 반대로 하면, 로케일에 의한 서브밋결과를 표시할 수가 없게 된다.

다른 체제라는 비교#

Tapestry는, 그다지 WebObjects의 인지도가 높지 않기 때문에, 널리 알려지고 있는 Struts와 JavaServer Faces(이하 JSF)와 비교해 보자.

JSF vs. Tapestry HTML를 베이스로 한 Web 어플리케이션 개발로 한정하면, Tapestry와 JSF의 목표는, 거의 같은이라고 생각해도 좋을 것이다. 어느 쪽의 목표도, 재이용 가능한 UI컴퍼넌트로, Web 어플리케이션의 생산성을 올리는 것이다.

그 외의 Tapestry와 JSF가 비슷한 점은, UI컴퍼넌트와 비지니스 논리의 디커플링(decoupling) 방법이다. 이것은, 재이용 가능한 UI컴퍼넌트를 만들려면 , 어쩔 수 없는 과제이다. Tapestry는 OGNL을 이용하는 것으로써, 이 디커플링(decoupling)를 실현하고 있다. JSF에서는, Value Reference Expression라고 하는(OGNL에 상당한다) 기술 방법을 새롭게 정의해 이용하는 것으로 실현되고 있다.

다음은, Tapestry와 JSF의 차이점에 관심을 가져 보자. 최대의 차이는, 목표에 대한 어프로치의 선택방식이다. JSF는 Tapestry와 비교해 중후 장대인 어프로치를 취하고 있다. JSF에서는, 개발자는 보다 많은 코드를 쓸 필요가 있을 것이다. 이 결점을 보충하기 위해서(때문에), JSF에서는 개발툴의 이용을 거의 전제로 하고 있다. 한편, Tapestry는, 가능한 한 개발자의 부담이 가벼워지도록(듯이), 여기저기에 궁리가 집중시켜지고 있다. 특별한 개발툴이 없어도, 충분히 개발이 가능하다.

하나 더의 큰 차이는, JSF가 JSP의 이용을 상정하고 있는 것이다. 스크립트 렛이든, 태그 라이브러리든, Web 데자이나로부터 하면, (뜻)이유를 모르는 코드나 태그가 이용되는 것에 변화는 없다. JSP의 비주얼인 편집이 가능한 툴도 적고, 브라우저로 간단하게 프리뷰 하는 일도 할 수 없다. 결국, 엔지니어가 JSP를 작성하게 될 것 같다.

Struts vs. Tapestry Tapestry와 비교하면, Struts는 꽤 기본적인 체제이다. 대략적으로 말하면, Struts는, Servlet API와 JSP를 이용한 어플리케이션의 정형적인 부분(Controller)을 체제화해, Model와 View를 기술하는 것으로 어플리케이션을 개발할 수 있도록(듯이) 하고 있다. MVC의 분리에 의해,명확한것이 사실이지만, 재이용하기 쉽다고는 말하기 어렵다. 또, 기술해야 하는 코드도 Tapestry와 비교해 많다.

반대로, Struts가 좋은 장점이라면..기술관련 서적이 Tapestry보다 훨씬 많은 것이 사실이다.

Tapestry의 과제#

  1. 한국어로 번역되어 있지 않다.
  2. 버전업에 의해 사양이 자주 바뀐다.
  3. 습득이 어렵다.(Servlet API를 은폐하므로.)
  4. 문서가 불충분한 곳이 많다.

Tapestry의 메리트#

Web 어플리케이션은, 각층에서 HTML, HTTP, Java, SQL라고 한 다른 기술을 이용한 프로그램이므로, 일관성이나 재이용성을 실현하는 것은 어렵다. 그러나, presentation layer에서는, Tapestry는 이것을 실현하고 있다. Tapestry를 이용하면, HTML상의 파라미터명(< input >태그의 name 속성)과 HttpServletRequest로부터 취득하는 파라미터명(getParameter의 인수)이 일치하지 않는 버그나, 다른 페이지나 폼의 서브밋처리등의 URL의 관리와 결별할 수 있다. Tapestry를 이용하는 것으로, 최종적으로는, 보수하기 쉬운 Web 어플리케이션을 단시간에 손에 넣을 수가 있는 것이다.Tapestry는, 「여러가지 체제를 사용해 보았지만, 생각한 만큼 생산성이 오르지 않는다」라고 느끼고 있는 편에, 꼭 시험해 주셨으면 한 체제다.

OGNL란?#

Tapestry에서는, 사양으로부터 Java의 특정의 프로퍼티나 필드, 메소드에 액세스 하기 위해서, OGNL라고 하는 표기 방법을 사용한다. OGNL란, Object-Graph Navigation Language의 약어로, 오브젝트를 조작하기 위한 식 기술 언어이다. 언어라고 해도, 기본은 아주 간단하다.

rootObj라고 하는 Java의 인스턴스를 기점으로 했을 경우, OGNL의 「customer.name.length」라고 하는 기술은, 프로퍼티를 참조할 때는, Java의 「rootObj.getCustomer(). getName(). getLength()」라고 하는 기술에 상당한다. 한편, 프로퍼티를 설정할 때는, Java의 「rootObj.getCustomer(). getName(). setLength(값)」에 상당한다. OGNL로 JavaBeans의 프로퍼티명을 닷(.)으로 단락지어 기술하면, 적절한 Getter/Setter의 호출에 변환되는 것이다. 변환때, OGNL 라이브러리는, 리플렉션을 사용해 각 오브젝트로부터 적당한 아크셋사메솟드를 찾는다. boolean형을 돌려주는 Getter는, is로 시작되어도 get로 시작되어도 괜찮다.(el표현식jstl형식과 같다고 생각하면....)

「rootObj.findCustomer("Howard")」라고 하는 메소드를 호출을 실시하려면 , OGNL에서는 「findCustomer("Howard")」라고 기술한다. 「java.lang.Math.PI」라고 하는 static 필드를 참조하려면 , OGNL에서는 「@java.lang.Math@PI」라고 기술하면 좋다.

참고 URL#

참고 URL1 http://jakarta.apache.org/tapestry/index.html

참고 URL2 http://tidy.sourceforge.net/

참고 URL3 http://sourceforge.net/projects/jtidy/

참고 URL4 http://www.apache.org/dist/jakarta/tapestry/

참고 URL5 http://www.apple.co.jp/webobjects/

참고 URL6 http://www.ognl.org/

차 후...Myeclipse로 위의 에플리케이션 테스트해보기.#

위에 예제와 코드와 설명은 다소 읽는 이로 하여금 지루해 질 수 있다. 하지만 Tapestry의 존재개념부터 이해를 해야지만 앞으로 Tapestry를 다루게 될때 왜? 이렇게 하는가에 대한 문제제기를 해소 할 수 있다고 생각한다. 지금의 예제에서는 널리 사용하고 있는 Myeclipse를 가지고 위에 예제를 실행해 볼것이다. 다음편을 기대해주세요.

Add new attachment

Only authorized users are allowed to upload new attachments.

List of attachments

Kind Attachment Name Size Version Date Modified Author Change note
gif
1.gif 20.9 kB 1 29-Dec-2005 02:01 61.77.223.1
gif
2.gif 32.3 kB 1 29-Dec-2005 02:01 61.77.223.1
gif
3.gif 43.4 kB 1 29-Dec-2005 02:01 61.77.223.1
jpg
35tapestry_java_10.jpg 50.9 kB 1 29-Dec-2005 02:09 61.77.223.1
jpg
35tapestry_java_15.jpg 41.8 kB 1 13-Jan-2006 10:43 211.241.65.221
gif
5.gif 16.7 kB 1 29-Dec-2005 20:28 61.77.223.1
gif
6.gif 28.2 kB 1 29-Dec-2005 20:35 61.77.223.1
gif
dia.gif 88.3 kB 1 06-Jan-2006 17:28 211.241.65.221
gif
time.gif 14.1 kB 1 02-Jan-2006 00:05 210.206.221.21
« This page (revision-95) was last changed on 06-Apr-2006 09:45 by 211.241.65.221