모델에서 모델로 변환 맵핑 프로젝트(맵핑 프로젝트라고도 함)는 확장점 com.ibm.xtools.transform.core.transformationProviders를 확장하는 Eclipse 플러그인입니다. 변환 맵핑 프로젝트에서 모델에서 모델로 변환을 작성하면, 변환의 구현 세부사항을 표시하는 코드를 작성하는 대신 선택된 소스 및 대상 모델이나 메타 모델의 요소가 관련되는 방법을 지정할 수 있습니다.
맵핑 프로젝트는 둘 이상의 맵핑 파일(맵핑 모델이라고도 함)을 포함할 수 있습니다. 맵핑 모델을 수정할 때 반복적으로 변환 소스 코드를 생성할 수 있습니다. 변환 소스 코드를 생성할 때 외부에서 볼 수 있는 변환(MainTransform)이 자동으로 등록되고, 맵핑 모델에 있는 맵핑 선언마다 변환에 대한 Java 소스 코드가 생성됩니다.
맵핑 프로젝트를 작성할 때 하나 이상의 소스 및 대상 메타 모델을 지정할 수 있습니다. 파일 이름 확장자가 .ecore인 메타 모델이나 파일 이름 확장자가 .epx 또는 .uml인 UML 프로파일을 지정할 수 있습니다. 프로젝트를 작성할 때 소스 및 대상 메타 모델을 지정하는 경우 필요한 종속사항이 자동으로 플러그인 Manifest 파일에 추가됩니다. 맵핑 프로젝트를 작성한 후 편집기 영역에서 명령을 사용하여 메타 모델을 추가하는 경우 플러그인 Manifest 파일에 필요한 새 종속성을 추가해야 합니다.
맵핑 모델(맵핑 파일이라고도 함)은 맵핑되는 메타 모델에 대한 참조사항이 있는 EMF(Eclipse Modeling Framework) 메타 모델(Ecore 모델이라고도 함)의 인스턴스입니다. 맵핑 프로젝트를 작성할 때 작성 도구는 사용자가 지정하는 입력 및 출력 모델을 사용하여 프로젝트에서 맵핑 모델을 작성합니다. 맵핑 프로젝트에는 하나 이상의 맵핑 모델이 있습니다. 맵핑 모델의 파일 이름 확장자는 .mapping입니다. 프로젝트에서 여러 개의 맵핑 모델을 작성하면 다른 맵핑 프로젝트에서 맵을 다시 사용할 수 있습니다. 이 기능은 여러 개의 맵핑 모델이 여러 개의 맵핑 프로젝트에 있는 대규모 맵핑 솔루션에 유용합니다.
맵핑 모델은 XML 파일로 저장되고 직렬화됩니다. 문제점 보기는 맵핑 모델에 대한 자세한 오류 정보를 표시합니다. 이 보기에서, 항목을 두 번 클릭하여 문서 편집기에서 맵핑 모델을 열고 오류를 포함하는 행을 보십시오. 이 문제점 해결 방법은 편집기 영역에서 맵핑 모델을 보고 문제점을 해결하는 방법보다 쉽습니다.
맵핑 선언(맵이라고도 함)은 주어진 입력 오브젝트에 대한 출력 오브젝트를 작성하거나 갱신하는 방법을 지정합니다. 각각의 맵핑 선언은 맵핑 모델에 추가하는 메타 모델에서 선택하는 입력 유형과 출력 유형을 지정합니다. 맵핑 모델은 여러 개의 맵핑 선언을 포함할 수 있습니다.
맵을 작성하는 목적은 소스의 값을 기초로 대상에 값을 지정하는 것입니다. 요소 사이의 맵은 요소 사이의 데이터 교환을 허가하는 해당 속성 사이의 대응을 설정합니다. 대부분의 맵은 소스 및 대상 사이에 데이터를 추가 조작할 수 있는 기능을 제공합니다. 예를 들어, 대상에 값을 지정할 수 있는 사용자 정의 코드를 작성하여 데이터에 대한 다른 수정사항을 작성하거나 계산을 지정할 것을 선택할 수 있습니다.
맵핑 선언에는 abstract 출력 오브젝트가 포함될 수 있습니다. 이와 같은 맵핑 선언은 대상 속성에 false로 설정된 포함(containment) 특성이 있는 서브맵 맵핑 규칙에서만 상속, 확장 또는 참조될 수 있습니다. 이와 같은 대상 속성은 서브맵 맵핑 규칙에 지정된 맵핑 선언에서 상속되는 맵핑 선언에 의해 작성되는 오브젝트에 대한 참조사항으로 채워질 수 있습니다. Abstract 출력 오브젝트를 지정하는 맵핑 선언을 사용하여 오브젝트 참조사항의 작성을 단순화할 수도 있습니다.
맵핑 선언은 일반적으로 x2y 이름 지정 규칙을 따릅니다. 여기서 x는 입력 오브젝트 유형이고 y는 출력 오브젝트 유형을 나타냅니다. 예를 들어, Package2EPackage 맵핑 선언은 입력 오브젝트가 Package이고 출력 오브젝트가 EPackage인 맵핑 선언을 지정합니다.
변환 소스 코드를 생성할 때 변환 서비스는 변환을 구현하는 맵핑 모델의 맵핑 선언마다 Java 소스 파일을 생성합니다.
맵핑 선언에는 하나 이상의 맵핑 규칙이 있습니다.
맵핑 선언은 다른 맵핑 선언에서 상속될 수 있습니다. 상속되는 맵핑 선언과 상속하는 맵핑 선언은 동일한 맵핑 모델에 정의되지 않아도 됩니다. 상속하는 입력 및 출력 오브젝트는 상속된 맵핑 선언에 있는 입력 및 출력 오브젝트의 부속 유형이어야 합니다(그러나 반드시 적절한 부속 유형일 필요는 없습니다). 상속하는 맵핑 선언은 상속되는 맵핑 선언에 정의되거나 이 맵핑 선언에 의해 상속되는 모든 맵핑을 상속합니다. 상속되는 맵핑 선언의 맵핑 규칙은 상속하는 맵핑 선언의 일부가 됩니다. 그러나 상속되는 맵핑 선언의 맵핑 규칙을 대체할 사용자 정의 맵핑 규칙을 작성할 수 있습니다. 또한 상속하는 맵핑 선언에서 추가 맵핑 규칙을 작성할 수도 있습니다. 상속하는 맵핑 선언에서 생성되는 변환은 상속되는 맵핑 선언에서 생성되는 변환을 확장합니다.
맵핑 규칙(맵핑이라고도 함)은 입력 오브젝트의 속성값에 따라 출력 오브젝트의 속성에 값을 지정하는 방법을 지정합니다.
또한 맵핑 선언의 입력 오브젝트와 출력 오브젝트 사이에 서브맵 맵핑 규칙을 작성할 수도 있습니다.
맵핑 선언에 있는 각각의 서브맵에 대해 getInputFeatureToOutputFeature_UsingMap_Extractor라고 하는 추출기가 포함하는 변환에서 생성됩니다. 여기서 InputFeature는 입력 속성의 이름을, OutputFeature는 출력 속성의 이름을, Map은 맵핑 선언의 이름을 나타냅니다.
Eclipse가 제공하는 OCL(Object Constraint Language) API를 사용하여 시맨틱 정제를 지정할 수 있습니다.
상속되는 맵핑 규칙과 해당되는 맵핑에서 생성되는 규칙 또는 추출기는 처리 순서에서 대체되는 맵핑 규칙 및 생성되는 규칙 또는 추출기와 동일한 상대 위치를 유지보수합니다.
맵핑 선언에 있는 이동 또는 사용자 정의 맵핑 규칙마다, 생성되는 변환 소스 코드에 규칙이 추가됩니다. 서브맵 맵핑 규칙마다 변환 소스 코드에 컨텐츠 추출기가 생성됩니다.
맵핑 규칙을 작성할 때 사용자가 선택하는 입력 및 출력 속성에 의해 해당 유형이 판별됩니다. 예를 들어, 입력 및 출력 속성이 기본 유형(예: 문자열 또는 정수)과 호환 가능한 경우 이동 맵핑 규칙이 지정됩니다. 입력 및 출력 속성이 복합 유형인 경우 서브맵 규칙이 지정됩니다. 이동 및 서브맵 모두 적절한 맵핑 규칙 유형이 아니면 사용자 정의 맵핑 규칙이 지정됩니다.
또한 입력 오브젝트와 출력 오브젝트 사이에 서브맵, 사용자 정의 또는 상속되는 맵 맵핑 규칙을 작성할 수도 있습니다.
출력 오브젝트의 특성과 출력 오브젝트에 있는 속성의 포함(containment) 특성에 따라 서브맵 맵핑 규칙의 동작이 판별됩니다.
| 항목 | 표시 |
|---|---|
| InputFeature | 서브맵 요소에 연결된 입력 오브젝트의 컴파트먼트 |
| OutputFeature | 서브맵 요소에 연결된 출력 오브젝트의 컴파트먼트 |
| Map | 생성된 변환이 실행될 때 서브맵이 적용하는 맵핑 선언 |
| InputElement | Map 맵핑 선언이 지정하는 입력 오브젝트 |
| OutputElement | Map 맵핑 선언이 지정하는 출력 오브젝트 |
맵핑 모델에 대한 변환 소스 코드를 생성할 때 작성 도구는 맵핑 선언마다 Map Transform 변환을 생성합니다. 맵핑 선언에 있는 각각의 서브맵에 대해 작성 도구는 getInputFeatureToOutputFeature_UsingMap_Extractor라고 하는 컨텐츠 추출기를 생성합니다.
모델에서 모델로 변환이 실행될 때, 변환은 메타 모델에서의 기능 설정에 따라 생성된 오브젝트에 대한 참조나 오브젝트를 생성합니다. 변환이 오브젝트를 생성하는 경우 변환은 해시 맵에서 해당 오브젝트에 대한 식별 정보를 기록합니다. 변환은 해시 맵을 기초로 사후 처리 중에 오브젝트에 대한 참조를 분석합니다.
맵핑 선언에서 출력 오브젝트로 지정하는 Ecore 또는 UML 메타 모델은 추상적(abstract)이거나 구체적(concrete)일 수 있습니다. 구체적 요소는 인스턴스화할 수 있지만 추상적 요소는 불가능합니다.
출력 오브젝트의 기능(속성이라고도 함)은 다른 Ecore 또는 UML 오브젝트를 포함하거나 참조할 수 있습니다. 오브젝트에 다른 오브젝트가 포함되는 경우 포함된 오브젝트는 포함하는 오브젝트가 삭제될 때 삭제됩니다. 오브젝트가 다른 오브젝트를 참조하는 경우 참조를 삭제하거나 참조의 소유자를 삭제해도 참조된 오브젝트는 삭제되지 않습니다.
다음 표는 출력 오브젝트와 출력 속성의 특성에 따른 서브맵 맵핑 규칙의 동작을 나열합니다.
| 출력 오브젝트 유형 | 출력 속성에서 포함 또는 참조 유형 | 서브맵 동작 |
|---|---|---|
| 추상 | 추상 또는 구체적 포함 | 이 유형의 서브맵은 지원되지 않습니다. MapTransform 변환이 오브젝트를 작성할 수 없어서 오브젝트를 OutputFeature 콜렉션에 삽입할 수 없기 때문입니다. |
| 추상 또는 구체적 | 추상 또는 구체적 참조 | 다른 모든 규칙 및 추출기를 처리한 후,
변환은 다음 단계를 완료하여 이 유형의 서브맵을
처리합니다.
|
| 구체적 | 추상 또는 구체적 포함 | InputFeature 콜렉션에 있는
오브젝트 InputItem마다, 변환은 다음 단계를 완료합니다.
|
다음 예제는 변환이 사후 처리 중에 출력 오브젝트에 대한 참조를 분석하는 방법을 설명합니다.
이 맵핑 선언은 입력 및 출력 오브젝트 사이에 상속되는 맵의 맵핑 규칙을 정의합니다. 맵핑 규칙은 이 맵핑 선언이 Classifier2Classifier 맵핑 선언에서 상속됨을 지정합니다.
public class Class2ClassTransform extends Classifier2ClassifierTransform {
...
}
클래스류는 추상 유형이므로 Classifier2ClassifierTransform 변환은 오브젝트를 작성할 수 없습니다. 그러나 Class2ClassTransform 변환은 클래스가 클래스류에서 상속하여도 오브젝트를 작성할 수 있습니다.
입력 클래스 ClassA가 있는 소스 모델에 대해 변환을 실행하는 경우 Class2ClassTransform 변환은 출력 클래스 ClassB를 생성합니다. ClassB의 작성을 기록하려면, Class2ClassTransform 변환은 키가 (Class2ClassTransform+ClassA->ClassB)와 같은 해시 맵 레코드를 작성합니다.
변환이 (Classifier2ClassifierTransform+ClassA)와 키가 동일한 레코드의 해시 맵을 검색하는 경우, (Class2ClassTransform+ClassA)와 키가 동일한 레코드가 검색 결과에서 리턴됩니다. Class2ClassTransform 변환이 Classifier2ClassifierTransform 변환에서 상속하기 때문입니다.
예를 들어, Package2Package 맵핑 선언이 있는 OriginalMappingModel 맵핑 모델을 고려하십시오. 맵핑 선언의 입력 오브젝트는 MyPackageDefinition 입력 메타 모델에 있고 맵핑 선언의 출력 오브젝트는 MyOtherPackageDefinition 출력 메타 모델에 속합니다. 맵핑 선언에는 둘 다 PackageName이라고 하는 두 개의 문자열 속성을 연결하는 이동 맵핑 규칙이 있습니다. MyPackageDefinition 메타 모델의 URI가 변경되면 Package2Package 맵핑 규칙이 올바르지 않게 됩니다. 다음에 맵핑 모델을 열 때 문제점 보기는 오류 메시지를 표시하고, 맵핑 편집기 영역에서 올바르지 않은 맵핑 선언에 대해 오류 장식이 표시됩니다. 올바른 입력 오브젝트를 지정하고 맵핑 편집기가 기존의 맵핑 규칙을 리팩터해야 하는 방법을 지정해야 합니다.
맵핑 규칙을 리팩터한 후에는 계속 맵핑 모델을 정제하고 변환 코드를 재생성할 수 있습니다.