 |  |
|
Chris Aniszczyk, Software Engineer, IBM Benjamin Muskalla, Software Engineer, Innoopract Informationssysteme GmbH
2008 년 2 월 19 일 Rich Client Platform (RCP)은 엔터프라이즈 애플리케이션을 구현할 수 있는 강력한 플랫폼 기술입니다. "Rich
Client Platform" 시리즈 Part 1에서 설명했던 것처럼, Rich Ajax Platform (RAP)의 도움으로, 웹 애플리케이션에 기존 코드 베이스와 개발 기술을 재사용할 수 있습니다. 또한, RAP에는 몇 가지 주목할 만한 기능들이 있는데, 이러한 기능들로 인해 웹 개발이 더욱 수월해 집니다. 이 글은 Hello World 예제를 넘어서, 몇 가지 핵심 개념들을 설명하고, RAP에서 제공되는 고급 기능을 사용하는 방법을 설명합니다.
새로운 기능을 알아보기 전에, RAP가 어떻게 구축되었는지, 왜 이것이 중요한 것인지를 설명하도록 하겠다. 그리고 나서, 백그라운드 job, 사용자 인터페이스(UI) 커스터마이징) 같은 흥미로운 주제들부터 시작하여, 보다 고급 주제들인 커스텀 위젯과 테마에 대해서 알아보도록 하겠다. RAP가 어렵다고 느껴진다면 Part
1의 참고자료를 참조하라.
RAP의 아키텍처
RAP를 기반으로 한 애플리케이션을 효율적으로 개발하려면, 이것이 어떻게 작동하는지를 알아야 한다. 내부 메커니즘에 대해 장황하게 떠들어서 여러분을 지루하게 하는 대신, RAP에서의 개발에 도움이 될만한 기본적인 개념들만 설명하도록 하겠다. 다음 그림은 RAP와 RCP를 대조한 그림이다.
그림 1. RAP와 RCP
여러분도 보듯, RAP는 두 부분으로 나뉜다. 한 편에는 Equinox (OSGi 스팩의 Eclipse 구현)에서 실행되는 서버 측 조각이 있다. 다른 편에는, 클라이언트 조각이 있는데, 이것은 여러분이 브라우저를 통해 볼 수 있는 것이다. 양 측이 이벤트를 교환하는데, UI는 적절하게 이러한 이벤트를 업데이트 한다. 다시 말해서, 대부분의 코드가 서버에서 실행되고, 씬 클라이언트(thin-client) 측은 필요할 경우에만 업데이트 된다. 따라서 클라이언트 머신에 애플리케이션을 설치할 필요 없이 깨끗한 자바™ 애플리케이션을 실행할 수 있다는 이점이 있다.
RAP는 RCP가 아니다!
 |
양 측에서 실행되는 애플리케이션 구축하기
RAP가 RCP는 아니지만, RAP와 RCP 애플리케이션 간 많은 코드를 공유할 수는 있다. 이를 위해서, RAP와 RCP에 사용될 수 있는 UI 코드를 포함하고 있는 베이스 플러그인으로서 작동할 한 개의 플러그인을 갖는 것이 권장된다. MANIFEST.MF에 Import-Package를 사용하여 의존성을 만족시킨다. 이렇게 하면 베이스 플러그인이 RAP 또는 RCP의 패키지를 사용할 수 있다. 특정 구현에 얽매이지 않는다. 베이스 플러그인을 설정한 후에, 두 개 이상의 플러그인을 갖추고, 하나는 RAP 스팩 코드에, 다른 하나는 RCP 스팩 코드에 사용한다. 마지막으로, 두 개의 워크스페이스를 갖추어서, 하나는 대상 플랫폼을 RAP용으로 설정하고, 다른 대상 플랫폼은 RCP용으로 설정한다. 향후에는, 이것이 RAP와 RCP에서 실행될 코드를 작성하기가 더욱 쉬워질 것이다. |
|
이 섹션의 도발적인 제목은 여러분을 겁먹게 하려는 것이 아니라, 여러분이 알아야만 하는 중요한 사실이다. Part
1에서 배웠던 것처럼, RCP 애플리케이션을 웹 실행 RAP로 마이그레이션 하는 것은 단순하다. RCP 애플리케이션을 개발하는 동안에는, 한 번에 한 명의 사용자만이 이 애플리케이션으로 작업하게 될 것이다. 반대로, 서버에서 실행되는 RAP 애플리케이션은 동시에 (수 천명이 아니라면) 여러 사용자에 의해 사용될 수 있다. 이는 RAP 애플리케이션 개발에 사용되는 몇 가지 개념을 다시 생각하게끔 만든다. 한 가지 재미있는 측면은, singleton 패턴을 구현하는 클래스의 특성이다. singleton은 소위 "애플리케이션 범위" 고유의 것이다. RAP 애플리케이션의 여러 범위들과 구분된다:
-
애플리케이션 범위
- 애플리케이션 범위는 모든 사용자가 사용할 수 있는 가장 넓은 범위이다. singleton은 애플리케이션에 고유한 것이므로, 애플리케이션 범위에 존재한다. 다시 말해서, 모든 애플리케이션 사용자들은 같은 singleton 인스턴스를 사용하고 있다. 이는 좋은 점이 있지만, 인스턴스가 일부 사용자들만의 정보를 갖고 있을 경우에도 좋은 것은 아니다.
-
세션 범위
- 세션 범위는 현재 사용자만 사용할 수 있는 현재 사용자 세션에 속한다. 특정 세션에만 국한된 singleton을 구현하려면, RAP에서 제공되는
SessionSingletonBase 클래스를 사용할 수 있다. 이 클래스를 확장하고, getInstance 메소드를 오버라이드 함으로써, 클래스는 singleton과 같이 작동하지만, 세션에서만 사용할 수 있다.
-
요청 범위
- 요청 범위는 이 셋 중에서 가장 작은 것이다. 요청이 처리되는 경우에만 사용할 수 있다. 대부분의 경우, 이 범위는 일반 개발자들과는 관련이 없다. (RAP의 라이프 사이클 개념의 일부를 취해야 하는 경우는 제외)
백그라운드 job
RAP의 가장 흥미로운 기능 중 하나는 Eclipse job 프레임웍 지원이다. 이러한 job의 도움으로, UI가 응답 중일 때, 백그라운드에서 장기 실행 태스크를 실행할 수 있다. 이것이 어떻게 작동하는지를 보기 위해 job을 스케줄링하는 하나의 액션을 사용하여 Part 1의 메일 애플리케이션을 확장한다. (Listing 1)
Listing 1. 액션 추가하기 (ApplicationActionBarAdvisor.java)
....
private Action progressAction;
...
protected void makeActions(final IWorkbenchWindow window) {
...
progressAction = new SampleProgressAction();
progressAction.setText("Count me!");
progressAction.setId("progress.action");
register(progressAction);
}
...
protected void fillCoolBar(ICoolBarManager coolBar) {
...
toolbar.add(progressAction);
}
|
job API 외에도, RAP는 job 핸들링을 위한 UI도 제공한다. 워크벤치에서 이 기능을 실행하려면, Eclipse에 진행 인디케이터를 보여주도록 명령한다. (Listing 2)
Listing 2. 진행 인디케이터 실행하기 (ApplicationWorkbenchWindowAdvisor.java)
...
public void preWindowOpen() {
...
configurer.setShowProgressIndicator(true);
}
...
|
가장 재미있는 부분은 그 다음이다: 바로 job이다. 우리 예제는 단순한 구현(Listing 3)으로서, 변수를 특정 분량까지 늘리고, UI에 어떤 일이 일어나는지를 볼 수 있도록 다음 단계까지 기다린다.
Listing 3. job (SampleProgressAction.java)
package rap.mail;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.Action;
public class SampleProgressAction extends Action {
private static final int TASK_AMOUNT = 100;
public void run() {
Job job = new Job("Long Running Action:") {
protected IStatus run(final IProgressMonitor monitor) {
monitor.beginTask("Number counting", TASK_AMOUNT);
for (int i = 0; i < TASK_AMOUNT; i++) {
if (monitor.isCanceled()) {
monitor.done();
return Status.CANCEL_STATUS;
}
int done = i % TASK_AMOUNT;
monitor.subTask("work done: (" + done + "%)");
monitor.worked(1);
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
monitor.done();
return Status.OK_STATUS;
}
};
job.setName(job.getName() + " " + job.hashCode());
job.setUser(true);
job.schedule();
}
}
|
애플리케이션을 시작하고 액션을 클릭한 후에, 새로운 다이얼로그가 나타나서 현재 실행중인 job의 진행 상태를 보여준다. job이 끝날 때까지 기다리기가 싫다면, Run in background를 클릭하여 이를 숨긴다. 상태 바에 있는 진행 아이콘을 클릭하여 Progress View를 열 수도 있다. 동시에 실행되는 job이 더 많이 있다면, Progress View에서 이들을 쉽게 볼 수 있다.
그림 2. 백그라운드 job
브랜딩(Branding)
대부분의 RCP 기반 및 RAP 기반 애플리케이션의 경우, 애플리케이션의 브랜딩(branding)이 필요하다. 브랜딩이란, 여러분의 의도에 맞게 애플리케이션의 모습을 수정하는 것으로서, 기존의 통합된 브랜딩에 순응하는 것도 이와 같은 것이다. RCP 애플리케이션에서 작업했다면, 애플리케이션 브랜딩에 도움이 되는 .product 파일의 개념이 있다. RAP는 또 다른 플랫폼(웹)을 타겟팅 하기 때문에, 애플리케이션을 커스터마이징 하기 위해서는 일부 추가 작업을 해야 한다.
그림 3. Manifest Editor와 샘플 브랜딩
RAP 애플리케이션을 커스터마이징 할 수 있는 여러 방법들이 있다.
| 애트리뷰트 | 설명 |
|---|
| servletName |
servletName은 애플리케이션이 외부 세계에 사용될 수 있도록 하는 서블릿의 이름을 정의한다. 애플리케이션의 URL은 http://<host><port>/<servletName>과 같다. |
|---|
| defaultEntrypointId |
startup 매개변수 없이 애플리케이션에 액세스 할 때 기본적으로 로딩될 수 있는 한 개의 엔트리 포인트를 갖고 있을 때, defaultEntrypointId를 정의할 수 있다. |
|---|
| themeId | 브랜딩에 사용될 테마가 여기에서 정의될 수 있다. org.eclipse.rap.ui.themes의 확장에 의해 정의된 테마용 ID를 제공해야 한다. themeId 없이, RAP 표준 테마가 사용된다. |
|---|
| title | 페이지의 타이틀 — 대부분의 브라우저에 있는 윈도우 타이틀 또는 탭의 타이틀로서 나타나는 부분 — 이 이 애트리뷰트를 사용하여 커스터마이징 될 수 있다. |
|---|
| favicon |
favicon은 브라우저의 주소 바에 보이는 아이콘이다. 브라우저에 디스플레이 될 유효한 .ico
file이 되어야 한다. |
|---|
| body | RAP 인덱스 페이지에 커스텀 (X)HTML 마크업에 대한 필요가 있다면, 생성된 인덱스 페이지의 바디 태그 안에 포함될 body 애트리뷰트로 유효 (X)HTML 파일을 등록할 수 있다. |
|---|
| exitConfirmation | 비어있지만 않다면, RAP 애플리케이션을 떠나고자 할 때 exitConfirmation에 있는 스트링이 사용자에게 보인다. 이는 사용자가 무의식적으로 브라우저 윈도우/탭을 닫는 것을 방지한다. |
|---|
새로운 브랜딩으로 애플리케이션을 재시작 한 후에, 결과를 볼 수 있다.
그림 4. 새로운 브랜딩의 애플리케이션
테마
RAP 애플리케이션의 테마는 룩앤필(look and feel)을 정의한다. RCP 워크벤치의 테마 지원이라기 보다는, 윈도우, 버튼의 룩(look)을 정의하는 운영 체계의 지원에 가깝다. 일반적으로, RAP 테마에서는 다음 사항들을 정의할 수 있다:
- 커스텀 색상
- 커스텀 폰트
- 커스텀 보더
- 커스텀 넓이와 박스 넓이 (패딩 등)
- 커스텀 이미지와 아이콘
하지만 실제로 커스터마이징 가능한 측면은 여러분이 테마를 지정하고 있는 특정 컨트롤에 의존한다. 일부 컨트롤은 더 많은 유연성을 허용하지만, 다른 것은 다소 유연하지 못하다. 예를 들어, 기본 룩앤필과 커스텀 테마 간 차이는 그림 5와 같은 모습이 될 수 있다.
그림 5. 커스텀 테마
테마 만들기
RAP에서, 테마 파일은 단순한 자바 프로퍼티 파일이다. theme-template.properties라고 하는 템플릿은 RAP org.eclipse.rap.rwt 플러그인의 src/ 디렉토리에 있다. 여러분은 커스터마이징에 관련된 프로퍼티만 지정해야 한다. (정의되지 않은 프로퍼티는 기본 값에 머문다.) 아래는 프로퍼티 값의 신택스이다. 다음은 간단한 테마 파일의 예제이다.
Listing 4. 테마 파일
# Alternative Demo Theme
#
# Frame border for group boxes
# default: 1 solid #aca899
group.frame.border: 2 dotted #56a0ea
# Font for title bar of Shells
# default: bold 11 "Segoe UI", Corbel, Calibri, Tahoma, "Lucida Sans Unicode", sans-serif
shell.title.font: bold 15 "Trebuchet MS", Arial, Helvetica, sans-serif
# Height of the title bar of Shells
# default: 18
shell.title.height: 25
...
|
테마 등록하기
테마를 사용할 수 있도록 하려면, org.eclipse.rap.swt.themes 확장 포인트로 이를 등록해야 한다. 애플리케이션 프로젝트의 plugin.xml에서, Listing 5와 같은 확장을 추가한다.
Listing 5. 테마 만들기
<extension
point="org.eclipse.rap.swt.themes">
<theme
id="org.eclipse.rap.dw.demotheme"
name="Alternative Demo Theme"
file="theme1/theme.properties" />
</extension>
|
테마 활성화 하기
테마를 활성화 하려면, 브랜딩에 themeId를 설정해야 한다. 새롭게 생성된 이름의 ID를 설정한다: org.eclipse.rap.demo.alttheme. 애플리케이션을 재시작 한 후에, 새로운 스타일의 애플리케이션을 볼 수 있다.
그림 6. 커스텀 테마 실행
커스텀 위젯
 |
두 플랫폼에서 실행되는 애플리케이션 구현하기
The Google Web Toolkit과 RAP는 자바 기술을 사용하여 Rich Internet Applications를 코딩한다는 점에서 비슷하다. 큰 차이는 GWT가 클라이언트에서 실행되는 반면, RAP는 주로 서버에서 실행된다는 점이다. RAP가 서버에서 실행되기 때문에, 전체 자바 API에 액세스 할 수 있고, OSGi를 통해 유명한 Eclipse 플러그인 모델을 활용할 수 있다. Eclipse 관점에서, GWT는 독립형 SWT 애플리케이션(단순한 위젯 툴킷)으로서, RAP는 RCP 스타일의 접근 방식을 웹 애플리케이션에 적용했다. |
|
중요한 일부터 먼저 하기: RAP에는 두 가지 유형의 커스텀 위젯이 있다. 기존 위젯들을 결합하여 새로운 것을 만들거나, owner-drawn 위젯으로도 알려진 커스텀 위젯을 개발할 수 있다. 복합 위젯의 경우, SWT(RCP)와 서버 측(RAP)와 차이가 없다. 대부분의 경우, RAP 애플리케이션에서는 기존 복합 위젯들을 재사용할 수 있어야 한다.
보다 복잡한 케이스는 실제 커스텀 위젯을 만드는 것이다. RAP로 위젯을 개발할 때, 두 개의 다른 런타임을 갖고 있다는 것을 알아야 한다: 서버 측 구현과 클라이언트 측 구현. 서버에서, 위젯은 커스텀 위젯의 사용자에 의해 소비되는 퍼블릭 API를 가진 facade이다. 클라이언트에서, 실제 구현은 JavaScript로 실행된다. 트릭은 클라이언트와 서버 부분들을 연결하는데 있다. RAP는 라이프 사이클로 알려진 개념이 있는데, 여기에서 모든 위젯이 고려 대상이다. 라이프 사이클은 위젯의 클라이언트와 서버 간 데이터 초기화 및 교환을 담당하고 있다. 커스텀 위젯의 구현은 이 글의 범위를 벗어나므로, RAP 도움말 문서에서 커스텀 위젯에 관한 내용을 참조하기 바란다. (참고자료) 그림 7은 SWT 위젯에 캡슐화 된 Google Maps의 스냅샷으로서, 모든 위젯들과 마찬가지로 액세스 될 수 있다.
그림 7. Google Maps RAP 위젯
결론
Part 1에서는, 기존 RCP 애플리케이션들을 실제 웹 애플리케이션으로 전환하는 것이 얼마나 쉬운지를 설명했다. 이 글에서는, RAP가 웹 개발에 많은 커스터마이징 기회를 가져다 주는 재미있는 기술이라는 것을 증명했다. the Rich Client Platform (RCP), 서버 측의 Equinox, 웹 브라우저를 사용함으로써, RAP에서는 특별한 설정 없이 애플리케이션을 실행할 수 있다. 더욱이, RAP는 애플리케이션 개발자들이 기존 기술을 재사용 하고, 세계적 수준의 툴을 사용하여 웹 애플리케이션을 구현할 수 있도록 하는 재미있는 특성을 지녔다. 결국, RAP가 데스크탑과 웹 브라우저 측면 모두에서 최상의 힘을 발휘한다는 것을 알았다.
다운로드 하십시오 | 설명 | 이름 | 크기 | 다운로드 방식 |
|---|
| 예제 코드 | os-eclipse-richajax2-mail-project.zip | 38KB | HTTP |
|---|
참고자료 교육
제품 및 기술 얻기
-
IBM 제품 평가판 다운로드, DB2®, Lotus®, Rational®, Tivoli®, WebSphere®.
-
IBM 시험판 소프트웨어를 다운로드 하여 차기 개발 프로젝트를 혁신해보라(다운로드 또는 DVD 제공).
토론
필자소개  | 
|  | Chris Aniszczyk는 IBM Lotus 팀에서 OSGi 관련 개발 분야의 소프트웨어 에지니어이다. 오픈 소스에 대한 강한 열정을 지니고 있으며 Gentoo Linux로 작업하고 있다. 몇몇 Eclipse 프로젝트(PDE, ECF, EMFT)의 커미터로서도 활약하고 있다. 언제라도 오픈 소스와 Eclipse에 대해 이야기할 준비가 되어 있다. |
 | 
|  | Benjamin Muskalla는 Innoopract Informationssysteme(Karlsruhe)의 소프트웨어 개발자 겸 컨설턴트이다. Rich Ajax Platform (RAP) 프로젝트의 커미터이며, 워크벤치 구현을 담당하고 있다. Eclipse Platform의 적극적인 기여자로도 활동하고 있다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|  |