IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
한국 developerWorks developerworks
[Open developerWorks]

이클립스 RCP를 이용한 주소록 개발



김인태
김인태 greatkit@gmail.com

2002년부터 본격적인 개발 업무를 시작한 5년차 개발자로, 현재 nhn에서 개인 커뮤니티 서비스 개발을 담당하고 있다. 주로 웹 애플리케이션 개발을 했으며, 우연히 이클립스 플러그인 프로그래밍을 접한 이후 플러그인 개발에 많은 관심을 갖고 있다. okjsp.pe.kr에서 활동중이며, 주말에는 대학 및 사회인 미식축구 심판으로 활동하고 있다.


난이도 : 초급
2006년 11월 28일


[오픈 디벨로퍼웍스]는 여러분이 직접 필자로 참가하는 코너입니다. 이번엔 김인태 님이 작성한 이클립스 RCP 기반의 주소록 개발 방법을 가상의 예제와 함께 살펴봅니다.

시작하기

이클립스 RCP(Rich Client Platform)를 이용하면 비교적 쉽게 기존의 상용 프로그램에 버금가는 품질(특히 UI 측면)의 프로그램을 작성할 수 있다. RCP를 이용하여, 웹 기반의 주소록 프로그램을 개발해보자. 이 예제에서는 이클립스 3.2버전을 사용한다.
RCP 어플리케이션은 플러그인 아키텍처에 기반하고 있다(만약 이클립스 플러그인 아키텍처에 익숙하지 않다면 먼저 플러그인 및 SWT/Jface에 관련하여 충분한 학습을 할 것을 권한다).

다음은 시작을 위한 몇 가지 절차이다.

  1. 이클립스를 실행한 후, File > New > Project를 선택한다.
  2. Plug-in Development 항목을 펼친 후 ‘Plug-in Project’를 더블 클릭하면 플러그인 프로젝트 마법사가 나타난다.
  3. 프로젝트명을 정한다. 여기서는 org.eclipse.rcp.pilot.addressbook이라 한다. Java 프로젝트임을 명시하고, 원하는 대상 Eclipse 버전(최소 3.1, 여기서는 3.2)을 선택한다.

이클립스의 플러그인 프로젝트
그림 1. 이클립스의 플러그인 프로젝트

마법사의 다음 페이지에서는 Plug-in ID와 다른 몇 가지 변수들을 정할 수 있다.

  1. "Would you like to create a rich client application?" 항목이 특별히 중요한 사항인데, RCP 애플리케이션을 작성하는 것이므로 당연히 ‘Yes’를 선택해야 한다.
  2. 나머지 설정 값들에 대해서는 (이 학습의 범위를 벗어나므로) 현재 설정 상태를 그대로 유지한다.
  3. Next > 를 누르고 계속 진행하자.

이클립스는 RCP 애플리케이션을 쉽게 작성할 수 있도록 해 주는 몇 가지 템플릿을 제공한다. 이를 활용하여 이 예제를 진행해 나갈 것이다.

  1. Create a plug-in using one of the templates 옵션이 활성화되어 있어야 한다(아마도 기본적으로 선택되어 있을 것이다)
  2. 이 상태에서 RCP Application with a view 템플릿을 선택한다. Finish를 누르면 프로젝트가 생성된다.
  3. 프로젝트가 생성되고 Plug-in Manifest 에디터가 열릴 것인데, Plug-in Manifest 에디터는 RCP를 설정하기 위한 각종 항목들을 이해하기 쉽게 표현하고 있다.

PDE 마법사를 사용하여 만든 프로젝트
그림 2. PDE 마법사를 사용하여 만든 프로젝트




위로


템플릿 실행해 보기

Plug-in Manifest 에디터의 Overview 페이지에 있는 Launch an Eclipse Application 링크를 눌러 보자. 링크를 누르면 썰렁한 워크벤치가 뜨는 것을 볼 수 있을 것이며, 우리는 이 결과를 조금 수정해 볼 것이다. (그림 3 참조).

그림 3
그림 3. 템플릿을 사용하여 순식간에 만들어 낸 RCP 어플리케이션

X-인터넷 애플리케이션 작성

아직까지 X-인터넷의 의미가 그렇게까지 명확한 것 같지는 않다. 다만 여기에서는 간단하게 Http 프로토콜을 이용하여 XML로 표현한 주소록 데이터를 가져와서 RCP 애플리케이션에 표현해 보는 정도로 마무리해 보도록 한다. 다음은 자동으로 생성된 프로젝트의 파일 목록이다. 여기서 우리는 View.java를 주로 수정할 것이다.

프로젝트 파일 목록
그림 4. 프로젝트 파일 목록

View.java의 처음 상태는 다음과 같을 것이다.

public class View extends ViewPart {
	public static final String ID = "org.eclipse.rcp.pilot.addressbook";

	private TableViewer viewer;

	class ViewContentProvider implements IStructuredContentProvider {
		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
		}

		public void dispose() {
		}

		public Object[] getElements(Object parent) {
			return new String[] { "One", "Two", "Three" };
		}
	}

	class ViewLabelProvider extends LabelProvider implements
			ITableLabelProvider {
		public String getColumnText(Object obj, int index) {
			return getText(obj);
		}

		public Image getColumnImage(Object obj, int index) {
			return getImage(obj);
		}

		public Image getImage(Object obj) {
			return PlatformUI.getWorkbench().getSharedImages().getImage(
					ISharedImages.IMG_OBJ_ELEMENT);
		}
	}

	public void createPartControl(Composite parent) {
		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL
				| SWT.V_SCROLL);
		viewer.setContentProvider(new ViewContentProvider());
		viewer.setLabelProvider(new ViewLabelProvider());
		viewer.setInput(getViewSite());
	}

	...
}

여기서 실제 작동에 필요한 중요한 부분은 다음과 같다. 이 예제에서는 명확한 구분을 우선하기 위하여 위의 내장 클래스를 일단 밖으로 분리해 놓을 것이다(package-private 등의 설계적인 관점은 무시하도록 한다).

  
public class View extends ViewPart {
	public void createPartControl(Composite parent) {
	}
}

TableViewer는 JFace이며, Button 및 테이블과 버튼의 배치는 SWT를 활용하였다. SWT/JFace 관련 사항은 이 문서에서 다루고자 하는 범위가 아니므로 다른 문서를 참조하도록 한다. 수정한 결과는 다음과 같은 모습이다.

그림 5
그림 5. RCP 애플리케이션 실행 화면

그림과 같은 결과를 나타내기 위해 매우 간단한 XML을 활용하였다. java.net.*과 jdom 패키지를 활용하여 아래의 XML 자료를 읽어와 표현한다. 애플리케이션 하단의 주소록 가져오기 버튼을 누르면 해당 xml이 있는 웹 서버에서 http 프로토콜을 사용하여 자료를 읽어 들인 후 파싱하여 테이블 뷰어에 표시한다.

addressbook.xml
  

<?xml version="1.0" encoding="utf-8"?>
<addressbook>
	<entity id="11" name="김삿갓" phone="01x-xxx-xxxx" place="회사" />
	<entity id="21" name="이순신" phone="01y-yyy-yyyy" place="학교" />
	<entity id="31" name="홍길동" phone="01z-zzz-zzzz" place="직장" />
</addressbook>


* 문제를 간단히 하기 위하여 정적인 xml 문서를 특정 웹 서버에 놓고 예제를 진행하였다. 예제의 소스를 받아서 실행하는 경우, 위의 xml 문서를 적당한 웹 서버에 위치시킨 후 예제 프로젝트 org.eclipse.rcp.pilot.addressbook.View의 createPartControl() 내부에 구현된 button.addSelectionListener() 서브 클래싱 구현체 내부의 URL 및 문서 경로를 적당히 변경하여 진행하도록 한다(기본적으로 localhost를 지정해 놓았다. 로컬 머신에 아파치 웹 서버 등을 설치하고 진행하면 될 것이다).




위로


제품화: RCP 배포

RCP 애플리케이션이란 현재 작업을 하고 있는 이클립스와 상관없이 완전한 하나의 독립적인 애플리케이션을 생성하는 과정이다. 배포본을 생성하기 위해 지금 작업중인 RCP 프로젝트에 product configuration 프로젝트를 추가한다.

  1. 현재 플러그인 프로젝트 위에서 마우스 오른쪽 버튼을 눌러 컨텍스트 메뉴를 호출한 후 ‘New > Product Configuration’을 선택한다.

  2. 새로이 생성할 설정 파일의 이름을 정한다. addressbook.product라 하자. 나머지 항목들은 기본값 그대로 둔다.

  3. Finish를 누른다.
  4. Product Configuration 편집기가 뜰 것이다. 여기서 RCP 프로젝트를 제품화하기 위해 필요한 플러그인 및 각종 요소들을 설정할 수 있다.

Overview 페이지에서

  1. (New... 버튼을 눌러) 제품 ID를 정한다. 대화 상자가 뜨는데, Defining Plug-in 항목에 해당 플러그인 프로젝트를 선택한 후 Product ID는 product 정도로 하면 될 것이다.
  2. Application 항목은 org.eclipse.rcp.pilot.addressbook.application이라 설정한다.
  3. Product Name을 정한다. 예를 들면 RCP Tutorial 1 정도가 적당할 것이다.
  4. Finish 버튼을 눌러 제품 출시를 위한 설정을 완료한다.

다음으로 Configuration 탭을 선택하자.

  1. Add... 버튼을 눌러 방금 만든 플러그인(org.eclipse.rcp.pilot.addressbook)을 고른 후
  2. Add Required Plug-ins 버튼을 눌러 의존하는 플러그인들을 더한다.
  3. 지금까지 진행한 작업을 저장한다.

지금까지 올바르게 진행했는지 확인해 보도록 한다. Overview 페이지의 Testing 절에서

  1. Synchronize 링크를 누른 후
  2. Launch the product 링크를 누른다.
제대로 했다면 앞 절에서 확인했던 것과 같은 결과를 볼 수 있을 것이다.

Eclipse에 상관없이 실행하기: 배포본 생성

우리의 목적은 사용자들이 애플리케이션을 만들 때 사용한 자바나 이클립스를 알 필요 없이 애플리케이션을 쓸 수 있도록 독립적인 애플리케이션을 배포하는 것이다. 실질적인 애플리케이션처럼 InstallShield 등을 통해 배포하는 형태를 원할 것이지만 이 예제에서 다루고 있는 범위를 벗어난다.
이클립스 플러그인 실행기가 제대로 동작하려면 대상들이 어떤 틀에 맞게 분포되어 있어야 하기에 여기에서는 간단한 형태로 이클립스 설치 디렉터리를 구성할 것이다. 해당 디렉터리에는 런칭 프로그램과 설정 파일 및 제품에서 필요로 하는 플러그인들이 들어 있어야 한다.

Product 설정 편집기의 Overview 탭에 있는 Exporting 절에서

  1. Eclipse Product export wizard 링크를 누른다.
  2. 루트 디렉터리로서 addressbook 같은 이름을 정한다.
  3. Destination 항목에서 Directory 옵션을 택하고 C:\deploy 같이 배포본이 생성될 디렉터리를 정한다.
  4. Finish를 누르면 결과물을 임시 디렉터리에 생성한다.
결과물이 생성된 디렉터리에서 런처 프로그램(eclipse 혹은 eclipse.exe)을 실행하고 애플리케이션이 뜨는 것을 본다. 런처 이름은 제품 설정 편집시 Launcher 탭에서 정할 수 있다.

결론

이상으로 RCP를 활용하여 X인터넷 애플리케이션을 작성할 수 있는 가능성을 살펴보았다. 내장된 HTTP 통신 모듈을 간략하게 구현하였지만 User-agent 설정을 활용한다면 기존의 웹 애플리케이션에서 생성하여 반환하는 뷰페이지를 XML로 전환할 수 있도록 설정할 수 있을 것이다.
이 예제처럼 단순한 화면 표시를 위한 부분은 기존의 웹 브라우저에 비해 특별한 장점을 찾을 수 없지만 테이블 셀의 수정이나 사용자가 원하는 임의적인 위젯 배치, 어떤 절차를 필요로 하는 작업에서 일일이 서버 측과 통신을 하지 않고 로컬에서 임시 작업 처리를 하는 작업 등에 RCP를 활용한다면 비교적 좋은 성과를 얻을 수 있을 것이다.
이 예제에서 사용한 소스코드는 다음 링크(org.eclipse.rcp.pilot.addressbook)를 통해 얻을 수 있다.



위로


참고 자료
Eric Clayberg, eclipse Building Commercial-Quality Plug-ins, Addison Wesley
Erich Gamma, Kent Beck, Contributing to Eclipse, Addison Wesley
Matthew Scarpine, SWT/JFace in Action, Manning


dW의 관련 기술 자료
WebSphere 플랫폼용 Eclipse 리치 클라이언트 애플리케이션 개발하기(한글)





이제 전문가의 글을 단순히 ‘보는 것’에서, 직접 여러분이 developerWorks의 필자가 될 수 있습니다. IBM developerWorks를 통해 공유하고 싶은 지식이 있으신 분들은 원고 기획안을 접수해주세요. 채택되신 분께는 소정의 원고료를 드립니다.
Open developerWorks 신청하기   MS워드 아이콘   아래아한글 아이콘



[지난 open dW 보기]

사이트 여행

dW 커뮤니티
포럼 | 블로그 | Spaces
dW Student Community

로컬 컨텐츠

행사 및 세미나

기획 기사

개발자 입문

튜토리얼 및 교육

TOP 10 인기자료

SW 다운로드

RSS 피드

뉴스레터
  
자바스크립트가 작동이 중지되었습니다. 이 기능을 수행하시려면 브라우저에서 자바스크립스트를 작동시켜 주시거나 이곳을 클릭해주세요.
Special offers
IBM SOA Sandbox 시험판
dW Student Community
로보코드
코드 트레이닝


    IBM 소개 개인정보 보호정책 문의