2008년 2월 1일 금요일

RIFE 시작하기(1) - Getting started.

http://rifers.org 에서 발췌한 내용을 번역 하였습니다.
번역: 이원찬(wonchan.lee@gmail.com)
-------------------------------------------------------

- Installing RIFE
앞서 안급했듯이 RIFE는 자바 플랫폼에서 빌드되었으므로 RIFE어플레케이션을 실행하기 위해서는 JDK를 설치해야 한다. Java는 http://java.sun.com/ 에서 다운로드 할 수 있다.

또한, 서블릿을 지원하는 웹서버도 필요하다. 이 튜토리얼에서는 Jetty를 선택했다. Jetty는 설정이 간편하고 사용하기가 쉽다. 이것은 http://jetty.mortbay.com/ 에서 다운로드 할 수 있다.

RIFE는 RIFE 사이트 http://rifers.org/downloads 에서 받을 수 있다. 여기엔 몇가지 다른 패키지들 중 하나를 선택할 수 있다.

새로운 어플리케이션을 시작할때 기본 패키지(base package)는 좋은 출발점이 된다. 이것은 RIFE 프레임웍을 비롯해 웹어플리케이션을 시작하는데 필요한 모든것을 모두 포함하기 때문이다. 압축파일 내부의 디렉토리구조는 단지 권장사항을 뿐이다. 본인의 취향에 따라 얼마든지 변경 할 수 있다. 단, 권장위치에 있는 web.xml파일은 war포맷으로 패키징 하기 쉬우며 서블릿엔진에 설치되기 쉽게 한다. jar파일은 단지 RIFE만 포함되어 있다. 이것은 RIFE를 손쉽게 업그래이드 할 수 있게 하기위한 배려이다.

홈디렉토리 내부에 Jetty와 함께 웹어플리케이션 디렉토리를 설정하자.
--------------------------------------------------------------------
mkdir ~/tutorial
cd ~/tutorial

jar xf {download directory}/jetty-{version}.zip
--------------------------------------------------------------------

Debian 3.1(Sarge)을 사용한다면 다음 명령으로 Jetty를 설치할 수 있을 것이다. Jetty는 /usr/share/jetty 디렉토리에 설치될 것이다. Ubuntu와 같은 Debian계열의 리눅스라면 모두 마챤가지일 것이다.
--------------------------------------------------------------------
apt-get install jetty
--------------------------------------------------------------------

Debian에서 Jetty패키지를 설치했다면 서비스(service)가 자동으로 시작된다. 기본적으로 8280과 8079포트를 사용하게 된다.

이제 테스트 어플리케이션을 webapps 서브디렉토리에 설치하자.
--------------------------------------------------------------------
cd jetty-{version}
cd webapps
--------------------------------------------------------------------

RIFE배포판의 압축을 푼다음 웹어플레케이션을 위한 기본 디렉토리들을 설정해야 한다.
--------------------------------------------------------------------
jar xf {download directory}/rife-base-{version}.zip
mv rife-base-{version} my-application
cd my-application

cd WEB-INF

mkdir classes
cd classes

mkdir rep
mkdir sites
mkdir elements
mkdir templates
--------------------------------------------------------------------

지금까지 잘해왔다. 위의 디렉토리 구조를 그대로 활용하는것은 좋은 출발점이 될 것이다.
--------------------------------------------------------------------
cd ../../..
cp -r my-application ../../blueprint
------------------------------------------------------------------

이제 간단한 RIFE어플레케이션을 만들기 위한 조각들을 채워넣을 준비가 되었다. 그전에 간단히 웹어플레케이션과 RIFE에 관한 약간의 설명을 하고싶다.

RIFE zip파일의 내용을 보았다면 거기에 RIFE를 위한 자바 클래스파일들을 비롯해 web.xml파일을 보았을 것이다. 이렇게 패키징된 어플리케이션은 어떤 어플리케이션 서버 에서나 웹어플리케이션 디렉토리에 바로 배치되어 사용될 수 있다.

zip파일에서 찾을 수 없는 유일한 실제 웹어플리케이션의 실제 구현부분은 빠른시일내에 스스로 작성해야 할것이다.

그전에, 완성된 RIFE어플리케이션들을 실행해 보길 바란다. 우리는 RIFE 웹사이트에서 예제패키지(example package)를 다운로으 받아 사용할 수 있다. 이 패키지들은 실행 및 테스트 할 수 있는 많은 예제를 포함하고 있다. 첫번째 예제인 "Hello World" 어플리케이션은 다음의 과정을 따른다.

먼저, webapps디렉토리로 돌아가 예제압축파일을 풀도록 한다.
------------------------------------------------------------------
cd ~/tutorial

jar xf {download directory}/rife-examples-{version}.zip
cd rife-examples-{version}
------------------------------------------------------------------

RIFE를 웹어플리케이션의 lib디렉토리에 설치한다. jar파일을 RIFE사이트에서 다운로드받아 정확한 디렉토리에 넣어라.
------------------------------------------------------------------
mkdir 01_helloworld/WEB-INF/lib
cp ROOT/WEB-INF/lib/rife-{version}.jar 01_helloworld/WEB-INF/lib/
mv 01_helloworld ../jetty-{version}/webapps/
------------------------------------------------------------------

*주의사항*
jar파일을 서블릿엔진의 lib나 ext 또는 서블릿컨테이너의 공용라이브러리 영역에 넣지마라. 각 어플리케이션은 고유의 RIFE jar파일을 필요로 한다.

이제 어플리케이션을 시작하고 테스트할 수 있다.
------------------------------------------------------------------
cd ~/tutorial/jetty-{version}

java -jar start.jar
------------------------------------------------------------------

Debian사용자의 경우 위와같이 Jetty를 실행하면 log4j의 에러메시지를 보게 될것이다. Debian에서 Jetty를 실행하기 위해서는 아래와 같이 하라.
------------------------------------------------------------------
/etc/init.d/jetty start
------------------------------------------------------------------

Jetty를 실행할때 예외상황(Exception)을 보게될것이다. my-application웹어플리케이션은 추가 라이브러리들을 필요로 한다. 이것들은 잠시후에 추가하게 될것이다. 이 파트에서 중요한것은 HelloWorld예제를 살펴보는 것이다.

예제를 실행해보기 위해 웹브라우저에서 http://localhost:8080/01_helloworld/home 을 보라. "Hello world." 라는 메세지를 보게 될것이다.

다음 섹션에서는 이 예제에 대해 자세히 설명할 것이다.

- A simple RIFE application
모든 RIFE어플리케이션의 중심은 저장소(repository)이다. 이것은 설정데이터, 사용자, 데이터소스와 같은 각기 다른 어플리케이션의 영역을 유지시켜 준다. 이 영역들을 참가자(participants)라 부른다.

repository는 어플리케이션의 어디서나 이용가능하며 초기화와 어플리케이션 전반에 걸친 자원(resources)들에 접근할 수 있는 편리한 방법을 제공한다.

Hello World 예제에서 repository파일은 ~/tutorial/jetty-{version}/webapps/01_helloworld/WEB-INF/classes/rep/participants.xml 에 위치한다. 지금부터는 rep/participants.xml과 같이 앞의 경로 부분은 생략하고 표기하겠다.

------------------------------------------------------------------
Hello World를 위한 participants.xml
------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rep SYSTEM "/dtd/rep.dtd">

<rep>
<participant param="sites/helloworld.xml">ParticipantSite</participant>
</rep>
------------------------------------------------------------------

이것은 정말 단순한 예제이다. 사이트를 위한 participant 하나만을 가지고 있다. param속성에 site 파일이 sites/helloworld.xml 에서 찾을 수 있음을 명시했다. 실제 어플리케이션 에서는 이보다 더 많은 participants를 가지게 될것이다.

한 사이트는 여러개의 요소(elements)들로 이루어 진다. element는 어플리케이션에서 가장작은 논리적 단위이다. Elements는 서로 연결되어 웹사이트의 흐름(flow)으로 표현된다.

이것은 전자부품들이 쓸모있으려면 서로 조립되어야 하는것과 마챦가지로 생각할 수 있다. 전자부품은 하나만으로는 아무런 쓸모가 없지만 다른것들과 결합되었을땐 놀라운 제품이 탄생할 수 있다.

같은 부품도 다른곳에 놓여지거나 순서를 달리할 수 있다. 이것은 극적인 변경을 부품의 파괴나 다른 새로운것을 생산하지 않고 가능하게 하는 기능을 구현할 수 있게 한다.

다시말해, 제품을 개선하기 위해 기존의 연결된 부품사이에 새로운 부품을 삽입해야 할 경우가 있다. 이것은 복잡한 작업이 아니다. 단지, 기존의 연결선을 제거하고 새로운 부품에 연결하기만 하면 된다. 당신을 골치아프게 하지 않고도 제품의 다른 기능들은 계속 작돌할 것이다.

RIFE의 element는 전자부품에 비유되며 flow는 연결선(wiring)에 비유할 수 있다. 어떤 어플리케이션의 element도 어느 어플리케이션에서나 손쉽게 연결시킬 수 있다.(rewiring)

각 element는 입력(input)과 출력(output)을 가질 수 있다. 이것들은 연결되며 데이터는 서로 연결고리에 따라 전달될 것이다.

sites/helloworld.xml 에서와 같은 사이트 구조를 보면 HELLOWORLD라는 하나의 element만 포함한 것을 보게될 것이다. 이것은 /home 이라는 URL로 매핑되어 있다.

------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE site SYSTEM "/dtd/site.dtd">

<site>
<element id="HELLOWORLD" implementation="tutorial.helloworld.HelloWorld" url="home"/>
</site>
------------------------------------------------------------------

첫번째 예제가 단지 하나의 element만 가지므로 거기엔 입력이나 출력, 연결고리가 없다. 그러므로, 전체 element가 site파일 안에 포함되어 있다. 이 경우를 제외하고 재사용가능한 element를 생성하려면 이것을 고유한 xml파일로 분리해야 한다. 이것에 대해서는 다음예제에서 자세히 다루기로 하자.

여기에서 지금 주목해야 할 부분은 element태그의 implementation 속성이다. element의 구현(implementaion)은 자바클래스 이거나 자바소스일 수 있으며 자동으로 컴파일될 것이다. 또는 Groovy와 같은 지원 가능한 자바 스크립팅 언어일 수도 있다.

현재 구현부는 단순히 인사말을 출력하는 자바 클래스 이다. 이것은 HelloWorld.java에 구현되어 있다.

------------------------------------------------------------------
Hello World 구현체
------------------------------------------------------------------
package tutorial.helloworld;

import com.uwyn.rife.engine.Element;
import com.uwyn.rife.template.Template;

public class HelloWorld extends Element
{
public void processElement()
{
Template template = getHtmlTemplate("tutorial.helloworld");
template.setValue("hello", "Hello world.");
print(template);
}
}
------------------------------------------------------------------

요소(element) 구현체(implementation)는 반드시 com.uwyn.rife.engine.Element 클래스를 상속하고 processElement()메소들를 구현해야 한다. 보는바와 같이, 이 요소(element)는 템플릿을 이용하여 "Hello world."를 출역한다. 템플릿에 대해서는 뒤에 자세히 다루자.

위 자바코드는 tutorial폴더에 정의된 helloworld란는 템플릿(HTML파일)을 사용한다.

------------------------------------------------------------------
helloworld 템플릿(HTML)
------------------------------------------------------------------
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><r:v name="hello"/></title>
</head>

<body>
<r:v name="hello"/>
</body>
</html>
------------------------------------------------------------------

RIFE는 element 정의를 자바코드와 연결하여 템플릿에 전달할 책임이 있다.

다음에는 number guess 어플리케이션에 대해 살펴 보겠다.

댓글 없음: