본문 바로가기
프로그래밍/설계공부

제 4 장. Open API 사용하기

by 건우아빠유리남편 2009. 7. 23.
반응형

제 4 장. Open API 사용하기

StarUML™은 UML메타모델과 애플리케이션 객체 등 프로그램의 대부분에 접근할 수 있도록 COM 객체화하고 API를 외부로 노출시켰다. 이 장에서는 StarUML™의 외부 API를 사용하는 방법을 자세하게 설명한다.

프로젝트 다루기

이 섹션에서는 StarUML에서 프로젝트, 유닛 그리고 모델 조각들을 다루는 방법에 대해 소개한다.

프로젝트 관리 기본 개념

프로젝트를 관리하기 위해서는 먼저 프로젝트에 관련된 개념(프로젝트, 유닛, 모델 조각)들을 잘 이해해야 한다.

프로젝트

프로젝트는 StarUML에서 다루는 가장 기본이 되는 단위이다. 프로젝트는 하나 혹은 그 이상의 소프트웨어 모델들을 관리할 수 있으며 항상 존재하는 최상위 패키지(Top-level Package)로도 이해될 수 있다. 하나의 프로젝트는 일반적으로 하나의 파일에 저장된다. 프로젝트는 다음과 같은 모델링 요소들만 포함하고 관리할 수 있다.

프로젝트 하위 요소 설명
모델(Model) 하나의 소프트웨어 모델을 관리하기 위한 요소.
서브시스템(Subsystem) 하나의 서브시스템을 표현한 요소들을 관리하기 위한 요소.
패키지(Package) 요소들을 관리하기 위한 가장 일반적인 요소.

프로젝트 파일은 XML 형태로 저장되며 확장명은 ".UML" 이다. StarUML에서 작성된 모든 모델, 뷰, 다이어그램들은 하나의 프로젝트 파일에 저장되지만, 다음에 설명할 유닛(Unit)을 사용하면 프로젝트를 여러 파일에 나누어 저장할 수도 있다. 프로젝트 파일에는 다음과 같은 정보들이 저장된다.

  • 프로젝트가 참조하는 UML 프로파일들
  • 프로젝트가 참조하는 유닛 파일들
  • 프로젝트에 포함된 모든 모델 정보
  • 프로젝트에 포함된 모든 다이어그램 및 뷰 정보

유닛

프로젝트는 기본적으로 하나의 파일에 저장되지만 프로젝트를 여러 명이 작업하거나 하는 등의 이유로 여러 개의 파일로 나누어서 다루어야 할 경우가 있다. 이러한 경우, 프로젝트를 여러 개의 유닛으로 만들어서 다룰 수 있도록 허용한다. 유닛은 계층적으로 구성될 수 있어서 유닛의 하부에 여러 개의 서브 유닛을 가질 수도 있다. 유닛은 ".UNT" 파일에 저장되며, 프로젝트 파일(.UML) 혹은 다른 유닛 파일(.UNT)로부터 참조된다.

패키지(Package), 서브시스템(Subsystem) 그리고 모델(Model) 요소만이 하나의 유닛이 될 수 있다. 이러한 패키지 류의 요소들의 하위에 포함된 모든 요소들은 해당 유닛 파일(.UNT)내에 저장된다.

프로젝트가 하위에 여러 개의 유닛을 관리할 수 있는 것처럼, 유닛 자체도 하위에 여러 개의 유닛을 관리할 수 있다. 상위 유닛은 하위 유닛들에 대한 참조를 가지게 되고 이러한 관계에 의하여 유닛은 계층구조(Hierarchical Structure)를 이루게 된다.

모델 조각

모델 조각은 프로젝트의 일부분을 별도의 파일로 저장한 것을 말한다. 모델 조각의 대상은 모델(Model), 서브시스템(Subsystem), 패키지(Package) 요소에만 해당되며 이것은 ".MFG"라는 확장명의 파일로 저장된다. 이렇게 저장된 모델 조각 파일은 언제든지 어떤 프로젝트에서 쉽게 포함시킬 수 있으며 일단 포함된 모델 조각은 프로젝트의 일부로 완전히 병합되므로 유닛과는 개념이 다르다.

도큐먼트 개체 다루기

도큐먼트의 개념

도큐먼트(Document)는 StarUML에서 파일로 저장되는 단위를 추상화한 개체이다. 즉, 프로젝트(.UML)나 유닛(.UNT)과 같은 단위를 하나의 개체로 접근할 수 있도록 여러 가지 프로퍼티와 메소드를 제공한다. 모델 조각(.PMF)도 하나의 파일이지만 내보내기/가져오기와 같이 사용되어 실제 StarUML애플리케이션 내부에서는 관리되지 않으므로 모델 조각에 대한 도큐먼트 개체는 존재하지 않는다. 다음은 도큐먼트 인터페이스들의 계층구조를 보여준다.

  • IDocument : 도큐먼트에 대한 최상위 인터페이스이다.
  • IUMLDocument : UML 모델에 관계된 도큐먼트에 대한 상위 인터페이스이다.
  • IUMLUnitDocument : StarUML에서 유닛(.UNT)으로 다루어지는 도큐먼트에 대한 인터페이스이다.
  • IUMLProjectDocument : StarUML에서 프로젝트(.UML)로 다루어지는 도큐먼트에 대한 인터페이스이다. 프로젝트 도큐먼트도 사실상 하나의 유닛 도큐먼트로 간주되므로 유닛 도큐먼트 인터페이스에서 상속 받는다.

도큐먼트 개체에 접근하기

프로젝트 도큐먼트 혹은 유닛 도큐먼트 개체에 접근하기 위해서는 먼저 IProjectManager 개체의 참조를 얻어와야 한다. 그러면 직접 프로젝트 및 유닛의 도큐먼트 개체에 접근할 수 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var prjmgr = app.ProjectManager; // Get project document object. var prj_doc = prjmgr.ProjectDocument; // Get unit document objects. for (var i = 0; i < prjmgr.GetUnitDocumentCount(); i++) { var unit_doc = prjmgr.GetUnitDocumentAt(i); }

IProjectManager를 통해서 도큐먼트에 접근할 수도 있지만, 특정 모델링 요소로부터 그것을 포함하는 도큐먼트 개체를 얻어올 수도 있다. 다음은 특정 요소로부터 프로젝트 도큐먼트 개체의 참조를 얻어와서 저장하는 예제이다.

var elem = ...  // Assign specific element(i.e. Class, Package, etc)
var elem_doc = elem.GetContainingDocument();
elem_doc.Save();

도큐먼트 프로퍼티 및 메소드

IDocument 인터페이스는 다음과 같은 여러 가지 프로퍼티와 메소드를 제공한다.

프로퍼티 설명
FileName: String 도큐먼트의 파일명을 가져온다. 파일명은 전체 경로 및 확장명을 포함한다.
Version: String 도큐먼트의 버전을 가져온다.
Modified: Boolean 도큐먼트가 사용자에 의해 변경되었는지를 판단한다.
ReadOnly: Boolean 도큐먼트 파일이 읽기전용 상태인지를 판단한다.
메소드 설명
GetDocumentSymbol(): String 도큐먼트 심볼을 얻어온다. 프로젝트 도큐먼트인 경우는 'PROJECT' 유닛 도큐먼트인 경우는 'UNIT' 문자열을 반환한다.
GetDocumentElement(): IElement 도큐먼트에서 최상위의 요소를 반환한다.
Save() 도큐먼트를 현재의 파일명으로 저장한다.
SaveAs(FileName: String) 도큐먼트를 다른 파일명으로 저장하고 현재 파일명을 변경한다.

프로젝트 개체 다루기

프로젝트 개체에 접근하기

프로젝트를 직접 다루기 위해서는 먼저 프로젝트 개체에 대한 참조를 가져와야 한다. 다음은 그것을 하기 위한 JScript 코드이다.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var prj = app.GetProject(); ...

애플리케이션 개체(app)에서 직접 얻어올 수도 있지만 다음과 같은 방법으로 프로젝트 개체에 접근할 수도 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var prjmgr = app.ProjectManager; var prj = prjmgr.Project; ...

프로젝트 명칭 및 프로퍼티 변경하기

프로젝트 개체에 대한 참조를 가져왔다면 프로젝트의 명칭 및 프로퍼티 그리고 다양한 메소드들을 호출할 수 있게 된다. 먼저 프로젝트의 명칭을 변경하기 위해서는 "Title"이라는 프로퍼티를 변경해야 한다. 그 외에 'Copyright', 'Author', 'Company' 등과 같은 프로퍼티도 같은 방법으로 변경할 수 있다.

...
prj.Title = "MyProject";
...

주의: 일반적인 모델링 요소들의 이름은 "Name"이라는 프로퍼티를 사용하는데, 프로젝트 개체에는 "Name" 프로퍼티를 사용하지 말아야 한다. 프로젝트는 최상위 패키지로써 이름을 가지지 않는다. 이름을 가지지 않는 이유는 요소들 간의 참조를 위해서 경로명(Pathname)을 흔히 사용하게 되는데, 프로젝트의 명칭을 변경하면 모든 경로명이 깨어지기 때문이다.

프로젝트 하위에 패키지 추가하기

프로젝트 하위에는 모델(Model), 서브시스템(Subsystem), 패키지(Package) 요소만이 추가될 수 있다. 요소를 새로 생성하여 추가하기 위해서는 IUMLFactory 개체를 사용해야 한다. 프로젝트 하위에 패키지를 추가하는 방법은 다음 예제를 참고하라.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var factory = app.UMLFactory; var prj = app.GetProject(); var newPackage = factory.CreatePackage(prj); newPackage.Name = "NewPackage";

새 프로젝트 만들기

새 프로젝트를 만들 때에는 IProjectManager 개체의 참조를 가져와서 NewProject 메소드를 호출한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var prjmgr = app.ProjectManager; prjmgr.NewProject();

새 프로젝트를 만들 때 빈(empty) 프로젝트를 만들지 않고 특정 접근법(Approach)을 적용하여 생성하고자 하는 경우에는 NewProjectByApproach 메소드를 사용한다. 다음 예는 "UMLComponents" 접근법을 사용하여 새 프로젝트를 만든 것을 보여준다.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var prjmgr = app.ProjectManager; prjmgr.NewProjectByApproach("UMLComponents");

프로젝트 열기

파일로 저장되어 있는 프로젝트 파일(.UML)을 열고자 할 때에는 IProjectManager 개체의 참조를 가져와서 OpenProject 메소드를 사용한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var prjmgr = app.ProjectManager; prjmgr.OpenProject("C:\\MyProject.uml");

프로젝트 저장하기

현재 StarUML에서 열려있는 프로젝트를 저장하기 위해서는 IProjectManager 개체의 참조를 가져온 다음 SaveProject 메소드를 사용한다. 만약, 다른 이름으로 저장하고자 할 때에는 SaveProjectAs 메소드를, 그리고 프로젝트의 모든 하위 유닛들을 저장하고자 할 때에는 SaveAllUnits 메소드를 사용한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var prjmgr = app.ProjectManager; prjmgr.SaveProject(); prjmgr.SaveProjectAs("MyProject2.uml"); prjmgr.SaveAllUnits();

프로젝트 닫기

프로젝트를 더 이상 사용하지 않게 위해서 닫을 때에는 IProjectManager 개체의 참조를 가져와서 CloseProject 메소드를 사용한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var prjmgr = app.ProjectManager; prjmgr.CloseProject();

유닛 다루기

새로운 유닛 분할하기

특정 패키지, 모델 혹은 서브시스템을 별도의 파일로 관리기 위해 새로운 유닛으로 분할하고자 한다면 IProjectManager 개체의 참조를 얻어와서 SeparateUnit 메소드를 사용한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var prjmgr = app.ProjectManager; var pkg = ... // Assign reference for the package to separate as a new unit. var new_unit = prjmgr.SeparateUnit(pkg, "NewUnit.unt");

유닛 병합하기

이미 유닛으로 분리되어 있는 패키지, 모델 혹은 서브시스템을 더 이상 별도의 파일로 관리하지 않기 위해서 병합하고자 한다면 IProjectManager 개체의 참조를 얻어와서 MergeUnit 메소드를 사용한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");

var prjmgr = app.ProjectManager; var pkg = ...
// Assigns reference for the package that will no longer be managed as a unit. prjmgr.MergeUnit(pkg);

하위 유닛에 접근하기

유닛은 계층적으로 구성될 수 있다. 프로젝트 하위에 여러 개의 유닛이 있을 수 있으며 그 유닛 하위에 또 다시 여러 개의 하위 유닛이 존재할 수 있다. 특정 유닛 하위에 존재하는 유닛들에 접근하기 위해서는 다음의 예를 참고하라.

var unit = ...  // Assigns reference for the unit that contains sub-units to access.
for (var i = 0; i < unit.GetSubUnitDocumentCount(); i++) {
    var sub_unit = unit.GetSubUnitDocumentAt(i);
    ...
}

모델 조각 다루기

패키지를 모델 조각으로 만들기

패키지, 모델 혹은 서브시스템을 별도의 모델 조각 파일로 저장할 수 있다. 다음과 같이 IProjectManager 개체의 참조를 가져와서  ExportModelFragment 메소드를 사용한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var prjmgr = app.ProjectManager;
var pkg = ...  // Assigns package to make as a model.
prjmgr.ExportModelFragment(pkg, "MyFragment.mfg");

모델 조각 가져오기

파일로 존재하는 모델 조각을 특정 패키지, 모델, 서브시스템 혹은 프로젝트에 포함시킬 수 있다. 다음과 같이 IProjectManager 개체의 참조를 가져와서 ImportModelFragment 메소드를 사용한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var prjmgr = app.ProjectManager;
var pkg = ...  // Assigns package to add a model fragment.
prjmgr.ImportModelFragment(pkg, "MyFragment.mfg");

모델링 요소 다루기

이 섹션에서는 StarUML외부 API 중에서 모델링 요소에 해당하는 인터페이스 타입들을 소개하고, 이들을 어떻게 사용하는지를 소개할 것이다. 모델링 요소는 UML을 사용하여 소프트웨어 모델링을 할 때 사용하게 되는 UML 모델(Model), 뷰(View), 그리고 다이어그램(Diagram) 요소들을 의미한다. 예를 들어 패키지, 클래스, 액터 등과 같은 모델 요소들과 각 모델 요소에 대응하는 뷰 요소들, 그리고 클래스 다이어그램, 유스 케이스 다이어그램 등과 같은 다이어그램 요소들이 여기에 해당한다. 모델링 요소에 대한 외부 API를 사용하여 모델, 뷰, 다이어그램 요소들을 생성, 삭제, 또는 수정할 수 있다.

참고: UML 모델링 요소에 대한 완전한 목록은 "Appendix B. UML 모델링 요소 목록"에서 확인할 수 있다.

모델링 요소의 구성

모델링 요소는 다음과 같은 논리적인 그룹으로 구분되어 있다.

  • Core Elements: Core Elements 그룹은 모델, 뷰, 다이어그램 요소들의 최상위 인터페이스를 정의하고 있다.
  • ExtCore Elements: ExtCore Elements 그룹은 확장 가능한 모델 요소들의 공통 상위 인터페이스를 정의하고 있다.
  • ViewCore Elements: ViewCore Elements 그룹은 뷰 요소들의 기반 타입들을 정의하고 있다.
  • UML Model Elements: UML 모델 요소들을 정의하고 있다. UML 표준 모델링 요소들에 해당한다.
  • UML View Elements: UML View Elements 그룹은 UML 뷰 요소들을 정의하고 있다.

모델링 요소는 크게 모델, , 그리고 다이어그램 타입으로 구분할 수 있다. 그런데 이 중에서 다이어그램 타입은 실제로는 모델 및 뷰 타입의 일부이기 때문에 모델 타입으로 구분하는 것이 더 정확하다. 모델은 소프트웨어 모델에 대한 실제 정보를 가지고 있는 요소이며, 뷰는 특정 모델이 담고 있는 정보를 시각적으로 표현하는 수단이다. 하나의 모델은 여러 개의 뷰를 가질 수 있으며, 뷰는 일반적으로 하나의 모델을 참조하게 된다.

모델링 요소를 사용하는 간단한 예제

모델링 요소들에 대한 외부 API 인터페이스들을 소개하기 전에, 모델링 요소 사용에 대한 힌트를 제공하기 위한 간단한 예제를 소개한다.
StarUML애플리케이션의 최상위 프로젝트(Project) 요소에서부터 패키지, 클래스, 인터페이스 등과 같은 네임스페이스(Namespace) 타입 요소들과 각 네임스페이스 타입 요소의 하위 요소들을 탐색(Trace)하려 한다고 가정하자. 이런 경우에 모델링 요소들의 구조를 이용해야 하는데, 먼저 이 기능을 구현한 아래의 JScript 코드를 보자.

var app, prj;

app = new ActiveXObject("StarUML.StarUMLApplication");
prj = app.GetProject();
VisitOwnedElement(prj);

function VisitOwnedElement(owner){
    var elem;

    for (var i = 0; i < owner.GetOwnedElementCount(); i++){
        elem = owner.GetOwnedElementAt(i);
        ...

        if (elem.IsKindOf("UMLNamespace")) VisitOwnedElement(elem);
    }
}

이 예제는 위에서 가정한 기능을 구현하기 위해, 최상위 프로젝트 요소에서부터 "OwnedElement" 관계에 있는 하위 요소들을 재귀적(Recursive)으로 얻어오고 있다. 이 코드의 핵심은 VisitOwnedElement 라는 사용자 정의 함수라고 할 수 있는데, 이 함수는 모델링 요소의 하나인 IUMLNamespace 타입의 요소를 인자로 받아 IUMLNamespace 인터페이스의 메소드인 GetOwnedElementCount, GetOwnedElementAt을 사용하고 있다.

VisitOwnedElement 함수를 구현하는데 대한 힌트는 모델링 요소들의 관계에서 얻을 수 있다. 아래의 그림은 StarUML외부 API 중에서 IUMLNamespace 인터페이스를 중심으로 위 예제와 관련 있는 인터페이스 타입들과의 관계를 요약해서 그린 것이다.

IUMLNamespace 인터페이스는 IUMLModelElement에서 상속되는데, 이것은 IUMLPackage, IUMLClass, IUMLInterface 타입 등에 대한 공통 상위 타입이다. 그리고 IUMLNamespceIUMLModelElementNamespace-OwnedElement라는 연관(Association) 관계를 맺고 있다. 이것을 보면 IUMLPackage, IUMLClass 등과 같은 IUMLNamespace 타입 모델링 요소들은 하위에 IUMLModelElement 타입 요소들을 OwnedElement 관계로 포함할 수 있음을 알 수 있을 것이다. 이처럼 모델링 요소들의 관계에 따라 외부 API의 모델링 요소 부분 인터페이스 구조가 정의된다.

노트: 표준 UML 요소에 해당하는 모델링 요소의 이름은 표준 UML 요소의 이름 앞에 접두어 "UML"을 붙인 형태이다. 예를 들어 UML의 한 요소인 Actor의 경우 UMLActor가 된다. 그리고 외부 API에서는 코딩 관례에 따라 접두어 'I'를 붙혀 IUMLActor 와 같이 사용된다. UML 모델링 요소의 목록과 각 요소의 이름에 대한 내용은 "Appendix B. UML 모델링 요소 목록"을 참고할 수 있다.

외부 API에서 연관관계를 표현하는 규칙

위의 그림에서 IUMLModelElement 인터페이스와 IUMLNamespace 인터페이스 타입은 OwnedElement-Namespace 연관관계를 가지고 있다. StarUML외부 API의 인터페이스 정의에서 이와 같은 연관관계는 참조로 표현되는데, 예를 들어 IUMLModelElement 인터페이스에는 Namespace 연관관계가 다음과 같이 표현된다.

IUMLModelElement
Namespace: IUMLNamespace

그리고 IUMLNamespace 인터페이스에는 OwnedElement 연관관계가 다음과 같이 표현되는데, 이것은 다중성(Multiplicity)이 복수 개(*) 이기 때문에 프로그램 내부 구현에서 집합 또는 리스트 구조를 사용하기 때문이다. 외부 API의 인터페이스 정의에서 연관관계는 모두 이와 같은 규칙에 따라 표현되므로 IUMLModelElement-IUMLNamespace 외의 다른 인터페이스들에도 똑같이 적용된다.

IUMLNamespace
function GetOwnedElementCount(): Integer;
function GetOwnedElementAt(Index: Integer): IUMLModelElement;

Core 요소들

Core Elements 그룹의 Core 요소들은 모델링 요소들에 대한 최상위 부모 인터페이스들이다. 여기에는 IElement, IModel, IView, IDiagram, IDiagramView 인터페이스가 있으며 아래의 그림과 같은 구조를 가진다. Core 그룹의 인터페이스 타입들은 일반적으로 많이 사용되며 중요한 역할을 하므로 아래의 구조를 주의 깊게 살펴볼 필요가 있다. 특히 인터페이스들의 연관관계를 잘 살펴보기 바란다.

인터페이스 타입 설명
IElement 모든 모델링 요소들의 공통 최상위 요소를 정의하는 인터페이스 타입.
IModel 모델 요소들의 공통 부모 요소를 정의하는 인터페이스 타입.
IView 뷰 요소들의 공통 부모 요소를 정의하는 인터페이스 타입.
IDiagram 다이어그램 모델 요소들의 공통 부모 요소를 정의하는 인터페이스 타입.
IDiagramView 다이어그램 뷰 요소들의 공통 부모 요소를 정의하는 인터페이스 타입.

IElement

IElement 인터페이스는 모든 모델링 요소들의 공통 최상위 타입을 정의하는 인터페이스이며, 다음과 같은 주요한 메소드들을 제공한다.

주요 메소드 설명
GetGUID(): String 모델링 요소의 GUID (Global Unique Identifier)를 반환하는 함수. GUID는 Base64 형식으로 인코딩되어 있다.
GetClassName(): String 모델링 요소의 클래스 이름을 반환하는 함수. 반환 값 예: "UMLClass"
IsKindOf(ClassName: String): Boolean 모델링 요소가 인자로 받은 것과 같은 타입의 요소인가를 검사하는 함수. 인자 값 예: "UMLClass"
IsReadOnly(): Boolean 모델링 요소가 읽기전용 상태인지 검사하는 함수. 읽기 전용인 상태의 모델링 요소는 속성값을 수정할 수 없다.
MOF_GetAttribute(Name: String): String 모델링 요소의 기본 타입 속성들 중에서 인자의 이름이 지정하는 속성의 값을 문자열로 반환한다.
MOF_GetReference(Name: String): IElement 모델링 요소의 참조 타입 속성들 중에서 인자의 이름이 지정하는 속성의 값(개체 참조)를 반환한다.
MOF_GetCollectionCount(Name: String): Integer 모델링 요소의 참조 컬렉션 타입 속성들 중에서 인자의 이름이 지정하는 참조 컬렉션의 아이템 개수를 반환한다.
MOF_GetCollectionItem(Name: String; Index: Integer): IElement 모델링 요소의 참조 컬렉션 속성들 중에서 인자의 이름이 지정하는 참조 컬렉션의 Index 번째 아이템에 해당하는 값(개체 참조)를 반환한다.

IElement 인터페이스의 메소드 중에서 MOF_XXX 메소드들은 문자열(String) 이름으로 각 모델링 요소의 속성값에 접근할 수 있는 일관성 있는 방법을 제공한다. 먼저 예를 하나 들면, IElement의 서브 타입인 IUMLModelElement는 "Visibility"라는 속성을 가진다. 일반적으로 이 속성의 값을 알기 위해서는 IUMLModelElement.Visibilty 와 같은 형식을 사용하게 되는데, 아래와 같이 IElement.MOF_GetAttribute 메소드를 사용하면 "Visibility" 라는 문자열 이름으로 해당 속성의 값을 얻어올 수 있다. MOF_XXX 메소드는 이처럼 각 모델링 요소의 기본 타입/참조 타입/참조 컬렉션 타입의 속성들에 대해 문자열 이름으로 접근할 수 있도록 하며, 이것은 때때로 매우 유용하게 사용될 수 있다.

노트: MOF_XXX 메소드들의 인자인 속성의 문자열 이름은 해당 속성의 이름과 동일하다.

다음의 예제는 IUMLModelElement 타입 요소에서 IElement.MOF_GetAttribute 메소드를 사용하여 요소의 "Visibility" 속성의 값을 읽고 있다. 주의할 것은, MOF_GetAttribute 메소드는 반환 값으로 문자열을 사용한다는 것이다. 이 예제에서 반환 값은 "vkPrivate", "vkPublic" 등이 될 수 있다.

...
var elem = ... // Get reference to IUMLModelElement type element object.
var val = elem.MOF_GetAttribute("Visibility");
...

모델링 요소의 참조(Reference) 타입 속성의 값을 읽을 때는 IElement.MOF_GetReference 메소드를 사용한다. MOF_GetReference 메소드는 IElement 타입 개체의 참조를 반환한다. 다음 예제는 IUMLModelElement 타입 요소의 "Namespace" 참조 속성의 값을 읽고 있다.

...
var elem = ... // Get reference to IUMLModelElement type element object.
var refElem = elem.MOF_GetReference("Namespace");
...

모델링 요소의 참조(Reference) 컬렉션 타입 속성의 값을 읽을 때는 IElement.MOF_GetCollectionItem 메소드를 사용한다. MOF_GetCollectionItem 메소드는 참조 컬렉션 타입 속성의 이름과 아이템 인덱스(Index)를 인자로 받는데, 컬렉션 아이템의 개수는 MOF_GetCollectionCount 메소드를 통해 알 수 있다. 그리고 MOF_GetCollectionItem 메소드는 MOF_GetReference 메소드와 마찬가지로 IElement 타입 개체의 참조를 반환한다. 다음 예제는 IUMLClassifier 타입 요소의 "Attributes" 참조 컬렉션 속성의 값을 읽고 있다.

...
var elem = ... // Get reference to IUMLClassifier type element object.

var colCount = elem.MOF_GetCollectionCount("Attributes");
for (var i = 0; i < colCount; i++){
    var colItem = elem.MOF_GetCollectionItem("Attributes", i);
    ...
}

주의: MOF_XXX 메소드들의 인자 값으로 존재하지 않는 속성 이름이 지정되면 에러가 발생한다.

IModel

IModel 인터페이스는 모델 요소들의 공통 부모 타입을 정의하는 인터페이스 타입으로, 다음과 같은 주요한 프로퍼티들과 메소드들을 제공한다.

주요 프로퍼티 설명
Name: String 이름 속성.
Documentation: String 문서화 속성.
Pathname: String 모델 요소의 경로이름. 경로이름은 최상위 프로젝트 요소를 제외한 모든 상위요소들의 이름이 '::'로 구분된 형태이다. 경로이름 예: "::Application Model::Modeling Elements::UML Model Elements".
※ 읽기전용.
주요 메소드 설명
AddAttachment(Attach: String); 첨부파일 속성에 값(파일경로, URL)을 추가한다.
FindByName(AName: String): IModel 하위 모델요소들 중에서 인자로 받은 이름과 동일한 이름의 요소가 있으면 반환한다.
FindByRelativePathname(RelPath: String): IModel 중첩된 하위 모델요소들 중에서 인자 값이 지정하는 상대경로이름과 일치하는 모델요소가 있으면 반환한다. 인자 값에는 해당 모델의 이름은 포함시키지 않는다. 인자 값 예: "Model_Management::UMLPackage"
ContainsName(AName: String): Boolean 하위 모델요소들 중에 인자로 받은 이름과 동일한 이름의 요소가 이미 있는지 검사한다.
CanDelete(): Boolean 해당 모델요소가 읽기전용 상태인지 검사한다.
GetViewCount: Integer 해당 모델의 뷰 요소의 개수를 반환한다.
GetViewAt(Index: Integer): IView 해당 모델의 뷰 요소들 중에서 Index 번 째 요소를 반환한다.
GetOwnedDiagramCount: Integer 해당 모델이 포함하고 있는 다이어그램 요소의 개수를 반환한다.
GetOwnedDiagramAt(Index: Integer): IDiagram 해당 모델이 포함하고 있는 다이어그램 요소 중에서 Index 번 째 요소를 반환한다.

아래의 예제는 모델 요소의 기본적인 속성 값들을 읽고 다시 값을 설정하는 것을 보여주는 것이다.

function DoingSomething(elem){
    if (elem.GetClassName() == "UMLClass"){
        if (elem.IsReadOnly() != true){
            elem.Name = "class_" + elem.Name;
            elem.Documentation = "I am a class";
            elem.AddAttachment("http://www.staruml.com");
        }
    }
}
모델 요소의 하위 요소를 찾을 경우 FindByName 메소드와 FindByRelativePathname 메소드를 사용할 수 있다. FindByName 메소드는 하위 요소들 중에서 인자로 받은 스트링 값과 이름이 동일한 첫 번째 하위 요소를 반환한다. FindByName 메소드는 모델 요소의 바로 밑 하위 요소에 대해서만 검색을 수행하는데, 하위 요소들이 중첩된 구조로 되어있는 경우 모든 하위 요소들에 대해 검색을 수행하려면 FindByRelativePathname 메소드를 사용해야 한다. 다음 예제는 FindByNameFindByRelativePathname 메소드를 사용하는 방법을 보이고 있다.
var app = new ActiveXObject("StarUML.StarUMLApplication");
var rootElem = app.FindByPathname("::Application Model::Modeling Elements::UML Model Elements");

var elem = rootElem.FindByName("Model_Management");
var elem2 = rootElem.FindByRelativePathname("Model_Management::UMLPackage");

위의 그림에서 보인 바와 같이 IModel 인터페이스와 IView 인터페이스는 Model-View 연관관계를 맺고 있다. IModel 타입 요소는 여러 개의 IView 타입 요소를 가질 수 있으며 IView 타입 요소는 하나의 IModel 타입 요소를 가져야 한다. 아래의 예제는 각 IUMLClass 타입 요소에 대한 모든 IView 타입 요소 참조를 얻는 방법을 보여주고 있다.

var elem = ... // Get reference to IModel type element.

if (elem.GetClassName() == "UMLClass"){
    for (var i = 0; i < elem.GetViewCount(); i++){
        var view = elem.GetViewAt(i);
        ...
    }
}

위의 그림에서 보인 바와 같이 IModel 인터페이스와 IDiagram 인터페이스는 DiagramOwner-OwnedDiagram 연관관계를 맺고 있다. IDiagram 인터페이스는 모든 다이어그램 모델 타입들의 부모 타입이기 때문에 아래의 예제와 같은 방식으로 모델 요소가 포함하고 있는 다이어그램 요소들의 참조를 얻을 수 있다.

var elem = ... // IModel type element
for (int i = 0; i < elem.GetOwnedDiagramCount(); i++){
    var dgm = elem.GetOwnedDiagramAt(i);
    ...
}

IView

IView 인터페이스는 뷰 요소들의 공통 부모 타입을 정의하는 인터페이스로 다음과 같은 주요한 프로퍼티들을 제공한다.

주요 프로퍼티 설명
LineColor: String 선의 색상을 지정한다. BGR 형식을 사용한다.
예: "0xff0000" (blue); "0x00ff00" (green); "0x0000ff" (red); "0x000000" (black); "0xffffff" (white)
FillColor: String 채움 색상을 지정한다. BGR 형식을 사용한다.
FontFace: String 폰트를 지정한다. 예: "Times New Roman"
FontColor: String 폰트의 색상을 지정한다. BGR 형식을 사용한다.
FontSize: String 폰트의 크기를 지정한다.
FontStyle: Integer 폰트의 스타일을 지정한다. 정수 1 (bold), 2 (italic), 3 (underline), 4 (strikeout)를 사용하거나 조합하여 사용할 수 있다. 예: 1 + 2 (bold & italic)
※ 기본적인 스타일이 정해져 있는 뷰 요소에는 적용되지 않는다.
Selected: Boolean 해당 뷰 요소가 현재 선택된 상태인지를 지정한다.
※ 읽기전용.
Model: IModel 해당 뷰 요소에 대응하는 모델 요소에 대한 참조를 지정한다.
※ 읽기전용.
OwnerDiagramView: IDiagramView 해당 뷰 요소가 포함되어 있는 다이어그램 뷰 요소를 지정한다.
※ 읽기전용.

아래의 예제는 IVew 타입 요소의 기본적인 속성 값들을 설정하는 것을 보여주는 것이다.

var view = ... // IView type element
view.LineColor = "0x0000ff";
view.FillColor = "0x00ffff";
view.FontFace = "Times New Roman";
view.FontColor = "0x0000ff";
view.FontSize = "12";
view.FontStyle = 1;

IUMLNoteView, IUMLNoteLinkView, IUMLTextView 타입 뷰 요소를 제외한 뷰 요소들은 모델 요소에 대한 참조를 가지고 있다. IView 타입 요소가 참조하고 있는 IModel 타입 요소의 정보를 얻으려면 다음과 같이 할 수 있다.

var view = ... // IView type element
var mdl = view.Model;
...

IView 타입 요소가 속해 있는 다이어그램 정보를 얻을 때는 아래의 코드와 같이 할 수 있다.

var view = ... // IView type element
var dgmView = view.OwnerDiagramView;
...

IDiagram

IDiagram 인터페이스는 IModel 인터페이스에서 상속되며 모든 다이어그램 타입 모델 요소들의 공통 부모 타입이다. IDiagram 인터페이스는 다음과 같은 주요 프로퍼티들을 가진다.

주요 프로퍼티 설명
DefaultDiagram: Boolean 해당 다이어그램이 Default Diagram인지를 지정한다. Default Diagram은 프로젝트가 열릴 때 자동으로 열리는 다이어그램을 의미하며, 클래스/유스 케이스/컴포넌트/디플로이먼트 다이어그램에만 지정할 수 있다.
DiagramOwner: IModel 해당 다이어그램이 포함되어있는 상위 모델 요소를 지정한다.
※ 읽기전용
DiagramView: IDiagramView 해당 다이어그램 모델에 대응하는 다이어그램 뷰 요소를 지정한다.
※ 읽기전용

IDiagramView

IDiagramView 인터페이스는 IView 인터페이스에서 상속되며 모든 다이어그램 뷰 요소들의 공통 부모 타입이다.

주요 프로퍼티 설명
Diagram: IDiagram 해당 다이어그램 뷰 요소에 대응하는 다이어그램 모델 요소를 지정한다.
※ 읽기전용
주요 메소드 설명
GetSelectedViewCount: Integer 다이어그램에서 현재 선택된 상태에 있는 뷰 요소들의 개수를 반환한다.
GetSelectedViewAt(Index: Integer): IView 다이어그램에서 현재 선택된 상태에 있는 뷰 요소들 중에서 Index 번 째 요소를 반환한다.
GetOwnedViewCount: Integer 다이어그램에 포함되어 있는 뷰 요소들의 개수를 반환한다.
GetOwnedViewAt(Index: Integer): IView 다이어그램에 포함되어 있는 뷰 요소들 중에서 Index 번 째 요소를 반환한다.
LayoutDiagram() 다이어그램을 자동배치시킨다.
ExportDiagramAsBitmap(FileName: String) 다이어그램을 Bitmap 이미지로 변환하여 해당 경로와 파일명으로 저장한다.
ExportDiagramAsMetafile(FileName: String) 다이어그램을 Windows Metafile로 변환하여 해당 경로와 파일명으로 저장한다.
ExportDiagramAsJPEG(FileName: String) 다이어그램을 JPEG 이미지로 변환하여 해당 경로와 파일명으로 저장한다.

ExtCore 요소들

ExtCore 요소들은 UML 확장 기능을 적용할 수 있는 모델 요소들에 대한 기반 구조를 제공한다. UML 확장 기능이 적용되는 모든 모델 요소들은 IExtensibleModel 인터페이스에서 상속된다. IExtensibleModel 인터페이스는 다음 그림과 같이 여러 개의 제약사항(Constraint)과 태그값(Tagged Value)을 가질 수 있다.

인터페이스 타입 설명
IExtensibleModel UML 확장 기능을 적용할 수 있는 모델 요소들의 공통 상위 타입.
IConstraint 제약사항 요소.
ITaggedValue 태그값 요소.

IExtensibleModel

IExtensibleModel 인터페이스는 다음과 같은 주요 프로퍼티 및 메소드를 정의하고 있다.

주요 프로퍼티 설명
StereotypeProfile: String 해당 모델 요소에 적용된 스테레오타입이 정의되어 있는 UML 프로파일 이름을 지정한다.
※ 읽기전용
StereotypeName: String 해당 모델 요소에 적용된 스테레오타입 이름을 지정한다.
※ 읽기전용
주요 메소드 설명
GetConstraintCount: Integer 해당 모델이 포함하고 있는 제약사항 요소의 개수를 반환한다.
GetConstraintAt(Index: Integer): IConstraint 해당 모델이 포함하고 있는 제약사항 요소 중에서 Index 번 째 요소를 반환한다.
AddConstraint(Name: String; Body: String): IConstraint 제약사항 요소를 인자가 정하는 이름과 값으로 생성한다.
IndexOfConstraint(AConstraint: IConstraint): Integer 인자가 지정하는 제약사항 요소의 인덱스를 반환한다.
DeleteConstraint(Index: Integer) 해당 모델이 포함하고 있는 제약사항 요소 중에서 Index 번 째 요소를 삭제한다.
GetTaggedValueCount: Integer 해당 모델이 포함하고 있는 태그값 요소의 개수를 반환한다.
GetTaggedValueAt(Index: Integer): ITaggedValue 해당 모델이 포함하고 있는 태그값 요소 중에서 Index 번 째 요소를 반환한다.
GetStereotype: IStereotype 해당 모델에 적용된 스테레오타입 요소를 반환한다.
SetStereotype(const Name: WideString) IStereotype 요소가 아니라 단지 문자열로 스테레오타입 값을 지정한다.
SetStereotype2(Profile: String; Name: String) 스테레오타입이 정의된 UML 프로파일과 스테레오타입 값을 같이 지정한다.

스테레오타입이나 태그값의 경우 원칙적으로 UML 프로파일을 통해 정의되어야 한다. 그렇지만 StarUML에서는 스테레오타입의 경우 UML 프로파일에 익숙하지 않은 사용자들을 위해 문자열 값으로 설정할 수 있도록 허용하고 있다. 아래의 예제는 어떤 IExtensibleModel 타입 요소에서 스테레오타입 값을 읽고 다시 설정하는 것을 보여주고 있다.

var elem = ... // Get reference to model element.
if (elem.IsKindOf("ExtensibleModel")){
    var stereotypeStr = elem.StereotypeName;
    if (stereotypeStr == ""){
        elem.SetStereotype("Stereotype1");
    } 
}

스테레오타입의 경우와 달리 태그값의 경우에는 반드시 UML 프로파일을 통해 정의된 것만 사용할 수 있다. UML 프로파일, 스테레오타입, 태그값에 대한 자세한 설명은 "Chapter 7. Writing UML Profiles"를 참고하라.

IConstraint

제약사항은 StarUML애플리케이션에서 위의 그림과 같이 제약사항 편집기를 통해서 추가하거나 편집할 수 있는데, 외부 API에서는 IConstraint 인터페이스를 사용하여 제약사항을 추가하거나 편집할 수 있다. IConstraint 인터페이스는 다음과 같은 프로퍼티를 제공한다.

주요 프로퍼티 설명
Name: String 제약사항의 이름.
Body: String 제약사항의 내용.
ConstrainedModel: IExtensibleModel 이 제약사항이 적용된 IExtensibleModel 타입 요소.

제약사항 요소는 IExtensibleModel 타입 요소가 제공하는 메소드를 통해 생성할 수 있는데, 아래의 예제는 어떤 IExtensibleModel 타입 요소에 제약사항을 추가하고 편집하고 삭제하는 것을 보여준다.

var elem = ... // Get reference to IExtensibleModel type element.

var AConstraint = elem.AddConstraint("Constraint1", "Constraint Value1");
var constrName = AConstraint.Name;
var constrValue = AConstraint.Body;
var idx = elem.IndexOfConstraint(AConstraint);
elem.DeleteConstraint(idx);

ITaggedValue

ITaggedValue 인터페이스는 태그값 요소를 정의하는 인터페이스로 다음과 같은 프로퍼티와 메소드들을 제공한다. 태그값 요소에 대한 자세한 설명은 "Chapter 7. Writing UML Profiles"를 참고하기 바란다.

주요 프로퍼티 설명
ProfileName: String 해당 태그값이 정의된 UML 프로파일 이름을 지정한다.
※ 읽기전용
TagDefinitionSetName: String 해당 태그값이 포함되어 있는 태그 정의 집합 (Tag Definition Set)을 지정한다.
※ 읽기전용
Name: String UML 프로파일에서 정의된 해당 태그값의 이름을 지정한다.
※ 읽기전용
DataValue: String 태그값의 값을 지정한다.
※ 읽기전용
TaggedModel: IExtensibleModel 해당 태그값이 적용된 IExtensibleModel 타입 요소에 대한 참조를 지정한다.
※ 읽기전용
주요 메소드 설명
GetTagDefinition: ITagDefinition 해당 태그값에 대한 태그정의 요소를 반환한다.
GetTagDefinitionSet: ITagDefinitionSet 해당 태그값에 대한 태그정의집합 요소를 반환한다.
GetProfile: IProfile 해당 태그값이 정의된 UML 프로파일 요소를 반환한다.

ViewCore 요소들

ViewCore 그룹의 인터페이스 타입들은 IView 인터페이스에서 상속 받으며 모든 뷰 타입 요소들에 대한 기반 구조를 제공한다. ViewCore 그룹에는 많은 인터페이스 타입들이 포함되는데 여기서는 가장 중요한 INodeView, IEdgeView 인터페이스를 중심으로 설명한다.

주요 타입 설명
INodeView Node 타입 뷰들의 최상위 인터페이스 타입.
IEdgeView Edge 타입 뷰들의 최상위 인터페이스 타입.

INodeView

INodeView 인터페이스는 Node 타입 뷰 요소들에 대한 기반 타입이다. Node 타입 뷰는 Class View와 같이 면적을 가지는 형태의 뷰 요소를 의미한다. INodeView 인터페이스는 다음과 같은 주요한 프로퍼티를 제공한다.

주요 프로퍼티 설명
Left: Integer 뷰의 위치 정보 (Left).
Top: Integer 뷰의 위치 정보 (Top).
Width: Integer 뷰의 크기 정보 (Width).
Height: Integer 뷰의 크기 정보 (Height).
MinWidth: Integer 해당 뷰 요소의 최소 크기를 지정한다 (Width).
※ 읽기전용
MinHeight: Integer 해당 뷰 요소의 최소 크기를 지정한다 (Height).
※ 읽기전용
AutoResize: Boolean 해당 뷰 요소의 자동크기 속성을 지정한다.

다음 예제는 INodeView 타입 뷰의 위치와 크기를 변경하는 예를 보이고 있다.

var nodeView = ... // Get reference to INodeView type element.
var l = nodeView.Left;
var t = nodeView.Top;
var w = nodeView.Width;
var h = nodeView.Height;
nodeView.Left = l * 2;
nodeView.Top = t * 2;
nodeView.Width = w * 2;
nodeView.Height = h * 2;

IEdgeView

IEdgeView 인터페이스는 Edge 타입 뷰 요소들에 대한 기반 타입이다. Edge 타입 뷰는 Dependency View와 같은 선 형태의 뷰 요소를 의미한다. IEdgeView 인터페이스는 다음과 같은 주요한 프로퍼티를 제공한다.

주요 프로퍼티 설명
LineStyle: LineStyleKind 선 스타일을 지정한다.
Points: IPoints 선의 좌표정보를 지정한다.
Tail: IView 선의 시작 지점이 되는 뷰 요소를 지정한다.
Head: IView 선의 끝 지점이 되는 뷰 요소를 지정한다.

Edge 타입 뷰의 선 스타일은 LineStyleKind 열거체(Enumeration)에서 정의된 다음 값들을 사용할 수 있다.

설명
lsRectilinear 직교선 형태의 선 스타일.
lsOblique 꺽은선 형태의 선 스타일.

다음 예제는 Edge 타입 뷰의 선 스타일을 변경하는 예를 보이고 있다.

lsRectilinear = 0;
lsOblique = 1;

var view = ... // Get reference to view element.
if (view.IsKindOf("EdgeView")){
    view.LineStyle = lsRectilinear;
}

UML 모델 요소 다루기

UML Model Elements 그룹은 다시 다음과 같은 패키지들로 그룹화되어 있다. 참고로 UML Model Elements 그룹에 정의된 UML 모델 요소들은 UML 표준 명세에서 정의하고 있는 표준 UML 요소들에 대한 StarUML의 구현으로, 표준 UML 요소들과 거의 동일하다. 여기서는 UML Model Elements 그룹에 있는 구체적인 UML 모델 요소들에 대한 설명은 하지 않는다.

UML 모델 요소 생성하기

UML 모델 요소를 생성할 때는 IUMLFactory 인터페이스를 사용해야 한다. IUMLFactory 인터페이스는 UML 모델 요소 뿐만 아니라 UML 다이어그램 요소 및 UML 뷰 요소들과 같은 모든 UML 모델링 요소들에 대한 생성 메소드들을 제공한다. IUMLFactory 타입 개체는 다음과 같이 IStarUMLApplication 타입 개체를 통해 얻을 수 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var facto = app.UMLFactory;
...

IUMLFactory는 다음과 같은 UML 모델 요소 생성 메소드들을 제공한다.

UML 모델 요소 생성 메소드
UMLModel CreateModel(AOwner: UMLNamespace): IUMLModel
UMLSubsystem CreateSubsystem(AOwner: UMLNamespace): IUMLSubsystem
UMLPackage CreatePackage(AOwner: UMLNamespace): IUMLPackage
UMLClass CreateClass(AOwner: UMLNamespace): IUMLClass
UMLInterface CreateInterface(AOwner: UMLNamespace): IUMLInterface
UMLEnumeration CreateEnumeration(AOwner: UMLNamespace): IUMLEnumeration
UMLSignal CreateSignal(AOwner: UMLNamespace): IUMLSignal
UMLException CreateException(AOwner: UMLNamespace): IUMLException
UMLComponent CreateComponent(AOwner: UMLNamespace): IUMLComponent
UMLComponentInstance CreateComponentInstance(AOwner: UMLNamespace): IUMLComponentInstance
UMLNode CreateNode(AOwner: UMLNamespace): IUMLNode
UMLNodeInstance CreateNodeInstance(AOwner: UMLNamespace): IUMLNodeInstance
UMLUseCase CreateUseCase(AOwner: UMLNamespace): IUMLUseCase
UMLActor CreateActor(AOwner: UMLNamespace): IUMLActor
UMLActivityGraph CreateActivityGraph(AContext: UMLModelElement): IUMLActivityGraph
UMLStateMachine CreateStateMachine(AContext: UMLModelElement): IUMLStateMachine
UMLCompositeState CreateCompositeState(AOwnerState: UMLCompositeState): IUMLCompositeState
UMLCollaboration CreateCollaboration(AOwner: UMLClassifier): IUMLCollaboration
UMLCollaboration CreateCollaboration2(AOwner: UMLOperation): IUMLCollaboration
UMLCollaborationInstanceSet CreateCollaborationInstanceSet(AOwner: UMLClassifier): IUMLCollaborationInstanceSet
UMLCollaborationInstanceSet CreateCollaborationInstanceSet2(AOwner: UMLOperation): IUMLCollaborationInstanceSet
UMLInteraction CreateInteraction(ACollaboration: UMLCollaboration): IUMLInteraction
UMLInteractionInstanceSet CreateInteractionInstanceSet(ACollaborationInstanceSet: UMLCollaborationInstanceSet): IUMLInteractionInstanceSet
UMLActionState CreateActionState(AOwnerState: UMLCompositeState): IUMLActionState
UMLSubactivityState CreateSubactivityState(AOwnerState: UMLCompositeState): IUMLSubactivityState
UMLPseudostate CreatePseudostate(AOwnerState: UMLCompositeState): IUMLPseudostate
UMLFinalState CreateFinalState(AOwnerState: UMLCompositeState): IUMLFinalState
UMLPartition CreatePartition(AActivityGraph: UMLActivityGraph): IUMLPartition
UMLSubmachineState CreateSubmachineState(AOwnerState: UMLCompositeState): IUMLSubmachineState
UMLAttribute CreateAttribute(AClassifier: UMLClassifier): IUMLAttribute
UMLAttribute CreateQualifier(AAssociationEnd: UMLAssociationEnd): IUMLAttribute
UMLOperation CreateOperation(AClassifier: UMLClassifier): IUMLOperation
UMLParameter CreateParameter(ABehavioralFeature: UMLBehavioralFeature): IUMLParameter
UMLTemplateParameter CreateTemplateParameter(AClass: UMLClass): IUMLTemplateParameter
UMLTemplateParameter CreateTemplateParameter2(ACollaboration: UMLCollaboration): IUMLTemplateParameter
UMLEnumerationLiteral CreateEnumerationLiteral(AEnumeration: UMLEnumeration): IUMLEnumerationLiteral
UMLUninterpretedAction CreateEntryAction(AState: UMLState): IUMLUninterpretedAction
UMLUninterpretedAction CreateDoAction(AState: UMLState): IUMLUninterpretedAction
UMLUninterpretedAction CreateExitAction(AState: UMLState): IUMLUninterpretedAction
UMLUninterpretedAction CreateEffect(ATransition: UMLTransition): IUMLUninterpretedAction
UMLSignalEvent CreateSignalEvent(ATransition: UMLTransition): IUMLSignalEvent
UMLCallEvent CreateCallEvent(ATransition: UMLTransition): IUMLCallEvent
UMLTimeEvent CreateTimeEvent(ATransition: UMLTransition): IUMLTimeEvent
UMLChangeEvent CreateChangeEvent(ATransition: UMLTransition): IUMLChangeEvent
UMLClassifierRole CreateClassifierRole(ACollaboration: UMLCollaboration): IUMLClassifierRole
UMLObject CreateObject(ACollaborationInstanceSet: UMLCollaborationInstanceSet): IUMLObject
UMLObject CreateObject2(AOwner: UMLNamespace): IUMLObject
UMLTransition CreateTransition(AStateMachine: UMLStateMachine; Source: UMLStateVertex; Target: UMLStateVertex): IUMLTransition
UMLDependency CreateDependency(AOwner: UMLNamespace; Client: UMLModelElement; Supplier: UMLModelElement): IUMLDependency
UMLAssociation CreateAssociation(AOwner: UMLNamespace; End1: UMLClassifier; End2: UMLClassifier): IUMLAssociation
UMLAssociationClass CreateAssociationClass(AOwner: UMLNamespace; AAssociation: UMLAssociation; AClass: UMLClass): IUMLAssociationClass
UMLGeneralization CreateGeneralization(AOwner: UMLNamespace; Parent: UMLGeneralizableElement; Child: UMLGeneralizableElement): IUMLGeneralization
UMLLink CreateLink(ACollaborationInstanceSet: UMLCollaborationInstanceSet; End1: UMLInstance; End2: UMLInstance): IUMLLink
UMLAssociationRole CreateAssociationRole(ACollaboration: UMLCollaboration; End1: UMLClassifierRole; End2: UMLClassifierRole): IUMLAssociationRole
UMLStimulus CreateStimulus(AInteractionInstanceSet: UMLInteractionInstanceSet; Sender: UMLInstance; Receiver: UMLInstance; Kind: UMLFactoryMessageKind): IUMLStimulus
UMLStimulus CreateStimulus2(AInteractionInstanceSet: UMLInteractionInstanceSet; Sender: UMLInstance; Receiver: UMLInstance; CommunicationLink: UMLLink; Kind: UMLFactoryMessageKind): IUMLStimulus
UMLMessage CreateMessage(AInteraction: UMLInteraction; Sender: UMLClassifierRole; Receiver: UMLClassifierRole; Kind: UMLFactoryMessageKind): IUMLMessage
UMLMessage CreateMessage2(AInteraction: UMLInteraction; Sender: UMLClassifierRole; Receiver: UMLClassifierRole; CommunicationConnection: UMLAssociationRole; Kind: UMLFactoryMessageKind): IUMLMessage
UMLInclude CreateInclude(AOwner: UMLNamespace; Includer: UMLUseCase; Includee: UMLUseCase): IUMLInclude
UMLExtend CreateExtend(AOwner: UMLNamespace; Extender: UMLUseCase; Extendee: UMLUseCase): IUMLExtend
UMLRealization CreateRealization(AOwner: UMLNamespace; Client: UMLModelElement; Supplier: UMLModelElement): IUMLRealization

다음 예제는 IUMLFactory를 사용하여 UML 모델 요소들을 생성하는 예를 보이고 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var facto = app.UMLFactory;

var pjt = app.GetProject();
var mdlElem = facto.CreateModel(pjt);           // Create UMLModel element.
var pkgElem = facto.CreatePackage(mdlElem);     // Create UMLPackage element.
var clsElem1 = facto.CreateClass(pkgElem);      // Create UMLClass element.
var clsElem2 = facto.CreateClass(pkgElem);      // Create UMLClass element.
var attrElem = facto.CreateAttribute(clsElem1); // Create UMLAttribute element.
var opElem = facto.CreateOperation(clsElem1);   // Create UMLOperation element.
var paramElem1 = facto.CreateParameter(opElem); // Create UMLParameter element.
var paramElem2 = facto.CreateParameter(opElem); // Create UMLParameter element.
paramElem1.TypeExpression = "String";
paramElem2.Type_ = clsElem2;
...

UML 모델 요소 삭제하기

UML 모델 요소를 삭제할 때는 IStarUMLApplication 인터페이스의 DeleteModel 메소드를 사용하면 된다. 모델 요소를 삭제하기 전에 먼저 IModel 인터페이스의 CanDelete 메소드를 사용하여 해당 모델 요소가 삭제 가능한 상태인지 검사할 수 있다. 해당 모델 요소가 읽기전용 상태인 경우 CanDelete 메소드는 "false"를 반환할 것이다. 어떤 모델 요소를 삭제했을 때 해당 모델 요소 하위의 모든 모델 요소들이 같이 삭제되며, 해당 모델 요소와 연관된 모든 뷰 요소들도 자동으로 삭제된다는 점을 기억해야 한다. 다음 예제는 위의 모델 요소 생성 예제에 연결하여 클래스 요소 하나를 삭제하는 것을 보여준다.

...
if (clsElem1.CanDelete() == true){
    app.DeleteModel(clsElem1);
}
...

UML 다이어그램 다루기

UML 다이어그램 요소 생성하기

UML 모델 요소 생성과 같이 UML 다이어그램 요소를 생성할 때도 IUMLFactory를 사용하는데, IUMLFactory의 다이어그램 관련 생성 메소드들은 다음과 같은 것이 있다.

UML 다이어그램 요소 생성 메소드
UMLClassDiagram CreateClassDiagram(AOwner: Model): IUMLClassDiagram
UMLUseCaseDiagram CreateUseCaseDiagram(AOwner: Model): IUMLUseCaseDiagram
UMLSequenceDiagram CreateSequenceDiagram(AOwner: UMLInteractionInstanceSet): IUMLSequenceDiagram
UMLSequenceRoleDiagram CreateSequenceRoleDiagram(AOwner: UMLInteraction): IUMLSequenceRoleDiagram
UMLCollaborationDiagram CreateCollaborationDiagram(AOwner: UMLInteractionInstanceSet): IUMLCollaborationDiagram
UMLCollaborationRoleDiagram CreateCollaborationRoleDiagram(AOwner: UMLInteraction): IUMLCollaborationRoleDiagram
UMLStatechartDiagram CreateStatechartDiagram(AOwner: UMLStateMachine): IUMLStatechartDiagram
UMLActivityDiagram CreateActivityDiagram(AOwner: UMLActivityGraph): IUMLActivityDiagram
UMLComponentDiagram CreateComponentDiagram(AOwner: Model): IUMLComponentDiagram
UMLDeploymentDiagram CreateDeploymentDiagram(AOwner: Model): IUMLDeploymentDiagram

UML 다이어그램 요소의 생성 방법은 위에서 보인 UML 모델 요소 생성과 거의 동일한데, UML 다이어그램 요소는 모델 타입 요소가 생성될 때 관련된 뷰 타입 요소도 자동으로 생성된다는 차이점이 있다. 아래의 예는 UML 다이어그램 요소를 생성하고 자동으로 생성된 UML 다이어그램 뷰 요소에 접근하는 것을 보이고 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var pkgElem = ...                                 // Upper level model element to contain UML diagram element.

var dgmElem = facto.CreateClassDiagram(pkgElem);  // Create UMLClassDiagram.
var dgmViewElem = dgmElem.DiagramView;            // Automatically created diagram view element.
app.OpenDiagram(dgmElem);
...

UML 다이어그램 요소 삭제하기

UML 다이어그램 요소도 UML 모델 요소들 중의 하나이므로 UML 모델 요소의 삭제와 마찬가지로 IStarUMLApplication 인터페이스의 DeleteModel 메소드를 사용하여 삭제할 수 있다. 그리고 삭제 가능 여부를 검사하려면 IModel 인터페이스의 CanDelete 메소드를 사용하면 된다.

UML 뷰 요소 다루기

UML 뷰 요소 생성하기

뷰 요소를 생성할 때도 IUMLFactory를 사용한다. 뷰 요소 생성과 관련된 IUMLFactory 메소드 목록은 다음과 같다.

UML 뷰 요소 생성 메소드
UMLNoteView CreateNoteView(ADiagramView: DiagramView): IUMLNoteView
UMLNoteLinkView CreateNoteLinkView(ADiagramView: DiagramView; ANote: UMLNoteView; LinkTo: View): IUMLNoteLinkView
UMLTextView CreateTextView(ADiagramView: DiagramView): IUMLTextView
UMLModelView CreateModelView(ADiagramView: DiagramView; AModel: UMLModel): IUMLModelView
UMLSubsystemView CreateSubsystemView(ADiagramView: DiagramView; AModel: UMLSubsystem): IUMLSubsystemView
UMLPackageView CreatePackageView(ADiagramView: DiagramView; AModel: UMLPackage): IUMLPackageView
UMLClassView CreateClassView(ADiagramView: DiagramView; AModel: UMLClass): IUMLClassView
UMLInterfaceView CreateInterfaceView(ADiagramView: DiagramView; AModel: UMLInterface): IUMLInterfaceView
UMLEnumerationView CreateEnumerationView(ADiagramView: DiagramView; AModel: UMLEnumeration): IUMLEnumerationView
UMLSignalView CreateSignalView(ADiagramView: DiagramView; AModel: UMLSignal): IUMLSignalView
UMLExceptionView CreateExceptionView(ADiagramView: DiagramView; AModel: UMLException): IUMLExceptionView
UMLComponentView CreateComponentView(ADiagramView: DiagramView; AModel: UMLComponent): IUMLComponentView
UMLComponentInstanceView CreateComponentInstanceView(ADiagramView: DiagramView; AModel: UMLComponentInstance): IUMLComponentInstanceView
UMLNodeView CreateNodeView(ADiagramView: DiagramView; AModel: UMLNode): IUMLNodeView
UMLNodeInstanceView CreateNodeInstanceView(ADiagramView: DiagramView; AModel: UMLNodeInstance): IUMLNodeInstanceView
UMLActorView CreateActorView(ADiagramView: DiagramView; AModel: UMLActor): IUMLActorView
UMLUseCaseView CreateUseCaseView(ADiagramView: DiagramView; AModel: UMLUseCase): IUMLUseCaseView
UMLCollaborationView CreateCollaborationView(ADiagramView: DiagramView; AModel: UMLCollaboration): IUMLCollaborationView
UMLCollaborationInstanceSetView CreateCollaborationInstanceSetView(ADiagramView: DiagramView; AModel: UMLCollaborationInstanceSet): IUMLCollaborationInstanceSetView
UMLGeneralizationView CreateGeneralizationView(ADiagramView: DiagramView; AModel: UMLGeneralization; Parent: View; Child: View): IUMLGeneralizationView
UMLAssociationView CreateAssociationView(ADiagramView: DiagramView; AModel: UMLAssociation; End1: View; End2: View): IUMLAssociationView
UMLAssociationClassView CreateAssociationClassView(ADiagramView: DiagramView; AModel: UMLAssociationClass; AssociationView: View; ClassView: View): IUMLAssociationClassView
UMLDependencyView CreateDependencyView(ADiagramView: DiagramView; AModel: UMLDependency; Client: View; Supplier: View): IUMLDependencyView
UMLRealizationView CreateRealizationView(ADiagramView: DiagramView; AModel: UMLRealization; Client: View; Supplier: View): IUMLRealizationView
UMLIncludeView CreateIncludeView(ADiagramView: DiagramView; AModel: UMLInclude; Base: View; Addition: View): IUMLIncludeView
UMLExtendView CreateExtendView(ADiagramView: DiagramView; AModel: UMLExtend; Base: View; Extension: View): IUMLExtendView
UMLColObjectView CreateObjectView(ADiagramView: DiagramView; AModel: UMLObject): IUMLColObjectView
UMLSeqObjectView CreateSeqObjectView(ADiagramView: UMLSequenceDiagramView; AModel: UMLObject): IUMLSeqObjectView
UMLColClassifierRoleView CreateClassifierRoleView(ADiagramView: DiagramView; AModel: UMLClassifierRole): IUMLColClassifierRoleView
UMLSeqClassifierRoleView CreateSeqClassifierRoleView(ADiagramView: UMLSequenceRoleDiagramView; AModel: UMLClassifierRole): IUMLSeqClassifierRoleView
UMLLinkView CreateLinkView(ADiagramView: DiagramView; AModel: UMLLink; End1: View; End2: View): IUMLLinkView
UMLAssociationRoleView CreateAssociationRoleView(ADiagramView: DiagramView; AModel: UMLAssociationRole; End1: View; End2: View): IUMLAssociationRoleView
UMLColStimulusView CreateStimulusView(ADiagramView: UMLCollaborationDiagramView; AModel: UMLStimulus; LinkView: View): IUMLColStimulusView
UMLSeqStimulusView CreateSeqStimulusView(ADiagramView: UMLSequenceDiagramView; AModel: UMLStimulus; Sender: View; Receiver: View): IUMLSeqStimulusView
UMLColMessageView CreateMessageView(ADiagramView: UMLCollaborationRoleDiagramView; AModel: UMLMessage; AssociationRoleView: View): IUMLColMessageView
UMLSeqMessageView CreateSeqMessageView(ADiagramView: UMLSequenceRoleDiagramView; AModel: UMLMessage; Sender: View; Receiver: View): IUMLSeqMessageView
UMLStateView CreateStateView(ADiagramView: UMLStatechartDiagramView; AModel: UMLCompositeState): IUMLStateView
UMLSubmachineStateView CreateSubmachineStateView(ADiagramView: UMLStatechartDiagramView; AModel: UMLSubmachineState): IUMLSubmachineStateView
UMLPseudostateView CreatePseudostateView(ADiagramView: DiagramView; AModel: UMLPseudostate): IUMLPseudostateView
UMLFinalStateView CreateFinalStateView(ADiagramView: DiagramView; AModel: UMLFinalState): IUMLFinalStateView
UMLActionStateView CreateActionStateView(ADiagramView: UMLActivityDiagramView; AModel: UMLActionState): IUMLActionStateView
UMLSubactivityStateView CreateSubactivityStateView(ADiagramView: UMLActivityDiagramView; AModel: UMLSubactivityState): IUMLSubactivityStateView
UMLSwimlaneView CreateSwimlaneView(ADiagramView: UMLActivityDiagramView; AModel: UMLPartition): IUMLSwimlaneView
UMLTransitionView CreateTransitionView(ADiagramView: DiagramView; AModel: UMLTransition; Source: View; Target: View): IUMLTransitionView

다음 예제는 클래스 다이어그램 뷰에 두 개의 IUMLClassView 타입 요소를 생성하고, 이 두 요소를 연결하는 IUMLDependencyViewIUMLAssociationView를 생성하는 것을 보이고 있다. 뷰 요소를 생성하기 위해서는 해당 뷰 요소에 대한 모델 요소가 존재해야 하므로 먼저 각 모델 요소를 먼저 생성시키고 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var factory = app.UMLFactory;

// Get reference to existing model elements.
var rootElem = app.FindByPathname("::Logical View");
if (rootElem != null){
  
    app.BeginUpdate();
    try{
        // Create model elements.
        var class1 = factory.CreateClass(rootElem);
        var class2 = factory.CreateClass(rootElem);
        var dependency = factory.CreateDependency(rootElem, class1, class2);
        var association = factory.CreateAssociation(rootElem, class1, class2);
        var diagram = factory.CreateClassDiagram(rootElem);
        var diagramView = diagram.DiagramView;

        // Create view elements.
        var classView1 = factory.CreateClassView(diagramView, class1);
        var classView2 = factory.CreateClassView(diagramView, class2);
        var dependencyView = factory.CreateDependencyView(diagramView, dependency, 
                             classView1, classView2);
        var associationView = factory.CreateAssociationView(diagramView, association,
                              classView1, classView2);

        // Adjust view element attributes.
        classView1.Left = 100;
        classView1.Top = 100;
        classView2.Left = 300;
        classView2.Top = 100;
        app.OpenDiagram(diagram);
    }
    finally{
        app.EndUpdate();
    }
}

UML 뷰 요소 삭제하기

UML 뷰 요소를 삭제할 때는 IStarUMLApplication 인터페이스의 DeleteView 메소드를 사용하면 된다. 모델 요소를 삭제했을 때는 해당 모델 요소와 연관된 모든 뷰 요소들도 자동으로 삭제되지만, 뷰 요소를 삭제하는 경우 연관된 모델 요소는 삭제되지 않는다는 점에 주의할 필요가 있다.

다음 예제는 위의 예제에서 생성했던 뷰 요소들을 삭제하는 것을 보여주고 있다.

...
app.DeleteView(dependencyView);
app.DeleteView(associationView);

애플리케이션 자동화 개체 다루기

애플리케이션 개체 다루기

StarUMLApplication Object

StarUML의 외부 API를 사용하기 위해서 가장 먼저 얻어와야 하는 것이 바로 StarUMLApplication 개체의 참조이다. 모든 다른 개체들은 이것을 통해서 접근될 수가 있다. IStarUMLApplication 인터페이스에는 StarUML애플리케이션 자체에 대한 추상화인데 다음과 같은 메소들을 직접 포함하고 있다.

  • 사용자 액션 관련 (Undo, Redo, ClearHistory, BeginUpdate, EndUpdate, BeginGroupAction, EndGroupAction, ...)
  • 요소 편집 관련 (Copy, Cut, Paste, ...)
  • 모델, 뷰 및 다이어그램 삭제 관련 (DeleteModel, DeleteView, ...)
  • 옵션 항목의 값 읽기 (GetOptionValue)
  • 로그, 메시지 및 웹 브라우징 관련 (Log, AddMessageItem, NavigateWeb, ...)
  • 열린 다이어그램 관리 (OpenDiagram, CloseDiagram, ...)
  • 기타 (FindByPathname, SelectInModelExplorer, ...)

열린 다이어그램 관리하기

StarUML의 다이어그램 영역에서는 열려져 있는 다이어그램(Opened Diagram)들이 다음 그림과 같이 탭(tab)으로 관리된다. 그 중에 현재 활성화 되어 있는 다이어그램을 Active Diagram이라고 한다.

특정 다이어그램을 열기 위해서는 다음 예제와 같이 수행한다. 열려져 있지 않은 다이어그램이라면 다이어그램이 열리면서 자동으로 활성 다이어그램(Active Diagram)이 된다. 만약 이미 열려져 있는 다이어그램이라면 활성 다이어그램으로 설정된다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var dgm = ...  // Assign a diagram to open.
app.OpenDiagram(dgm);

열려져 있는 다이어그램들에 대한 참조들을 가져오고 싶다면 GetOpenedDiagramCountGetOpenedDiagramAt 메소드를 사용하여야 한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
...
for (i=0; i<app.GetOpenedDiagramCount(); i++) {
    var dgm = app.GetOpenedDiagramAt(i);
    ...
}

열려져 있는 다이어그램을 닫을 수도 있다. 이 때에는 CloseDiagram 메소드를 사용하면 되는데, 모든 다이어그램을 닫아야 하거나(CloseAllDiagram), 활성 다이어그램만 닫고 싶은 경우(CloseActiveDiagram)에는 그에 맞는 메소드를 사용하여야 한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var dgm = ...  // Assign a diagram to close.
app.CloseDiagram(dgm);

로그 남기기

StarUML정보 영역의 [출력] 탭에는 애플리케이션의 수행 로그를 기록하여 사용자에게 보여준다. 이 부분에 로그를 남길 수 있는 인터페이스를 제공한다.

[출력] 부분에 로그를 남기기 위해서는 Log 메소드를 다음 예제와 같이 사용하면 된다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
app.Log("This is a test log...");

메시지 항목 다루기

StarUML에서 특정 메시지를 사용자에게 알려주고 싶은 경우에는 메시지 항목을 사용한다. 메시지 항목은 요소 검색에서 발견되거나 모델 검증을 통과하지 못한 내용과 요소 등을 알려주는데 사용된다. 메시지 항목은 다음의 표와 같이 총 3 종류가 있는데, 일반 항목, 요소 검색 결과 항목, 그리고 모델 검증 결과 항목이다.

리터럴 설명
0 mkGeneral 일반적인 메시지 항목.
1 mkFindResult 요소 검색 결과를 위한 메시지 항목.
2 mkVerificationResult 모델 검증 결과를 위한 메시지 항목.

메시지 항목을 하나 추가할 때에는 메시지 항목의 종류, 메시지 내용 그리고 연관된 요소의 참조를 인자로 넘겨주어야 한다. 다음은 3가지 종류의 메시지를 서로 다른 메시지 내용으로 프로젝트 요소를 참조하도록 추가하는 예제이다. 그 결과는 다음의 그림과 같다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
app.AddMessageItem(0, "This is general message...", app.GetProject());
app.AddMessageItem(1, "This is find result message...", app.GetProject());
app.AddMessageItem(2, "This is verification result message...", app.GetProject());

메시지를 더블 클릭(double click)하게 되면 연관된 요소가 자동으로 모델 탐색기에 선택되고 다이어그램에 표현되었다면 해당 다이어그램이 활성화된다.

경로명으로 요소 찾기

경로명(pathname)으로 특정 요소를 찾을 수 있다. 예를 들어 Package1 아래 Package2 아래에 있는 Class1 요소의 경로명은 "::Package1::Package2::Class1"이다. 경로명은 이름(Name)을 "::" 구분자(delimiter)로 연결한 것인데 최상위 프로젝트에서 부터 찾기 시작하고 최상위 프로젝트의 이름은 항상 빈 문자열(null string)이므로 항상 "::"으로 시작하게 된다. 그러나, 항상 처음에 붙는 "::"는 생략해도 무방하다. 즉, "Package1::Package2::Class2"로 써도 동일한 경로명이 된다. 다음은 경로명으로 모델 요소의 참조를 얻어오는 예제이다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var elem = app.FindByPathname("::Logical View::Class1");
...

애플리케이션 업데이트 조정하기

사용자가 특정 작성을 수행하거나 API를 통해 특정 명령을 수행하게 되면 그 즉시 StarUML은 변경 내용을 업데이트하여 사용자에게 보여주게 된다. 그러나, API를 통해 복잡한 작업을 수행하기 위해서는 명령을 여러 번 한꺼번에 수행해야 하고 이런 경우 각각의 작업이 즉시 즉시 반영되어 보기에 좋지 않을 뿐 아니라 속도도 매우 저하 된다. 이런 경우에는 변경 내용의 업데이트를 잠시 중단하고 복잡한 작업들을 처리한 다음에 변경 내용을 한꺼번에 반영하는 것이 자연스럽다. StarUMLApplication 개체는 이러한 기능을 제공하기 위해 BeginUpdateEndUpdate 메소드를 제공한다.

복잡하고 방대한 처리 작업을 수행하기 전에 BeginUpdate 메소드를 호출한 다음 수행히 끝난 직후에 EndUpdate 메소드를 호출하면 이 때 모든 변경된 내용들이 반영되게 된다. BeginUpdate를 호출한 이후 작업을 처리하다 오류 혹은 문제가 발생하게 되어 EndUpdate가 호출되지 않는 다면 그 후 어떠한 변경 작업도 반영되지 않으므로 주의해야 한다. 이러한 것을 방지하기 위해서 예외 처리 기법(특히 try ... finally)을 다음 예제와 유사하게 잘 활용하기 바란다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
...
app.BeginUpdate();
try {
  ... // Place tasks to process here.
}
finally {
  app.EndUpdate();  // The finally block will be executed even if an exception occurs in the try block.
}
...

변경의 마지막임을 알리고 변경 내용을 반영시키는 메소드는 EndUpdate 외에 EndUpdate2가 하나 더 존재한다. 이 두 가지 중 어떠한 것을 사용해도 무방한데, EndUpdate2는 더 세부적인 조절이 가능한 메소드이다. 이 메소드는 다음 두 가지의 인자를 통해 더 세부적인 조절을 가능하게 한다.

인자 타입 설명
CompletelyRebuild Boolean 모델 탐색기에 나타나는 모든 트리 구조를 처음부터 새로 생성한다. 처리되는 내용이 매우 방대한 모델 요소의 생성이나 변경이 가해진다면 이 인자 값을 'True'로 하는 것이 훨씬 빠른 변경의 반영이 될 수도 있다. EndUpdate() 메소드에서는 이 값이 'False' 인 것과 효과가 동일하다.
UseUpdateLock Boolean 모델 탐색기에 반영되는 트리 항목들의 삽입/삭제/변경 등을 수행할 때 역시 한꺼번에 반영하도록 한다. 즉, GUI 상에서 트리 항목의 변경이 시각적으로 보이지 않고 한번에 처리가 된다. 매우 방대한 모델이 구축되어 있는 상황에서 이 값을 'True'로 사용하게 되면 비록 적은 수의 모델 요소가 반영되더라도 비교적 오랜 시간이 소요될 수 있다. 이 값을 'True'로 한 경우 수행에 걸리는 시간은 변경된 모델 요소의 개수보다는 전체 모델 요소 개수에 비례한다. EndUpdate() 메소드에서는 이 값이 'True' 인 것과 효과가 동일하다.

그룹 액션 사용하기

사용자가 수행한 액션은 되돌리기(Undo)와 다시 실행(Redo)이 가능하다. API를 통해 실행한 명령도 동일한데, 만약 명령을 2번 실행했다면 실행 전으로 돌아가기 위해서는 Undo를 두 번 수행해야 될 것이다. 그러나, 여러 가지 상황에서 여러 명령들의 조합이 하나의 액션으로 처리되기를 바라는 경우가 많다. 예를 들면, 특정 속성(Attribute)에 대해 자동으로 Get 함수와 Set 함수를 추가하는 코드를 작성하는 경우에는 사용자가 코드를 실행한 이후에 Undo를 수행하면 Get 함수와 Set 함수가 추가되지 전으로 돌아가야 한다. 그러나 Get/Set 함수의 추가를 위해서는 여러 개의 명령을 조합해서 실행해야만 한다. 이런 경우에 여러 개의 명령들을 하나의 그룹으로 다루어 마치 하나의 액션인 것처럼 처리하도록 할 수 있다.

StarUMLApplication 개체는 BeginGroupActionEndGroupAction 메소드를 사용하여 여러 개의 명령들이 하나의 액션처럼 수행될 수 있도록 허용한다. BeginGroupAction 메소드를 호출하면 새로운 가상의 그룹 액션(Group Action)이 생성된다. 그리고 그 이후에 처리되는 작업들은 해당 그룹 액션에 포함되고 EndGroupAction 메소드를 호출하면 액션의 그룹화를 마감하게 된다. BeginGroupAction이 실행된 이후에는 그룹에 포함될 처리 작업에서 오류가 발생하더라도 반드시 EndGroupAction이 호출되어야 하므로 예외 처리(특히 try ... finally)를 확실하게 다루어 주어야 한다. 이렇게 처리된 그룹 액션은 한번의 Undo와 Redo를 통해서도 마치 하나의 액션처럼 동작하게 될 것이다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
...
app.BeginGroupAction();
try {
  ...
}
finally {
  app.EndGroupAction();
}
...

BeginGroupAction 메소드를 호출하면 동시에 BeginUpdate를 호출한 것과 같은 상태가 된다. 마찬가지로 EndGroupAction 메소드를 호출하면 EndUpdate를 호출한 것과 같은 상태가 된다. 즉, 그룹이 완전히 결정되기 전까지는 변경 내용이 반영되지 않는다. 따라서, BeginGroupActionEndGroupAction 사이에는 BeginUpdateEndUpdate 메소드를 사용해서는 안 된다.

요소 선택 다루기

StarUML에서는 사용자가 선택한 모델 혹은 뷰 요소에 대한 정보를 가져오거나 강제로 특정 요소를 선택하도록 하는 방법들을 제공한다. 이러한 것에 관련된 기능들은 ISelectionManager 인터페이스에 모두 정의되어 있다.

선택된 요소 얻어오기

현재 선택되어 있는 모델 혹은 뷰 요소들에 대한 목록을 가져오기 위해서는 먼저 SelectionManager 개체에 대한 참조를 얻어와야 한다. 그런 다음 아래 예제와 같이 선택된 모델 요소들이나 뷰 요소들에 대한 참조를 가져올 수 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var selmgr = app.SelectionManager;

// List selected model elements.
for (i=0; i<selmgr.GetSelectedModelCount(); i++) {
    var m = selmgr.GetSelectedModelAt(i);
    ...
}

// List selected view elements.
for (i=0; i<selmgr.GetSelectedViewCount(); i++) {
    var v = selmgr.GetSelectedViewAt(i);
    ...
}

현재 활성 다이어그램 얻어오기

현재 활성 다이어그램(StarUML에서 화면에 보여지고 있는 다이어그램)의 참조를 가져올 수 있다. 다이어그램은 항상 Diagram 개체와 DiagramView 개체의 두 가지로 나뉘어져 관리되는데 현재 활성 다이어그램의 Diagram 개체 및 DiagramView 개체 두 가지 모두를 바로 얻어올 수 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var selmgr = app.SelectionManager;
var dgm = selmgr.ActiveDiagram  // Diagram object of the currently active diagram
var dgmview = selmgr.ActiveDiagram  // DiagramView object of the currently active diagram

모델 요소 선택하기

특정 모델 요소(e.g. Class, Interface, Component, ...)를 선택하려면 SelectModel 메소드를 사용한다. 이 메소드를 호출하면 기존에 선택되어 있는 모든 요소들의 선택을 해제하고 해당 모델 요소 하나만을 선택하게 된다. 만약, 기존의 선택 요소들을 유지하면서 추가적으로 모델 요소를 선택하고자 한다면 SelectAdditionalModel 메소드를 사용해야 한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var selmgr = app.SelectionManager;
var m = ...  // Assign reference to model element to select.
...
selmgr.SelectModel(m);  // Select only the model element 'm'.
...
selmgr.SelectAdditionalModel(m); // Add model element 'm' to selection.
...

모델 요소의 선택을 해제하고 싶을 때에는 다음 예와 같이 DeselectModel 메소드를 사용한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var selmgr = app.SelectionManager;
var m = ...  // Assign reference to model element to deselect.
...
selmgr.DeselectModel(m);  // Deselect model element 'm'.
...
selmgr.DelselectAllModels(); // Deselect all model elements.
...

뷰 요소 선택하기

다이어그램에 그려져 있는 뷰 요소들을 선택하려면 SelectView 메소드를 사용한다. 이 메소드를 호출하면 기존에 선택되어 있는 모든 뷰 요소들의 선택이 해제되고 해당 뷰 요소 하나만을 선택하게 된다. 만약, 기존의 뷰 요소들의 선택을 유지하면서 추가적인 뷰 요소를 선택하고 싶다면 SelectAdditionalView 메소드를 사용해야 한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var selmgr = app.SelectionManager;
var v = ...  // Assign reference to model element to select.
...
selmgr.SelectView(v);  // Select only the model element 'm'.
...
selmgr.SelectAdditionalView(v); // Add model element 'm' to selection.
...

뷰 요소의 선택을 해제하고 싶을 때에는 다음 예와 같이 DeselectView 메소드를 사용한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var selmgr = app.SelectionManager;
var v = ...  // Assign reference to view element to add.
...
selmgr.DeselectView(v);  // Select only the view element 'v'.
...
selmgr.DelselectAllViews(); // Add view element 'v' to the selection.
...

다이어그램의 영역 선택하기

Selecting Diagram Areas

현재 활성 다이어그램의 특정 영역의 좌표를 입력하여 영역에 포함되는 뷰 요소들을 선택할 수 있는 방법을 제공한다. 이것은 SelectArea 메소드를 사용하거나 추가적으로 영역을 선택하고자 하는 경우에는 SelectAdditionalArea 메소드를 사용하면 된다. 다음 예제는 현재 활성 다이어그램에서 영역 (100, 100, 500, 300)에 포함되는 모든 뷰 요소들을 선택한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var selmgr = app.SelectionManager;
selmgr.SelectArea(100, 100, 500, 300);

요소 선택 다이얼로그 다루기

StarUML에서는 특정 요소를 선택하도록 도와주는 다이얼로그에 2가지 종류를 제공하고 있다. 트리 뷰(Tree View) 형태의 것(ElementSelector)과 리스트 뷰(List View) 형태의 것(ElementListSelector)이 있는데 일반적으로 모델 탐색기와 동일한 형태로 트리 구조에서 요소를 선택하도록 하는 ElementSelector가 주로 사용되고 동일한 종류의 요소들을 열거하여 선택할 수 있도록 하는 것에는 ElementListSelector가 사용된다.

ElementSelector 개체 다루기

ElementSelector는 다음의 그림과 같이 모델 탐색기와 동일한 형태의 트리 구조를 나타내어 사용자에게 하나의 요소를 선택할 수 있도록 하는 다이얼로그이다. 요소를 선택할 수도 있고 아무것도 지정하지 않도록(Null 값을 지정)할 수도 있다.

ElementSelector 다이얼로그 개체에 대한 참조는 다음과 같이 StarUMLApplication 개체를 통해 얻을 수 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var sel_dlg = app.ElementSelector;

ElementSelector 다이얼로그는 다음과 같은 프로퍼티 및 메소드들을 제공한다.

주요 프로퍼티 설명
AllowNull: Boolean 아무것도 지정하지 않는 것(Null 값을 지정)을 허용할 지를 지정.
주요 메소드 설명
Filter(Filtering: ElementFilteringKind) 어떤 타입의 모델링 요소들을 보여줄 것인가를 지정한다. 다음 값들 중의 하나를 지정할 수 있다.
fkAll (0): 모든 모델링 요소를 보인다.
fkPackages (1): UMLPackage 타입 요소(UMLPackage, UMLModel, UMLSubsystem) 요소만을 보인다.
fkClassifiers (2): UMLClassifier 타입 요소만을 보인다.
ClearSelectableModels 선택 가능한 요소 타입 목록을 초기화 시킨다.
AddSelectableModel(ClassName: String) 선택 가능한 요소 타입 목록에 지정된 타입을 추가한다. 인자 값 예: "UMLClass"
RemoveSelectableModel(ClassName: String) 선택 가능한 요소 타입 목록에서 지정된 타입을 삭제한다. 인자 값 예: "UMLClass"
Execute(Title: String): Boolean 다이얼로그를 실행시킨다. 인자로 다이얼로그의 타이틀 문자열을 지정한다.
GetSelectedModel: IModel 사용자에 의해 선택된 요소에 대한 참조를 반환한다.

다음 예는 ElementSelector 다이얼로그를 실행시키고 사용자에 의해 선택된 요소를 얻는 전 과정을 보여준다.

fkClassifiers = 2;

var app = new ActiveXObject("StarUML.StarUMLApplication");
var sel_dlg = app.ElementSelector;

sel_dlg.AllowNull = false;
sel_dlg.Filter(fkClassifiers)
sel_dlg.ClearSelectableModels();
sel_dlg.AddSelectableModel("UMLModel");
sel_dlg.AddSelectableModel("UMLSubsystem");
sel_dlg.AddSelectableModel("UMLPackage");

if (sel_dlg.Execute("Select a classifier type element.")){
    var elem = sel_dlg.GetSelectedModel;
    ...
}
else{
    // If canceled, ...
}

ElementListSelector 개체 다루기

ElementListSelector는 다음의 그림과 같이 선택 가능한 요소들의 목록을 리스트 뷰(List View) 형태로 나타내어 사용자가 하나의 요소를 선택할 수 있도록 하는 다이얼로그이다.

ElementListSelector 다이얼로그 개체에 대한 참조는 다음과 같이 StarUMLApplication 개체를 통해 얻을 수 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var sel_dlg = app.ElementListSelector;

ElementListSelector 다이얼로그는 다음과 같은 프로퍼티 및 메소드들을 제공한다.

주요 프로퍼티 설명
AllowNull: Boolean 아무것도 지정하지 않는 것(Null 값을 지정)을 허용할 지를 지정.
주요 메소드 설명
ClearListElements 목록을 초기화 시킨다.
AddListElement(AModel: IModel) 인자가 지정하는 모델 요소를 목록에 추가한다.
AddListElementsByCollection(AModel: IModel; CollectionName: String; ShowInherited: Boolean) 인자가 지정하는 모델 요소의 지정된 컬렉션 항목들의 목록을 추가한다. 'ShowInherited' 인자는 지정된 모델 요소의 상속구조를 따라 가면서 상위 요소들에 대해서도 지정된 컬렉션 항목들을 목록에 추가할 것인지를 지정한다.
AddListElementsByClass(MetaClassName: String; IncludeChildInstances: Boolean) 인자가 지정하는 타입의 요소들을 목록에 추가한다. 'IncludeChildInstances' 인자가 'true' 이면 지정하는 타입에서 파생되는 요소들도 목록에 추가된다.
Execute(Title: String): Boolean 다이얼로그를 실행시킨다. 인자로 다이얼로그의 타이틀 문자열을 지정한다.
GetSelectedModel: IModel 사용자에 의해 선택된 요소에 대한 참조를 반환한다.

다음 예는 ElementListSelector 다이얼로그를 실행시키고, 사용자가 지정된 어떤 클래스(Class) 요소의 오퍼레이션(Operation) 컬렉션 중에서 하나를 선택하도록 하고 있다. "ShowInherited" 인자가"'true" 이기 때문에 지정된 클래스 요소의 부모 클래스들이 있다면 이 클래스 요소들의 오퍼레이션 컬렉션들도 선택할 수 있게 된다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var sel_dlg = app.ElementListSelector;

sel_dlg.AllowNull = false;
sel_dlg.ClearListElements();

var class = ... // Get reference to class element.
sel_dlg.AddListElementsByCollection(class, "Operations", true);

if (sel_dlg.Execute("Select an operation element.")){
    var selElem = sel_dlg.GetSelectedModel;
    ...
}
else{
    // If canceled, ...
}

위 예제에서는 AddListElementsByCollection 메소드를 사용하는 것을 보였다. 아래의 예제는 AddListElementsByClass 메소드를 사용하는 것을 보여준다. "IncludeChildInstances" 인자가 "true" 이기 때문에 지정된 타입의 요소들과 지정된 타입에서 파생되는 모든 서브 타입의 요소들이 목록에 추가된다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var sel_dlg = app.ElementListSelector;

sel_dlg.AllowNull = false;
sel_dlg.ClearListElements();

sel_dlg.AddListElementsByClass("UMLClassifier", true);

if (sel_dlg.Execute("Select a classifier type element.")){
    var selElem = sel_dlg.GetSelectedModel;
    ...
}
else{
    // If canceled ...
}

메타-모델 다루기

이 장에서는 StarUML메타-모델 요소들의 개념과 사용법에 대해 설명한다. StarUML메타-모델 요소들은 "Chapter 2. StarUML Architecture"에서 소개했던 바와 같이 Non_Modeling Elements::MetaModeling Elements 패키지에 속하는 요소들이다.

메타-모델 기본 개념

StarUML메타-모델 요소들은 위에서 설명했던 StarUML모델링 요소들에 대한 메타-수준의 접근 방법을 제공한다. 메타-모델은 한마디로 이 모델링 요소들을 정의하기 위한 요소들이라고 할 수 있다. 메타-모델 요소를 사용하면 현재 실행중인 프로젝트 내에서 각 모델링 요소들에 해당하는 요소들의 목록을 얻거나, 모델링 요소 그 자체의 정보에 접근할 수 있다. 메타-모델의 개념은 처음 접하는 사용자들에게 조금 어렵게 생각될 수도 있지만, 매우 명료하게 정의되어있으며 또 유용하게 사용될 수 있으므로 아래의 내용을 잘 읽어보기 바란다.

메타-모델을 사용하는 간단한 예제

메타-모델의 개념을 설명하기 전에 간단한 예제를 통해 StarUML메타-모델 요소들을 사용하는 방법에 대한 이해를 돕고자 한다. 먼저, 외부 API를 통해 현재 실행중인 StarUML애플리케이션의 모든 Class 요소들의 목록을 얻어야 한다고 가정해 보자. 이를 위해서 최상위 프로젝트 요소에서부터 하위 요소들을 모두 검색하는 방법을 사용할 수도 있지만, 메타-모델 요소를 사용하면 더욱 간단하게 표현될 수 있다. 아래의 코드를 보자.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var meta = app.MetaModel;

var metaClass = meta.FindMetaClass("UMLClass");
for (var i = 0; i < metaClass.GetInstanceCount(); i++){
    var AClassElem = metaClass.GetInstanceAt(i);
    ...
}

이 예제는 메타-모델 요소를 사용하여 모든 Class 요소들에 대한 참조를 얻고 있다. Class 요소들에 접근하기 위하여 IMetaModel.FindMetaClass 메소드의 인자로 "UMLClass"라고 모델링 요소의 이름을 주고 있는데, 만약 모든 Attribute 요소들의 목록을 얻어야 한다면 인자를 "UMLAttribute"로 바꾸면 된다. 즉 모든 모델링 요소에 동일하게 적용되는 것이다.

노트: 요소 이름에 대한 규칙은 "Appendix B. UML 모델링 요소 목록"을 참고하라.

두 번째 예제는 모델링 요소 자체의 정보에 접근하는 것을 보여 줄 것이다. 프로그램 구현 코드에서 UML 모델링 요소의 하나인 Class 요소가 어떤 속성들을 가지는지 알려면 어떻게 해야 할까? 이 질문은 사용자가 생성한 임의의 한 Class 요소에 어떤 Attribute들이 정의되어 있는가가 아니라, UML 모델링 요소인 Class 요소 그 자체에 어떤 Attribute들이 정의되어있는가 하는 것이다. 예를 들어 Class 모델링 요소는 "Name", "Visibility", "IsAbstract"  등의 속성(Attribute) 항목들을 가진다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var meta = app.MetaModel;

var metaClass = meta.FindMetaClass("UMLClass");
for (var i = 0; i < metaClass.GetMetaAttributeCount(); i++){
    var metaAttr = metaClass.GetMetaAttributeAt(i);
    var attrName = metaAttr.Name;
    ...
}

이 예제는 Class 모델링 요소가 가지는 모든 속성(Attribute)들의 이름을 얻어 오고 있다. 첫 번째 예제와 마찬가지로 다른 모델링 요소에 대해 실행하려면 IMetaModel.FindMetaClass 메소드의 인자만 적절하게 바꾸면 된다.

UML 메타모델링 아키텍처

이 섹션에서는 UML 메타모델링 아키텍처에 대해서 짧게 소개한다. 이것은 StarUML메타-모델을 이해하는데 도움이 될 것이다.

OMG(Object Management Group)에서는 UML 요소들의 명세를 정의하기 위하여 메타모델링 아키텍처라는 방법을 사용하고 있다. 이 메타모델링 아키텍처는 다음과 같은 계층(Layer)들로 구성된다.

  • Meta-metamodel
  • Metamodel
  • Model
  • User Objects

UML 명세(Specification)에서 기술하고 있는 UML 모델링 요소들의 정의(Definition)는 이 계층들 중에서 메타모델에 해당한다. 즉 UML을 사용할 때 흔히 접하게 되는 Package, Class, Use Case, Actor 등등이 메타모델 요소들인 것이다. 그리고 우리가 소프트웨어 모델링을 할 때 생성하게 되는 UML 요소들, 예를 들어 이름이 "Class1" 또는 "Class2"인 Class 요소들은 메타모델의 하나의 인스턴스(Instance), 즉 모델에 해당한다. 좀 더 정확하게 말하면 이 "Class1", "Class2"는 Class (StarUML에서는 UMLClass)라는 메타모델 요소의 인스턴스들이다.

그리고 Package, Class, Use Case, Actor 등과 같은 UML 메타모델을 정의하기 위한 기반 계층이 메타-메타모델인데, StarUML메타-모델은 바로 이 메타-메타모델 계층에 해당하는 것이다. 즉, 모든 모델링 요소들이 아래에서 설명할 MetaClass 타입의 인스턴스에 해당한다고 볼 수 있는 것이다. 다만 StarUML메타-모델은 모델링 요소들을 정의하기 위한 목적보다는 모델링 요소들을 메타-수준으로 일관성 있게 접근할 수 있도록 하는 역할을 하고 있다.

메타-모델 구조

Meta-Model Organization

다음은 StarUML메타-모델 요소들의 구성과 구조를 표현한 클래스 다이어그램이다. 화면 구성을 위하여 일부 요소들을 생략하였으므로, 완전한 다이어그램은 Plastic Application Model::Application Model::Non_Modeling Elements::Metamodeling Elements 패키지를 참고하기 바란다.

StarUML메타-모델은 이 그림과 같이 비교적 적은 수의 메타-모델 요소들로 구성되어 있다. 메타-모델 요소들의 최상위 요소는 IMetaElementNameGUID 속성을 가진다. 모델링 요소들은 메타-모델 요소(구체적으로 IMetaClass)의 인스턴스들이므로, IMetaElementName 속성의 값은 이전 섹션들에서 설명했던 모델링 요소들의 이름 중의 하나가 될 것이다. 예를 들면 "Model", "View", "UMLClass", "UMLAttribute" 등이 있다.

최상위 IMetaElement에서 IMetaClassifier, IMetaSlot 등의 메타-모델 요소들이 나오는데, IMetaClassifier는 모델링 요소들 그 자체를 정의하기 위한 메타 요소이고 IMetaSlot은 모델링 요소들의 속성과 참조속성들을 정의하기 위한 것이다. 그리고 IMetaClassifier, IMetaSlot에서 IMetaClass, IMetaAttribute, IMetaReference, IMetaCollection, IMetaModel 등의 구체(Concrete) 요소들이 파생되는데, StarUML메타-모델 구조에서 가장 중요한 역할을 하는 것이 이 요소들이다.

메타-모델 요소 다루기

IMetaModel

IMetaModel 요소는 메타-모델 요소들을 컬렉션으로 유지하며 관리하는 요소로, 다른 메타-모델 요소들에 대한 접근성을 제공한다. IMetaModel은 한 StarUML애플리케이션에서 하나만 존재하며, IStarUMLApplication 인터페이스를 통해 개체의 참조를 얻을 수 있다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var meta = app.MetaModel;

위에서 IMetaModel 요소가 다른 메타-모델 요소들에 대한 접근성을 제공한다고 했는데, 아래의 예제는 IMetaModel을 통해 IMetaClass 메타-요소들에 대한 참조를 얻는 것을 보여주고 있다. 참고로, 이 장의 IMetaClass 요소 항목에서 설명하겠지만 IMetaClass 타입의 참조는 모델링 요소들의 수만큼 존재한다 (아래의 예제를 통해 확인해보기 바란다).

var app = new ActiveXObject("StarUML.StarUMLApplication");
var meta = app.MetaModel;

for (var i = 0; i < meta.GetMetaClassCount(); i++){
    var metaClass = meta.GetMetaClassAt(i);
    ...
}

앞에서 보인 클래스 다이어그램에서는 생략되었지만, IMetaClass와 유사한 관계로 IMetaEnumeration, IMetaDataType, IMetaPrimitiveType 메타-모델 요소들이 있는데 IMetaModel 인터페이스를 통해 이 요소들에 대한 참조도 얻을 수 있다. 참고로 IMetaEnumeration 요소는 모델링 요소와 관련된 열거체(Enumeration) 타입을 정의하기 위한 메타-요소이다. IMetaEnumeration 요소의 인스턴스에는, 예를 들어 UMLVisibilityKind, UMLAggregationKind 등이 해당된다. IMetaDataType은 열거체(Enumeration), 기본타입(Primitive Type)이 아닌 데이터타입을 정의하기 위한 메타-요소이다. 이것의 인스턴스로는 Points 타입 하나가 존재한다. 그리고 IMetaPrimitiveType 요소는 기본타입(Primitive Type)들을 정의하기 위한 메타-요소로, 기본타입에는 Integer, Real, Boolean, String 네 가지가 있다.

IMetaModel 인터페이스는 메타-요소들에 대한 찾기 메소드를 제공한다. 아래의 예제는 이 장의 첫 번째 예제의 일부분인데 IMetaModel.FindMetaClass 메소드를 사용하여 UMLClass 모델링 요소에 대한 IMetaClass 요소의 참조를 얻고 있다. (IMetaClass 타입의 참조는 모델링 요소의 수만큼 존재한다)

var app = new ActiveXObject("StarUML.StarUMLApplication");
var meta = app.MetaModel;
var metaClass = meta.FindMetaClass("UMLClass");
...

IMetaModel 인터페이스는 IMetaClass와 마찬가지로 다른 메타-요소들에 대한 찾기 메소드들도 제공하는데, FindMetaClassifier, FindMetaEnumeration, FindMetaDataType, FindPrimitiveType 등이 있다.

IMetaModel 인터페이스는 모델링 요소의 GUID로 해당 모델링 요소에 대한 참조를 얻을 수 있는 FindInstanceByGuid 메소드를 제공한다. FindInstanceByGuid 메소드는 IElement 타입 참조를 반환하는데, 위 예제에 이어 아래와 같이 사용할 수 있다.

...
var guid = ... // 모델링 요소의 GUID 값을 얻음.
var elem = meta.FindInstanceByGuid(guid);
...

IMetaClass

IMetaClass 요소는 각 모델링 요소들에 대한 정의를 제공하는 메타-요소이며, 또한 각 모델링 요소들의 인스턴스를 컬렉션으로 유지하고 관리한다. StarUML애플리케이션에서 IMetaClass는 모델링 요소의 수 만큼 존재한다. 아래의 코드는 IMetaModel.FindMetaClass 메소드를 사용하여 모델링 요소 별로 IMetaClass 타입 참조를 얻는 것을 보여준다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var meta = app.MetaModel;

var metaClassOfPackage = meta.FindMetaClass("UMLPackage");
var metaClassOfClass = meta.FindMetaClass("UMLClass");
var metaClassOfAttribute = meta.FindMetaClass("UMLAttribute");
...

IMetaClass 타입 요소의 참조를 얻는 다른 방법으로 모델링 요소들의 최상위 타입인 IElement 인터페이스의 GetMetaClass 메소드를 사용할 수 있다.

elem = ... // Get reference to modeling elements.
var metaClass = elem.GetMetaClass();

IMetaClass 인터페이스는 각 모델링 요소의 상속구조 상의 상위 요소(Superclass)와 하위요소(Subclass)들을 얻을 수 있는 메소드들을 제공한다. 참고로 최상위 모델링 요소인 IElement 타입 요소의 Superclass는 null이다.

var metaClass = ... // Get IMetaClass type reference.
var superCls = metaClass.Superclass;
...
for (var i = 0; i < metaClass.GetSubclassCount(); i++){
    var subCls = metaClass.GetSubclassAt(i);
    ...
}

IMetaClass 인터페이스는 IMetaModel.FindInstanceByGuid와 같이 모델링 요소의 GUID로 해당 모델링 요소에 대한 참조를 얻을 수 있는 FindInstanceByGuid 메소드를 제공한다. IMetaClass의 메소드는 특정 타입의 모델링 요소들에 대해서만 검색하기 때문에 IMetaModel 보다 효율적이다. 그리고 해당 타입에서 일치되는 값을 찾지 못한 경우, 파생된 모델링 요소들까지 검색하는 FindInstanceByGuidRecurse도 제공한다.

이 장의 첫 번째 예제에서는 IMetaClass 인터페이스의 GetInstanceCount, GetInstanceAt 메소드를 사용하여 특정 모델링 요소의 인스턴스들을 찾는 것을 보였다. 모델링 요소의 인스턴스란 사용자가 생성한 요소들을 말한다.

var metaClass = ... // Get IMetaClass type reference.
for (var i = 0; i < metaClass.GetInstanceCount(); i++){
    var AElem = metaClass.GetInstanceAt(i);
    ...
}

IMetaAttribute

IMetaAttribute 인터페이스를 사용하여 각 모델링 요소의 기본속성(Attribute)들에 대한 명세를 읽을 수 있다. IMetaAttribute는 다음과 같이 IMetaClass 인터페이스를 통해 참조를 얻을 수 있다. 참고로 IMetaClass 인터페이스는 특정 이름의 기본속성(Attribute)이 존재하는지 검사하는 ExistsAttribute 메소드와, 특정 이름의 IMetaAttribute 타입 요소를 반환하는 GetAttributeByName 메소드도 제공한다.

var app = new ActiveXObject("StarUML.StarUMLApplication");
var metaClass = app.MetaModel.FindMetaClass("UMLClass");

for (var i = 0; i < metaClass.GetMetaAttributeCount(); i++){
    var metaAttr = metaClass.GetMetaAttributeAt(i);
    ...
}

다음 예제는 모델링 요소의 기본 속성들의 명세를 읽는 것을 보여준다.

var metaAttr = ... // Get IMetaAttribute type reference.
var metaType = metaAttr.TypeRef;

var attrName = metaAttr.Name;
var attrType = metaType.Name;
...

그리고 IMetaAttribute의 상위 인터페이스인 IMetaSlotIsReadOnly, IsDerived 프로퍼티를 제공하는데, IsReadOnly는 해당 기본속성(Attribute)이 읽기전용인가를 나타내고 IsDerived는 해당 속성이 실제로 존재하는 것이 아니라 다른 속성들을 통해 유추되는 것인가를 나타내는 것이다.

IMetaReference 와 IMetaCollection

IMetaReference, IMetaCollection 요소는 각 모델링 요소가 다른 모델링 요소를 참조하는 참조(Reference) 속성들을 정의한다. 이런 참조는 모두 연관관계(Association)를 나타내는 것이다. IMetaReference가 다중성(Multiplicity)이 '1' 이하인 참조를 나타내는데 반해 IMetaCollection은 컬렉션 형태로 구현되어야 하는 참조를 나타낸다. 이런 차이를 제외하면 IMetaReferenceIMetaCollection는 매우 유사하다 (IMetaReference, IMetaCollection은 모두 IMetaAssociationEnd 인터페이스에서 파생된다).

먼저 IMetaReferenceIMetaCollection 개체의 참조를 얻는 예제를 보자. 이것은 IMetaAttribute와 마찬가지로 IMetaClass 인터페이스를 사용한다.

var metaClass = ... // Get IMetaClass type reference for a specific modeling element.

// Get references to IMetaReference type objects.
for (var i = 0; i < metaClass.GetMetaReferenceCount(); i++){
    var metaAttr = metaClass.GetMetaReferenceAt(i);
    ...
}

// Get references to IMetaCollection type objects.
for (var i = 0; i < metaClass.GetMetaCollectionCount(); i++){
    var metaAttr = metaClass.GetMetaCollectionAt(i);
    ...
}

IMetaReference, IMetaCollection의 공통 상위 타입인 IMetaAssociationEnd 인터페이스는 해당 모델링 요소가 가지는 참조속성, 즉 연관관계(Association)의 명세를 정의하는 프로퍼티와 메소드들을 제공한다.

먼저 Kind 프로퍼티는 단순하게 해당 연관관계가 단일 참조형인지 컬렉션 형태의 참조형인지를 구분한다. IMetaReference 타입의 경우에는 단일 참조형이고 IMetaCollection 타입은 컬렉션 형태의 참조형이다. 그리고 Aggregate 프로퍼티는 해당 연관관계의 AggregationKind 속성을 알려준다. 이 값은 열거체 타입으로 다음 값들 중의 하나이다.

  • makNone (0): 없음
  • makAggregate (1): 집합(Aggregation) 연관
  • makComposite (2): 합성(Composition) 연관

OtherSide 프로퍼티는 연관관계의 반대쪽 연관-끝(AssociationEnd)의 이름을 알려주며, OtherSideKind 프로퍼티는 반대쪽 연관-끝(AssociationEnd)이 단일 참조형인지 컬렉션 형태의 참조형인지를 알려준다.

그리고 GetOtherSideEnd 메소드는 연관관계의 반대쪽 연관-끝(AssociationEnd)에 해당하는 IMetaAssociationEnd 타입 참조를 반환한다. 다음 예제는 IMetaReference, IMetaCollection의 공통 상위 타입인 IMetaAssociationEnd 인터페이스가 제공하는 프로퍼티와 메소드를 사용하는 것을 보여준다.

var metaSlot = ... // Get IMetaReference or IMetaCollection type reference.
var kind = metaSlot.Kind;
var aggregate = metaSlot.Aggregate;
var otherSide = metaSlot.OtherSide;
var otherSideKind = metaSlot.OtherSideKind;
var otherSideEnd = metaSlot.GetOtherSideEnd();
...

IMetaReference, IMetaCollection 타입 개체가 어떤 IMetaClass 요소의 것인지는 IMetaSlot 인터페이스의 TypeRef 참조속성을 통해 알 수 있다. 다음 예제는 임의의 모델링 요소에서 특정 연관관계(Association)의 반대편 요소가 무엇인지를 읽는 방법을 보여주고 있다.

var metaSlot = ... // Get IMetaReference or IMetaCollection type reference.
var otherSideEnd = metaSlot.GetOtherSideEnd();
var otherSideMetaClass = otherSideEnd.TypeRef;

반응형

'프로그래밍 > 설계공부' 카테고리의 다른 글

제 6 장. 프레임워크 사용하기  (0) 2009.07.23
제 5 장. 접근법 사용하기  (0) 2009.07.23
제 3 장. HelloWord 예제  (0) 2009.07.23
제 2 장. StarUML 아키텍쳐  (0) 2009.07.23
1장 StarUML 소개  (0) 2009.07.23

댓글