[Eclipse] 실전 플러그인 개발: 간단한 Favorites 플러그인 구축하기

Ma_Seokjae·2024년 7월 15일
post-thumbnail

Eclipse(이클립스)를 이용하여 간단한 플러그인인 'Favorites' 플러그인을 생성, 빌드, 설치 및 테스트 하는 과정을 단계별로 설명하는 시간을 가지려고 합니다. 이 글을 통해 이클립스 플러그인에 더 가까워지는 시간이 되셨으면 좋겠습니다.

플러그인 프로젝트 생성

1. 새 플러그인 프로젝트 마법사

  • File > New > Project를 선택

  • Plug-in Development > Plug-in Project 선택 후, Next 클릭

  • 프로젝트 이름을 입력하고 Next 클릭

    (필자의 경우, 이미 해당 파일을 생성)
  • Plug-in Content 페이지에서 플러그인 ID, 버전, 이름, 제공자 등의 정보를 입력

  • Next를 클릭하고 Templates 페이지에서 템플릿을 선택하지 않고 Finish 클릭

    Tip!
    플러그인 프로젝트의 이름은 되도록 플러그인 id와 동일하게 정하는 것이 편리하다. 그러므로 새 프로젝트(New Project) 마법사는 프로젝트 이름의 기본값으로 플러그인 id를 사용한다.

2. 플러그인 정의

모든 플러그인은 META-INF/MANIFEST.MF 파일을 포함합니다. 또한 plugin.xml 파일과 함께 플러그인을 프로그램적으로 표현하는 자바 클래스 파일도 포함할 수 있습니다.

plugin.xml

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>

   <extension
         point="org.eclipse.ui.views">
      <category
            name="QualityEclipse"
            id="com.qualityeclipse.favorites">
      </category>
      <view
            name="Favorites"
            icon="icons/sample.gif"
            category="com.qualityeclipse.favorites"
            class="com.qualityeclipse.favorites.views.FavoritesView"
            id="com.qualityeclipse.favorites.views.FavoritesView">
      </view>
   </extension>

</plugin> 

위의 plugin.xml 예제에서 Favorites라는 새로운 뷰를 정의하고 있습니다.

3. 뷰 정의

뷰를 정의하기 위해서는 FavoritesView 클래스를 작성해야 합니다.

FavoritesView.java

package com.qualityeclipse.favorites.views;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;

public class FavoritesView extends ViewPart {
   public void createPartControl(Composite parent) {
       // 뷰 UI 구성 요소 생성
   }

   public void setFocus() {
       // 뷰가 포커스를 받을 때 호출
   }
}

생성된 코드 둘러보기

1. 플러그인 내역서

META-INF/MANIFEST.MF와 plugin.xml 파일은 플러그인의 메타 데이터와 확정점 정의를 포함하는 주요 구성 파일입니다.

  • plugin.xml과 MANIFEST.MF 이외의 페이지를 수정할 경우, 내역서 편집기가 소스를 재구성할 수도 있음

  • 플러그인 내역서 편집기의 Dependencies 페이지에서는 시스템에 포함된 다른 플러그인과의 관계를 확인 가능

  • 자바 빌드 경로보다는 종속성 목록을 편집, 그래야만 두 속성이 자동으로 항상 동기화된 상태를 유지

    • Require-Bundle을 통해 Favorites 플러그인이 org.eclipse.core.runtime 플러그인과 org.eclipse.ui 플러그인에 대해 종속됨을 알 수 있음

      • 이는 Favorites 플러그인이 제대로 작동하기 위해 org.eclipse.core.runtime과 org.eclipse.ui 플러그인이 필요함을 의미
    • 여기서 종속 관계는 Favorites 프로젝트의 자바 빌드 경로와는 별개

      • 자바 빌드 경로는 컴파일 시점에 필요한 것. 즉, 코드가 작성되고 컴파일될 때 필요한 라이브러리들을 지정
      • 플러그인 종속성 선언 (Require-Bundle)은 플러그인이 실행될 때 필요한 다른 플러그인들을 정의. 이 설정은 플러그인 실행 환경에서 해당 플러그인이 올바르게 동작하기 위해 필요한 종속성을 지정
    • com.qualityeclipse.favorites 프로젝트는 플러그인 프로젝트로서 생성되어 org.eclipse.pde.PluginNature 네이처가 적용되므로 종속성 목록인 변경될 때마다 자동으로 자바 빌드 경로에 반영

      • But, 그 반대로는 반영하지 않음...
        자바 빌드 경로에 라이브러리를 추가해도 그 라이브러리는 플러그인의 종속성 목록에 자동으로 추가되지 않음. 즉, 자바 빌드 경로에 추가한 라이브러리는 컴파일 시에는 필요하지만, 실행 시에는 플러그인이 그 라이브러리에 의존하는지 알 수 없음
    • 플러그인의 종속성 목록자바 빌드 경로가 제대로 일치하지 않는다면, 플러그인을 컴파일하고 빌드하는 데 성공하더라도 제대로 실행되지 않을 것

2. 플러그인 클래스

플러그인 클래스는 플러그인의 라이프사이클을 관리합니다.

FavoritesActivator.java

package com.qualityeclipse.favorites;

// 필요한 클래스를 임포트
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.osgi.framework.BundleContext;

// Favorites 플러그인의 Activator 클래스. AbstractUIPlugin을 상속받아 플러그인의 라이프 사이클을 관리
public class FavoritesActivator extends AbstractUIPlugin {
   // 플러그인의 ID를 정의
   public static final String PLUGIN_ID = "com.qualityeclipse.favorites";
   
   // 싱글턴 인스턴스를 저장할 변수
   private static FavoritesActivator plugin;
   
   // 플러그인이 시작될 때 호출되는 메소드
   @Override
   public void start(BundleContext context) throws Exception {
       // 부모 클래스의 start 메소드를 호출
       super.start(context);
       // 현재 인스턴스를 싱글턴 인스턴스 변수에 할당
       plugin = this;
   }

   // 플러그인이 중지될 때 호출되는 메소드
   @Override
   public void stop(BundleContext context) throws Exception {
       // 싱글턴 인스턴스를 null로 설정
       plugin = null;
       // 부모 클래스의 stop 메소드를 호출
       super.stop(context);
   }

   // 싱글턴 인스턴스를 반환하는 메소드
   public static FavoritesActivator getDefault() {
       return plugin;
   }
}

FavoritesActivator 클래스는 플러그인의 시작과 종료를 관리

3. Favorites 뷰

FavoritesView 클래스는 Eclipse 플러그인에서 사용자 인터페이스(UI)의 일부로 사용될 수 있는 뷰(View)를 정의합니다. 이 클래스는 ViewPart를 확장하며, UI 구성 요소를 생성하고, 뷰가 포커스를 받을 때의 동작을 정의합니다.

FavoritesView.java

package com.qualityeclipse.favorites.views;

import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.*;
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.*;
import org.eclipse.swt.SWT;

public class FavoritesView extends ViewPart {
    private TableViewer viewer; // 뷰어 객체를 정의합니다.

    
    class ViewContentProvider implements IStructuredContentProvider {
        @Override
        public void inputChanged(Viewer v, Object oldInput, Object newInput) {
            // 입력이 변경될 때 호출됩니다.
        }
        
        @Override
        public void dispose() {
            // 뷰어가 해제될 때 호출됩니다.
        }
        
        @Override
        public Object[] getElements(Object parent) {
            // 모델 객체의 요소들을 반환합니다. 여기서는 "One", "Two", "Three" 문자열 배열을 반환합니다.
            return new String[] { "One", "Two", "Three" };
        }
    }
    
    /*
     * The label provider class is responsible for translating
     * objects into text and images that are displayed 
     * in the various cells of the table.
     */
    class ViewLabelProvider extends LabelProvider implements ITableLabelProvider {
        @Override
        public String getColumnText(Object obj, int index) {
            // 테이블의 특정 셀에 표시될 텍스트를 반환합니다.
            return getText(obj);
        }
        
        @Override
        public Image getColumnImage(Object obj, int index) {
            // 테이블의 특정 셀에 표시될 이미지를 반환합니다.
            return getImage(obj);
        }
        
        @Override
        public Image getImage(Object obj) {
            // 객체에 대한 이미지를 반환합니다. 여기서는 기본 Eclipse 이미지를 사용합니다.
            return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_ELEMENT);
        }
    }

    /**
     * The constructor.
     */
    public FavoritesView() {
        // 기본 생성자입니다.
    }

    /**
     * This is a callback that will allow us
     * to create the viewer and initialize it.
     */
    @Override
    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());
    }

    /**
     * Passing the focus request to the viewer's control.
     */
    @Override
    public void setFocus() {
        // 뷰가 포커스를 받을 때 호출됩니다.
        viewer.getControl().setFocus();
    }
    
    /**
     * For testing purposes only.
     * @return the table viewer in the Favorites view 
     */
    public TableViewer getFavoritesViewer() {
        // 뷰어 객체를 반환합니다. 테스트 목적 등으로 사용됩니다.
        return viewer;
    }
}

이 클래스는 Eclipse 플러그인 개발에서 뷰를 정의하고, 데이터를 표시하고, 포커스를 관리하는 방법을 보여줍니다. 각 부분의 역할과 동작을 이해하면 Eclipse 플러그인을 보다 효율적으로 개발할 수 있습니다.


제품 빌드

1. 직접 빌드하기

이클립스에서 플러그인 프로젝트를 직접 빌드하려면 프로젝트를 선택하고 Export > Deployable plug-ins and fragments를 선택

2. 아파치 Ant로 빌드하기

Ant 스크립트를 사용하여 빌드 프로세스를 자동화할 수 있습니다.

아파치 Ant에 대해서 자세히 알아보기


제품 설치와 실행

  • 이클립스를 종료
    설치 프로세스를 시작하기 전에, 현재 실행 중인 이클립스를 종료합니다. 이는 파일 잠금 문제를 피하고 플러그인 설치 과정에서 발생할 수 있는 오류를 방지하기 위함입니다.

  • 이클립스 디렉토리(예: C:\eclipse)에 FavoritesPlugin.zip 파일의 압축을 해제
    다운로드한 FavoritesPlugin.zip 파일을 이클립스가 설치된 디렉토리로 복사합니다. 일반적으로 이 디렉토리는 C:\eclipse와 같이 설정됩니다.
    이 디렉토리에서 FavoritesPlugin.zip 파일의 압축을 해제합니다. 압축을 해제하면 플러그인 파일들이 적절한 디렉토리 구조에 배치됩니다.

  • /plugins 디렉토리에 Favorites 플러그인이 들어있는지 확인
    압축을 해제한 후, 이클립스 디렉토리 내의 plugins 디렉토리를 확인합니다.
    plugins 디렉토리 내에 com.qualityeclipse.favorites_1.0.0.jar과 같은 Favorites 플러그인 파일이 존재하는지 확인합니다.

  • 이클립스를 다시 실행
    모든 파일이 올바르게 배치되었는지 확인한 후, 이클립스를 다시 실행합니다.
    이클립스가 시작될 때 새로 설치된 플러그인을 인식하고 로드합니다.

예시와 추가 설명

  • 플러그인 설치를 확인하는 방법

    • 이클립스를 다시 실행한 후, 새 플러그인이 제대로 설치되었는지 확인하려면 이클립스의 Help 메뉴에서 About Eclipse IDE를 선택합니다.

    • Installation Details 버튼을 클릭하여 Installed Software 탭에서 Favorites Plug-in이 목록에 있는지 확인합니다.

  • 플러그인을 사용하는 방법

    • 설치된 Favorites 플러그인을 사용하는 방법은 다음과 같습니다:
      이클립스 상단 메뉴에서 Window > Show View > Other...를 선택합니다.

    • Favorites 카테고리를 찾고, 그 아래에 있는 Favorites View를 선택하여 열립니다.

    • 이제 Favorites View가 나타나고, 사용자는 이 뷰를 통해 플러그인을 사용할 수 있습니다.

      Tip!
      만약 플러그인이 제대로 작동하지 않는다면, 이클립스 로그 파일을 확인하여 문제를 찾을 수 있습니다. 로그 파일은 일반적으로 이클립스 디렉토리 내의 workspace/.metadata/.log 파일에 위치합니다.


제품 디버깅

이클립스 플러그인을 개발할 때 디버깅은 필수적인 과정입니다. 디버깅을 통해 플러그인의 동작을 확인하고, 발생하는 문제를 해결할 수 있습니다. 아래는 디버깅 과정의 각 단계를 자세히 설명한 내용입니다.

1. 실행 구성 생성

  • 이클립스에서 실행 구성 메뉴 열기

    • Run > Run Configurations를 선택합니다.

    • 이 메뉴를 통해 다양한 실행 구성 설정을 할 수 있습니다.

  • Eclipse Application 구성 추가

    • 실행 구성 대화 상자에서 Eclipse Application을 선택합니다.

    • 오른쪽 클릭 후 New를 선택하여 새로운 실행 구성을 생성합니다.

  • 구성 이름 지정

    • 새 구성에 이름을 지정합니다. 예: FavoritesPluginDebug.
  • 런타임 설정

    • 기본 탭에서 Location과 Working Directory는 기본 설정을 유지합니다.

    • 필요에 따라 프로그램 인수나 VM 인수를 추가할 수 있습니다.

2. 플러그인과 프래그먼트 선택

  • Plug-ins 탭 선택

    • 실행 구성 대화 상자에서 Plug-ins 탭을 선택합니다.
  • 필요한 플러그인 선택

    • Add Required Plug-ins 버튼을 클릭하여 현재 프로젝트에서 필요한 모든 플러그인을 자동으로 선택합니다.

    • 직접 플러그인을 선택하려면 플러그인 목록에서 필요한 플러그인을 수동으로 선택할 수 있습니다.

    • 예: com.qualityeclipse.favorites, org.eclipse.ui, org.eclipse.core.runtime 등을 선택합니다.

  • 프래그먼트 선택

    • 플러그인과 함께 필요한 프래그먼트를 선택합니다.

    • 프래그먼트는 특정 플러그인에 추가 기능을 제공하는 모듈입니다.

3. 런타임 워크벤치 실행

  • 런타임 워크벤치 실행

    • Run 버튼을 클릭하여 설정한 실행 구성을 실행합니다.

    • 이클립스는 새로운 워크벤치 인스턴스를 시작합니다. 이를 런타임 워크벤치라고 합니다.

  • 플러그인 테스트 및 디버깅

    • 런타임 워크벤치에서 플러그인의 동작을 테스트합니다.

    • 플러그인이 예상대로 동작하는지 확인합니다.

    • 런타임 워크벤치에서 오류가 발생하면, 이클립스 IDE의 Debug 뷰를 사용하여 문제를 진단하고 해결할 수 있습니다.


PDE 뷰

1. 플러그인 레지스트리 뷰

  • Plug-in Registry 뷰는 로드된 모든 플러그인과 그 상태를 보여줍니다.

2. 플러그인 뷰

  • Plug-ins 뷰는 현재 설치된 모든 플러그인을 나열합니다.

3. 플러그인 종속성 뷰

  • Plug-in Dependencies 뷰는 선택된 플러그인의 종속성을 시각화합니다.

플러그인 테스트 작성

1. 테스트 준비

  • 플러그인 테스트를 위해 테스트 프레임워크를 설정합니다.

2. 플러그인 테스트 프로젝트 생성

  • File > New > Project를 선택하고 Plug-in Development > Plug-in Test Project를 선택합니다.

3. 플러그인 테스트 생성

  • 테스트 클래스를 생성하고 JUnit을 사용하여 테스트 케이스를 작성합니다.

4. 플러그인 테스트 실행

  • 테스트 프로젝트에서 JUnit 테스트를 실행하여 플러그인을 검증합니다.

5. Favorites 플러그인 설치 제거

  • Favorites 뷰를 닫음

  • 이클립스를 종료

  • 이클립스 플러그인 디렉토리에서 com.quality.favorites_1.0.0.jar 파일을 지움

  • 이클립스를 다시 시작

    • 다시 시작할 때 에러 메시지가 나타나면, 이클립스릴 종료할 때 최소 하나의 Favorites 뷰가 열려 있었던 것
  • Show View 대화창을 열어 더 이상 Favorites 뷰와 Quality Eclipse 카테고리가 없을 을 확인


참고 자료

이클립스 실전 플러그인 개발 (2장: 간단한 플로그인 예제), 저자: 에릭 클레이버그

profile
Why not change the code?

0개의 댓글