1 개요

이클립스 RCP(Rich Client Platform) 자바로 독립 응용 프로그램을 만들기 위한 강력한 도구를 제공한다. 응용 프로그램을 만들다 보면 본래 기능보다 메뉴라든지, 도구 모음(toolbar) 처리나 프로그램 설정 관리 같은 기능들을 구현하는  오히려  많은 노력과 시간이 투자되경우가 많다. 이클립스 RCP 이러한 문제로부터 프로그래머를 해방시킨다.

지금부터 이클립스 RCP 활용해 예제 프로그램을 만드는 과정을 소개하고자 한다. 직접 따라 해보면, RCP 이용해 그럴 듯한 프로그램 하나를 개발해볼  있을 것이다. 

 

2 예제 프로그램 생성하기

이클립스 RCP 프로그램을 시작하려면 예제 프로그램에서 출발하는 것이 좋다(물론 수정하다보면 나중에는 원본 예제가 모두 사라지게 되겠지만…).

 

프로젝트 생성

다음과 같이 플러그인 프로젝트 만든다.

 

1.  Select a wizard: Plug-in Project 선택하고 Next 클릭

2.  Plug-in Project: Project Name MyRCP 입력하고 Next 클릭

3.  Plug-in Content: Rich Client Application 부분을 Yes 수정  Next 클릭

4.  Templates: RCPMail Template 선택하고 Next 클릭

5.  RCP Mail Template: 그냥 Finish 클릭

 

이렇게 하면 아래와 같이 간단한 전자메일 클라이언트가 만들어진다.

 


그림 1. 예제 프로젝트 생성 모습

 

 화면 중앙의 Launch an Eclipseapplication 부분을 클릭하면 MyRCP 실행된다.

 

3 전자메일 클라이언트를 파일 탐색기로 개조하기

이클립스 RCP 상당 부분을 설정만으로 가능하며, 프로그래밍을 하더라도 응용 프로그램의메뉴, 도구 모음 등은 최소한의 코드로   있게 되어 있다. 여기서는 프로그램적 요소를 중심으로 수정해 MyRCP 프로그램을 간단한 파일 탐색기 형태로 만들어  것이다.  이렇게 함으로써 간단한 RCP프로그램의 구조를 파악할  있을 것이다



그림 2. MyRCP 최초 실행 모습

 

3.1 전자메일 리스트 창을 파일 탐색기 수정하기

예제 프로그램에서 왼쪽 네비게이션  부분을 파일 탐색기 수정해 보자. 예제 프로그램의NavigationView.java 열어보면 jface 프로그래밍이  것을 확인할  있다. 물론 jface사용하면 편리한 점이 많으나 여기서는 swt 사용해 간단한 파일 탐색기 만들어 보겠다(jface 사용하면 좀더 풍부하게 그리고 효과적으로 응용 프로그램을 작성할  있으므로RCP프로그램을 잘하려면 jface 익혀두는 것이 좋다).

NavigationView ViewPart 자식 클래스이므로 createPartControl(Composite) setFocus() 파일 탐색기 기능을 하는 코드를 작성하면 된다(참조 NavigationView.java)

 


그림 3 NavigationView 수정하여 실행

 

레이지 로딩(lazy loading) 구현하기

NavigationView에서 보면 트리 컴포넌트를 구현할  간단한 팁이 들어 있다. 파일 리스트를트리 형태로 보여   목록을 모두 읽을 필요는 없다. 성능 저하를 막기 위해 참조가 발생했을  자식 정보를 읽어 들이도록 코딩된 모습을 확인할  있다.

 

private void buildChildItem(TreeItem item,File file, boolean isroot) {

       if(isroot)

               item.setText(file.getAbsolutePath());// 아이템 루트이면 절대 경로 라벨로 사용

       else

               item.setText(file.getName());// 아이템 루트 아니면 이름만 라벨로 사용

        if(file.isFile()) {

                           item.setText(1,formatSize(file.length()));

                           item.setText(2,formatTime(file.lastModified()));

         }

             item.setImage(getImage(file));

             item.setData("path",file);

             if (hasChild(file)) {

                           item.setExpanded(false);

                           newTreeItem(item, 0); // 더미 아이템

             }

}

 

트리에서 특정 노드의 자식을 보여   해당 아이템에 자식이 존재하는지만을 확인한  만약 자식이 존재한다면 더미 아이템을 추가해 놓고 펼침(expand) 상태를 false  놓는다. 그렇게 하면 해당 트리 아이템 자식이 존재한다는 [+] 표시 보이게 된다. Expand 이벤트가발생할   아이템이 더미 아이템을 삭제하고 실제 자식 아이템들을 보여준다.

다음으로 해당 아이템 펼쳐질  이전에 방문했는지를 검사하여 방문한 적이 없는 아이템 대해서만 방문 기록을 세팅을 하고 buildChild 통해 자식 트리 초기화한다.

 

fileTree.addListener(SWT.Expand, newListener() {

             publicvoid handleEvent(final Event event) {

                           finalTreeItem item = (TreeItem) event.item;

                           if (item.getData("visited") ==null) { // 이전에 방문했는지 확인

                                        item.setData("visited","true"); // 해당 아이템에 방문했음을 설정

                                        buildChild(item);

                           }

             }

};

 

3.2 메시지 창을 파일 뷰어 수정하기

예제에서 오른쪽 메시지 창은 View.java 구현되어 있다. 이것을 매개변수 파일 이름을 받아 화면에 파일 내용을 보여주는 파일 뷰어 수정한다(참조 View.java)
. 
단지 선택된 파일을 읽어 들이는 것이기 때문에 기술적으로 복잡할 것은 없지만 다만 열리는 창에 파일 이름 전달하는 방법이 간단한 이라   있다.

 

MyRCP 프로그램의 텝윈도우 Open Logic

기본적으로   독립적인 컴포넌트다. 따라서 다른 창에서 명시적으로 정보를 전달하기보다는 이벤트 모델을 통해 창들간에 데이터를 전송하는 것이 좋은 방법이나 여기서는 Secondary ID 파일 이름을 전달하는 약간의 트릭을 이용해 전달하고 있다.

 

public static HashMap selection = new HashMap();

public static void openView(String viewId,String path) {

             if(path == null)

                           return;

             IWorkbenchWindowwindow = MyRCPPlugin.getDefault().getWorkbench()

                                        .getActiveWorkbenchWindow();

             selection.put("" +path.hashCode(), path);

             try{

                           window.getActivePage().showView(viewId,"" + path.hashCode(),

                                                     IWorkbenchPage.VIEW_ACTIVATE);

             }catch (PartInitException e) {

                           MessageDialog.openError(window.getShell(),"Error",

                                                     "Erroropening :" + e.getMessage());

             }

}

 

Secondary ID에는 특수 문자를 사용할  없기 때문에, HashMap 파일 이름의 해시 저장하고 에서 해시 코드 사용해 넘겨진 파일 이름 알아내는 방식을 취하고 있다.  방식을 이용할 경우selection(HashMap) element 수가 계속 늘어날 여지가 있다.

다음 코드는  createPartControl()에서 전달되는 Secondary ID 이용해 파일 이름을 알아내고 화면에 출력하는 것이다.

 

public void createPartControl(Compositeparent) {

             Stringhash = this.getViewSite().getSecondaryId();

             Stringpath = (String)Perspective.selection.get(hash);

             if(path == null)

                           return;

 

3.3 시작 메뉴 수정  초기화

이제 메뉴를 수정한다. 최초의 전자메일 프로그램에서 사용하던 불필요한 메뉴를 제거하고시작할  필요 없는  열리지 않도록 로직을 수정한다.

 

메뉴 구조 수정

메뉴와 도구 모음 관한 프로그램 코드(ApplicationActionAdvisor.java) 보면, 매우 직관적으로 구현되어 있기 때문에 고치는  어려움이 없을 것이다. 만약 메뉴나 도구 모음 아이템을 추가하고자 한다면 원본 코드에 존재하는 로직을 참고해 동일한 형태로 프로그램을 짜면된다. fillMenuBar(MenuBar 초기화)에서 exitAction aboutAction만을 남기고 나머지는 모두 주석 처리한다. 그리고 fillCoolBar(CoolBar 초기화) 수정해 exitAction aboutAction실행할  있도록 변경한다.

 

화면 크기 수정

예제 프로그램을 보면 화면 영역이   있는데 왼쪽은 25%, 오른쪽은 75% 차지하고 있다. 프로그램이 시작할  이렇게 열리는 화면 영역의 크기를 조정하기 위해서는Perspective.java에서 createInitialLayout(IPageLayout layout) 수정한다.

layout.addStandaloneView(NavigationView.ID,false, IPageLayout.LEFT, 0.25f,editorArea);layout.addStandaloneView(NavigationView.ID, false, IPageLayout.LEFT, 0.5f, editorArea);수정하면 프로그램이 시작될   개의 화면 영역이 각각 50% 점유하게 된다. 그리고folder.addView(View.ID); 주석 처리하면 시작할  불필요한 메시지 화면이 열리지 않는다.

 


그림 4 화면 영역 비율을 수정하여 시작한 모습

 

4 MyRCP 익스포트하기

이제 MyRCP 독립 프로그램으로 실행하기 위해 익스포트한다.

4.1 제품 만들기

만들어진 프로그램을 설정을 통해 익스포트하면 그것이 독립 응용 프로그램이 된다.

 

제품 설정 파일 생성

프로젝트에서 마우스 오른쪽 버튼을 클릭해 New->Product Configuration 선택한다.

 


그림 5 제품 Configuration 생성

 

‘New Product Configuration’ 화면에서 MyRCP 선택하고, ‘File name’ MyRCP.product 입력하고 Finish 클릭한다. 그러면 독립 프로그램으로 실행하기 위한 각종 설정 값들을 지정할  있는 화면이 열린다.

생성된 MyRCP.product 설정은  개의 으로 구성되어 있는데, 간편하게 OverviewConfiguration  개의  설정하면 익스포트  있다.

 

오버뷰 설정

Overview  화면에서 프로그램 이름 같은 기본 정보를 설정한다.

 


그림 6 오버뷰 설정

 

‘Product ID’ 오른편 New 버튼을 클릭하면 ‘New Product Definition’ 화면이 나타난다.


그림 7 제품 정의

 

먼저 ‘Defining Plug-in’ 오른편의 Browse 클릭하여 ‘Plug-in Selection’에서 MyRCP 선택하고 OK 누른다. 둘째로 ‘Product ID’ 임의의 값을 입력한다. 예제에서는 MyRCP 입력했다. 그리고 Finish 선택하면 아래와 같이  필드에 입력 값들이 등록되는 것을   있다.

 


그림 8 오버뷰 입력된 모습

 

설정

MyRCP.product에서 Configuration  선택하면 아래와 같이 비어있는 화면을   있다. MyRCP 독립 응용 프로그램으로 실행하기 위해서는 필요한 플러그인들이 전부 같이 익스포트되어야 한다.

 


그림 9 설정

 

Add 버튼을 누르면 플러그인 선택하는 화면이 보인다.   MyRCP(제품 포함되어야 하는 기본 플러그인) 선택한다.

 



그림 10 MyRCP 플러그인 추가

 

MyRCP 플러그인 동작하려면 의존 관계에 있는 다른 플러그인 모두 추가돼야 하지만 이클립스에는  작업 자동으로 수행해 주는 기능이 있다. 화면에서 ‘Add RequiredPlug-ins’클릭하면 이미 추가된 MyRCP 동작하기 위해 필요한 모든 플러그인들이 자동으로 추가된다.

 



그림 11 필요한 플러그인 자동 추가

 

제품 익스포트  실행

MyRCP 독립 응용 프로그램으로 수행하기 위해 익스포트 해야 한다.

 



그림 12 익스포트

 

MyRCP.product Overview 화면에서 Exporting 영역의 ‘Eclipse Product export wizard’ 클릭해 익스포트 수행한다.

 



그림 13 익스포트 위치 지정

 

Export 창에서 ‘Archive file’ 적절한 경로 입력하고 Finish 클릭하면 익스포트 수행된다. 익스포트 파일을 적당한 디렉터리에 풀어서 실행하면 된다.

 

4.2  기타 유용한   가지

사소하지만 처음 RCP 만들  공유하고자 하는 내용을 정리해 보았다.

 

설정 사용하기

이클립스에서는 환경 설정을 위한 기능을 제공하고 대부분의 설정 정보는 이곳에 넣는 것이일반적이다. 그러나 java –Dxxx=100 같이 사용하고자 한다면 configure/config.ini 값을 넣고 System.getProperty(“xxx”)형태로 프로그램에서 읽어 사용할  있다.

 

메모리 지정하기

MyRCP 자바 프로그램이기 때문에 메모리 지정이 필요하다 익스포트 전에MyRCP.product Configuration 에서 지정할 수도 있지만, 메모리 옵션을 바꾸려고 매번 익스포트 수는 없다.

메모리를 포함한 JVM 옵션은 eclipse.ini 저장되어 있다. 그런데 만약 Configuration 에서JVM 옵션을 지정하지 않으면 eclipse.ini 파일 자체가 만들어지지 않는다.

 

 모양 바꾸기

실행한 화면을 보면  이클립스와 모양이 다른 것을   있다. 이것을 수정하려면plugin_customization.ini 파일에 속성 설정이 필요하다. configuration/config.ini 파일에 필요한설정을 넣고 그것을 프로그램에서 사용하면 효과적이다. config.iniorg.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false 설정되면  모양이 이클립스처럼 부드럽게 변경된다. 속성을 적용하려면 plugin_customization.ini MyRCP 플러그인같이 패키징되어야 한다.

 



그림 14 MyRCP 프로젝트 구조

 



그림 15 빌드 목록에 plugin_customization.ini 추가

 

Build.properties 파일을 열어 위와 같이 바이너리 빌드에서 체크 주면 같이 패키징된다.



그림 16  모양이 바뀐 MyRCP

 

다시 MyRCP 실행하면 바뀐 모양을 확인할  있다.

 

결론

RCP초보자라면 지금까지 간단한 샘플을 통해서 RCP 대한 몇가지 의미있는 가치들을 발견할  있었을 것이다. 응용프로그램을 자바로 하면서도 4GL보다 나은 프로덕을 쉽게 만들수있다는 것은 정말 강력한 매력이다.

아직은 RCP 시장에서 붐은 아니지만 이클립스 RCP 접한 사람중에서 그가치를 높게 평가하지 않는 사람은 없다. 자바 개발자라면 RCP 접해두는 것은  필요하고도 가치있는 일이다.


'코딩과 개발' 카테고리의 다른 글

Java Launcher만들기  (0) 2012.09.19
The GNU C Library Reference Manual  (0) 2009.10.30
멀티 쓰레드 패턴  (0) 2009.10.26
Java ClassLoader 이해하기  (0) 2009.10.26
Posted by sjokim
,