확장점은 기능 단위를 느슨하게 결합시키기 위한 메커니즘으로 이클립스 전반에 걸쳐 사용된다. 하나의 플러그인은 플러그인 내역서(Menefiset.MF)에서 확장점을 선언하며. 다른 개발자가 사용할
최소한의 인터페이스와 관련 클래스를 노출시킨다. 다른 플러그인은 확장점에 대한 확장을 선언하고 적절한 인터페이스를 구현하며제공된 클래스를 기반으로 구성 요소를 참조하거나 구축한다.
<확장점>
<Extension-point
Id="favorites"
Name = "Favorites"
Schema="schema/favorites.exsd"/>
<third Party Plug-in>
<extension
Point="com.qualityeclipse.favorites.favorites">
<itemType
Name="Workbench File"
Icon=\"icons/type/file.gif"
targetClass="org.eclipse.core.resource.Ifile"
Class="com.qualityeclipse.favorites.model.type.FileFactory"
Id="WBFile">
</itemType>
</extension>
각 확장점은 플러그인의 식별자와 마침표 뒤에 알파벳,숫자, 밑줄(_)로 이루어진 단순 식별자를 붙여 구성한 유일한 식별자를 갖는다.
확장점을 선언할때는 단순식별자만을 사용한다. 확장점에 대한 확장을 선언할때는 확장점에 대한 전체 식별자를 사용한다.
확장점의 사용되어야할 스키마 정의를 나타내는 exsd
모든 확장점은 확장점이 어떻게 사용되어야 하는지를 정의하는 스키마를 가진다. 절절한 확장점 사용을 위해 반드시 스키마가 필요한것은 아니지만, 이클립스 PDE는 스키마를 사용해 확장에 대한 기본적인 자동 검증을 수행하고 자동으로 확장점에 대한 Javadoc 느낌의 문서를 생성한다.
스키마는 XML 형식의 파일로 관섭적으로 <extension-point-id>.exsd라는 이름을 사용하며 플러그인 설치 디렉토리의 하위 디렉토리 schema에 위치한다.
이클립스 설치 디렉토리/plugins/com.qualityeclipse.favorites_1.0.0/schema/favorites.exsd와 같은 위치에 존재한다.
확장점 생성
확정점으로 생성하고 싶은 플러그인의 메니페스트 파일에서 확정점 페이지로 이동하여 추가 버튼을 클릭하고 확장점을 생성한다.
<Extension-point
Id="favorites"
Name = "Favorites"
Schema="schema/favorites.exsd"/
위에 설명한 것 처럼 해당 확장점은 favorites처럼 보이나 실제로는 com.qualityeclipse.favorites.fvorites와 같이 길게 확장점을 사용하여야 한다.
확장점 스키마(exsd)작성
위의 확장점 생성 마법사가 완료되면 자동으로 schema 디렉토리에 새로 생성될 favorites.exsd 파일을 편집하는 스키마 편집기로 이동된다.
스키마 편집기를 다시 열고 싶을 경우 schema 디렉토리를 찾아 favorites.exsd 파일을 더블 클릭하거나 Favorites 플러그인 내역서에서 확장점을 찾아 마우스 오른쪽 클릭하고
스키마 열기를 선택 하면된다.
스키마 편집기는
General Information(일반정보), Extension Point Elements(확장점 요소), Element Grammer(요소 문법), Documentation (문서) 등의 몇 가지 주요 파트로 구성된다.
- 확장점 요소 목록은 확장점에 대해 확장으로 나타날 요소와 각 요소의 연관된 속성을 나타낸다.
- 요소 문법 목록은 확장에 표현될 XML 요소가 어떻게 나타나야 하는지에 대한 명세를 포함한다.(3.2 이후에는 확장점 요소로 통합 되었다.)
- Documentation 영역은 확장점 스키마를 사용해 확장점에 대한 도움말 페이지를 동적으로 생성하여 입력하는 부분이다.
확장점 요소와 속성
확장점 element 요소는 확장 선언에 나타나는 XML 요소에 대응한다. 확장점 attribute 요소는 확장 선언에 나타나는 XML 속성에 대응한다.
확장점 attribute 요소는 확장 선언에 나타나는 XML 속성에 대응한다. 예를 들어 다음과 같은 확장의 경우, itemType은 확장점 요소이고 id, name, class, targetClass는 확장점 속성이다.
<third Party Plug-in>
<extension
Point="com.qualityeclipse.favorites.favorites">
<itemType
Id="com.example.xyz.myNewFavoriteItemID"
Name="New Favorites Item Name"
targetClass="com.example.xyz.MyObjectClass"
Class="com.example.xyz.MyFavoriteItem"
>
</itemType>
</extension>
1. 확장점 attribute 요소는 확장점과 연관된 몇 가지 프로퍼티를 가진다.
이름 Name : 확장 선언에 나타날 속성 이름(itemType의 id, name, targetClass, Class 모두가 속성 이름이다.)
타입Type : 속성의 타입은 string이나 Boolean 중 하나를 선택한다. 현재로서는 스키마 편집기와 PDE에서 인식하는 유형이 이 두 가지 뿐이다.
사용Use : 이 속성이 required면 확장에 반드시 선언해야 하며 optional일 결우 확장 선언에서 빼도 무관하다. 또는 default로 선언하면 확장에 명시적으로 선언되지 않을
2. 경우 value 프로퍼티에 명시된 값을 기본으로 적용한다.
유형Kind : Type 프로퍼티가 string이면 이 프로퍼티 문자열을 어떻게 해석할지를 지정한다. 확장점 코드에서 자바 클래스, 이미지에대한 리소스 경로, 단순 문자열 등으로 해석 할 수 있다.
기반Based On : Kind 속성이 java인 경우에 이 프로퍼티는 속성에서 상속 받거나 구현해야 할 클래스나 인터페이스의 완전 수식명을지정한다.(이클립스 3.2 이상부터는 이 프로퍼티를 Extend와 Implement로 구분했다.)
Restriction : Type이 string이고 kind가 string이면 이 프로퍼티는 속성의 값으로 사용 가능한 문자열의 목록을 지정한다. 예를 들면이 필드를 사용해서 속성값이 one, two, three 중 하나만 가능하게 할 수 있다.
변환 가능Translatable : 이 속성이 사람이 읽을 수 있는 것인지, 아니면 변환해야 하는지 여부를 지정한다.
기본값Value : Use 속성을 default로 지정했다면 확장 속성의 값을 명시적으로 지정하지 않았을 대 기본으로 지정될 기본 값을 설정한다.
※주의 사항 : 확장점을 범용 목적으로 작성한다면 확장의 늦은 초기화를 지원할 계획을 세움으로써 다른 플러그인의 추가 로딩으로 인해 메모리를 과도하게 사용하거나
시스템이 느려 지는 일이 생기지 않도록 해야한다. targetClass와 같은 명세가 주어져 있지 않을 경우 해당 클래스로 동작을 해야 할 경우 마다 계속해서 그 모든 플러그인들을
로드 해야하는 경우가 발생할 수 있다.
확장은 어떻게 확장점에 동작 구현을 제공할까?
확장이 인터페이스를 구현하거나 추상 기반 클래스를 상속 받아야 하는가? 인터페이스를 구현하는 확장을 요구한다면 확장 개발자가더 유연하게 확장을 구현 할 수 있다.
반면 인터페이스가 변경되면 기존 확장이 모두 동작하지 않게 될 수 있다. 추상 기반 클래스를 상속 받는 확장을 요구한다면 느슨한 결합의 장점을 유지하면서 유연성을
어느정도 확보 할 수 있다. 추상 기반 클래스에 메소드를 추가해도 기존 확장은 동작을 멈추지 않으므로 확장 개발자의 유연성을 크게손해 끼치지 않는다.
-> 결론은 인터페이스로 정의 할 경우 수정될 때마다 문제가 될 수 있으므로 추상 클래스를 사용할 것.
확장점 요소를 정의한 다음에는 요소 구성 방법을 기술하는 요소 문법을 정의한다. 요소 문법은 PDE가 요소를 검증할 때 사용한다. 왼쪽의 확장점 요소를 하나 선택하면
Element Grammer가 출력된다.
확장점 구현 코드
확장점을 정의한 다음에는 새로 정의한 확장점에 대한 확장에서 선언하는 정보에 따라 Favorites 항목 유형과 Favorites 객체를 구성하는 코드를 작성해야 한다.
늦은 초기화라는 이클립스 원리를 따르면서 더불어 메모리 사용량을 낮추기 위해 각 Favorites항목 유형과 해당 플러그인은 꼭 필요할 때만 로딩 해야한다.
그렇게 하기 위해서는 확장될 때 사용되는 class의 메소드등의 리팩토링이 필요하다.
여기서 나오는 예제의 FavoriteItemType은 확장점에 사용되는 Class 명이다.
FavoriteItemType에 대해 첫 번째로 수정할 사항은 항목 유형 인스턴스를 클래스코드에서 상수로 직접 확장하는 대신 확장 정보로부터 이 클래스의 인스턴스를
생성하게 하는 것이다. TYPES 배열의 이름을 cachedTypes로 변경해서 이 필드의 목적을 좀더 정확한 의미로 표현하게 한다. 또한 getType() 메소드를 수정해 각
확장마다 FavoriteItemType의 새 인스턴스를 생성하도록 한다.
'RCP > SWT & JFACE' 카테고리의 다른 글
Drag & Drop 구현 방법 (0) | 2016.12.24 |
---|---|
이벤트로 받은 키보드 멀티 인식 방법 (0) | 2016.12.24 |
rcp toolbar에서 label등 각종 contribution item 생성방법 (0) | 2016.12.24 |
rcp dialog 화면 가운데 출력 (0) | 2016.12.24 |
Eclipse GEF 개념 설명 (0) | 2016.12.24 |