어댑터 패턴

어댑터 패턴의 기본 전략 중 하나는, 한 객체가 특정한 영역에서만 의미를 갖는 기능집합을 요구 받을 때, 원래의 객체로 부터 분리된 어댑터 객체에게 그 임무들을 위임하는 것입니다. 이렇게 함으로써, 객체는 본래의 간결함을 유지 할 수 있으며, 개발자는 본인이 개발하지 않은 컴포넌트에 대해서도, 다른 영역에 참가시키는 것이 가능합니다.

기능영역 -> 컴포넌트: getAdapter();
컴포넌트 -> 컴포넌트: 어댑터 생성
컴포넌트 --> 기능영역: adapter
기능영역 -> 기능영역: 쓰임새 수행
어댑터블한 컴포넌트가 기능영역에 참여하는 기본 원리

일반적으로 어댑터 질의는 그림처럼 IAdaptable 인터페이스의 getAdapter(Class) 메소드를 통하여 이루어집니다. 하지만, 이 경우에, 어댑터 질의에 응답하는 주체가 객체 그 자체가 되기 때문에, 어댑터가 추가되거나 변경될 때 마다, 객체의 코드가 변경되어야 합니다. 이 경우엔 유연한 협력이나, 블라인드 확장(원래의 컴포넌트가 어떻게 구현되었는지 전혀 모르는 상태에서 기능을 확장시키는 것)이 불가능 합니다. 그러나 서로 모르는 사람들이 가장 많이 참여하는 프로젝트인 이클립스에서는, 이러한 상황이 매우 빈번하게 일어납니다. 이 문서는 모델과 어댑터간의 디커플링을 달성 하는 방법과 원리를 설명합니다.

어댑터 질의를 플랫폼에 위임

이런 문제를 해결하기 위해서 이클립스에서는 어댑터 질의를 플랫폼에게 위임하는 전략을 사용합니다.

기능영역 -> 컴포넌트: getAdapter()
컴포넌트 -> 어댑터매니저: 위임
어댑터매니저 -> 확장점: 팩토리 찾기
확장점 -> 확장점: 확장 탐색
확장점 -> 어댑터팩토리 : 생성
어댑터팩토리 -> 어댑터팩토리: 어댑터 생성
어댑터팩토리 --> 컴포넌트: adapter
컴포넌트 --> 기능영역: 쿼리 응답
어댑터블한 컴포넌트가 기능영역에 참여하는 기본 원리

이클립스에서 어댑터블한 객체들은 다음과 같은 기본 구현을 가지고 있습니다.

public Object getAdapter(Class adapterType){
	...
	return Platform.getAdapterManager().getAdpater(this, adapterType);
}

두 번 째 줄에서 보이는 바와 같이 이 객체는 어댑터 질의를 Platform에게 위임시킵니다. 따라서, 개발자는 플랫폼에 어댑터 공급 방법을 알려줌으로써, 원래 객체를 수정하지 않고도 어댑터를 추가 공급할 수 있습니다. 이렇게 어댑터를 추가적으로 공급하는데 쓰이는 확장점이 바로 런타임 어댑터 (확장점ID: org.eclipse.core.runtime.adapters) 입니다. 이 확장점은 특정한 타입의 객체에 대해, IAdapterFactory를 등록할 수 있게 해 줍니다. 마찬가지로 여러분이 만든 컴포넌트도 런타임 어댑터를 지원하려면, getAdapter()의 마지막 부분에 마찬가지의 코드를 삽입해야 합니다.

어댑터 팩토리

public interface IAdapterFactory {
	public Object getAdapter(Object adaptableObject, Class adapterType);
	public Class[] getAdapterList();
}

어댑터 팩토리는 위와 같은 메소드 구성을 가집니다. getAdapterList()는 이 어댑터 팩토리가 어떠한 종류의 어댑터 질의를 처리 할 수 있는지를 나타내고, getAdapter()는 실제로 어댑터를 만들어 플랫폼에 제출하는 역할을 합니다. 확장점 정의에보면, 이미 가능한 어댑터 종류에 대한 노드들이 있는데도 불구하고 구현 클래스도 질의를 받는 인터페이스가 있는 이유는, 확장점 뿐만 아니라, 프로그래밍으로도 어댑터를 등록할 수 있게 하기 위해서 입니다.

정리

직접 작성한 객체나 컴포넌트가 아니라고 하더라도, org.eclipse.core.runtime.adapters 확장점을 이용하면 특정 도메인에 대한 어댑터를 별도로 공급할 수 있습니다.

하는 김에 같이 줏어먹기

Platform.getAdatper(...) 는 현재 활성화된 플러그인들 중에서만 런타임 어댑터 팩토리를 찾아내어 작동합니다. 만약 모든 플러그인과 연동되게 하려면, loadAdpater(...)를 사용해야 합니다. 이 경우, 어댑터 질의 과정중에 다른 플러그인이 활성화 될 수도 있다는 점을 염두에 둬야합니다.

Core Expression

만약 코어 익스프레션에서 adapter 노드를 사용한 경우에, 런타임 어댑터로 등록된 어댑터들만 리턴값이 넘어옵니다. 주의하세요.

'Eclipse Core' 카테고리의 다른 글

P2의 주요 용어 정리  (0) 2010.11.29
아아 좋은 이클립스 삽질이다  (0) 2010.11.01
Extension Point and Extension  (0) 2010.07.08
Job과 Schedule Rule  (0) 2009.08.08
Posted by 지이이이율
,