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

제 10 장. 노테이션 확장하기

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

제 10 장. 노테이션 확장하기

이 장에서는 Notation Extension이 무엇이며 사용되는 기본 개념들은 어떤 것이 있는지 설명하고, Notation Extension을 위해서 사용되는 언어의 기본 구문에 대한 명세를 간략하게 소개한다. 그리고 예제를 통해서 새로운 종류의 다이어그램을 Notation Extension을 이용하여 어떻게 추가할 수 있는지 설명한다.

왜 노테이션 확장이 필요한가?

Notation Extension은 UML 모델에 대한 표기법을 사용자가 직접 정의하여 사용할 수 있도록 표기법을 위한 확장 개념이다. StarUML은 이러한 Notation Extension을 실행할 수 있는 플랫폼을 제공한다. 그러면 UML이 있는데 이러한 Notation Extension 개념이 왜 필요할까?

  • 프로파일에서 스테레오타입별로 TextView, IconicView, DecorationView를 제공하지만 이것만으로는 원하는 형태의 표기법을 구사할 수 없다.
  • 데이터 모델링을 위해서 ER 다이어그램이 대부분 사용되는데, UML로 매핑하면 모델의 매핑은 자연스러울 수 있지만, 표기법의 매핑은 부자연스럽고 익숙하지 않다.
  • UML 메타모델은 모든 종류의 모델링 의미를 포함하기 위해서 충분한 크기의 데이터 컨테이너이다. 따라서 UML 툴에서 표기법을 확장할 수 있다면 모든 종류의 모델링툴을 위한 메타-모델링툴로서의 역할 수행이 가능하다.

따라서 표기는 기존 모델링 영역의 표기는 그대로 사용하면서도, 데이터로서의 모델 정보는 UML 모델로 표현하도록 함으로써, 다른 모델링 영역과 UML 모델링 영역간의 상호 보완, 효율성 및 호환성을 사용자에게 제공할 수 있다.

노테이션 확장 언어(Notation Extension Language)

구문의 기본 형태

Notation Extension Language의 구문은 Scheme 언어(LISP의 Dialect)와 유사한 형태의 구문을 가진다. 구문의 기본은 식이며, 전체가 하나의 식으로 구성된다. 식은 값이거나, 연산식으로 구성된다. 값은 실수, 정수, 스트링, 논리값, 널값, 식별자를 말하여, 연산식은 "("로 시작해서 ")"로 끝난다. 괄호 사이에는 연산자와 인자를 표현하는 또 다른 식이 순서대로 나타나는 형태를 취한다. 연산자나 식별자는 대소문자를 구분하지 않는다. 그리고 C++과 자바의 커맨트 방식을 따른다. 한 라인에 대한 커맨드는 "//"를 이용하고 여러 라인에 걸친 커맨트는 "/*  */"를 사용한다.

expr ::= flt | int | str | bool | nil | ident | "(" oper (expr)* ")" ;

Notation Extension Language의 시작 연산식은 notation이라는 연산자로 시작된다. 그리고 인자식은 onarrange와 ondraw라는 연산자를 갖는 식으로 구성된다. notation은 스테레오타입 하나에 대응하는 표기법을 정의한다. 따라서 스테레오타입이 적용된 모델 요소가 화면에 보여질 때 notation식이 수행된다. 이때 onarrange 식이 우선 실행되어 화면에 표기법을 그리기 전에 배치에 관련된 식들을 수행한다. ondraw 식들은 화면에 직접 그리는 식을 수행한다.

(notation
    (onarrange ...)
    (ondraw ...)
) 

onarrange와 ondraw 연산식이 인자 식으로 가질수 있는 식은 크게 다음과 같이 6가지 종류이다.

  • sequence
  • if
  • for
  • set
  • arthmetic, logical, comparison operator
  • built-in function

sequence expression

sequence 식은 java의 block처럼 인자로 오는 식들을 순서대로 실행한다. sequence 식은 인자로 개수의 제한없이 여러개의 연산식을 가지는 형태로 구성된다.

(sequence expr1 expr2 ...)

다음 예제는 3개의 연산식을 하나의 sequence 식으로 묶는 것을 보여준다.

(sequence
  (+ 10 20)       // 10 + 20
  (- 20 30 40)    // 20 - 30 - 40
  (/ 10 20)       // 10 / 20
)

if expression

if 식은 조건을 처리하기 위한 구문을 식으로 표현하고 있다. 첫번째 인자식는 조건식이고, 두번째 인자식은 조건식이 참일 때 수행되는 식이고, 세번째 인자식은 조건식이 거짓일 때 수행되는 식이다.  세번째 인자식은 생략 가능하다. 조건식이 거짓이고 세번째 식이 생략된 경우에 if 식내에서 아무런 수행도 하지 않고 식을 빠져 나온다.

(if condition-expr on-true-expr on-false-expr? )

다음 예제는 변수 i의 값이 0에서 30 사이의 값이라면 i의 값을 증가하고 그렇지 않으면 i의 값을 감소하는 예제이다.

(if (or (<= i 0) (>= i 30))    // if (i <= 0 || i >= 30)
    (set count (+ count 1))    //   count++; 
    (set count (- count 1))    // else
)                              //   count--;

for expression

for 식은 특정 변수값을 초기값에서 종료값까지 범위까지 증가하면서 반복적으로 식을 수행한다. 첫번째 인자는 반복에 사용될 변수의 이름이다. 두번째 인자식은 변수의 초기값이고 세번째 인자식은 변수의 종료값이다. 마지막 인자식은 반복을 하면서 수행할 식을 의미한다.

(for identifier init-expr end-expr expr)

다음은 1에서 10까지값을 화면에 출력하는 예제이다.

(for i 1 10                           // for (int i = 1; i <= 10; i++)
    (textout 100 (+ 100 (* i 20))     //    textout(100, 100+(i*20), i);
             i
    )
) 

set expression

set expression은 변수의 값을 할당하는 식이다. 변수의 선언은 필요 없으며 사용하는 순간 선언되며, 한번 선언되면 전역 변수로 사용된다.

(set identifier value-expr)

다음은 c이라는 이름의 변수에 a와 b 스트링 변수의 값을 concatenate하는 예제이다.

(set a 'My name is ')       // a = "My name is ";
(set b 'foo')               // b = "foo";
(set c (concat a b))        // c = a + b;

arthmetic, logical, comparison operator

제공되는 수학 연산자는 +, -, *, / 이며, 논리 연산자는 and, or, not  3가지 연산자가 제공되며, 비교를 위해서 =, !=, <, <=, >, >= 연산자가 제공된다. 다음은 이러한 연산자의 다양한 사용예제이다.

(+ 1 (/ 10 5) (- (* 2 3) 6))     // 1 + (10/5) + (2*3-6)
(and (< i 10) (not (= j 20)))    // (i < 10) && (!(j == 20))

built-in function

Notation Extension Language 내에서 정의된 Built-in 함수는 다음과 같이 분류 된다.

  • 수학 함수
  • 문자열 처리 함수
  • 리스트 처리 함수
  • 모델 접근 함수
  • 그래픽 관련 함수

수학 함수

수학 Built-in 함수의 목록은 다음과 같다.

함수 시그너쳐 설명
(sin angle) angle에 대한 sin 값을 반환한다.
(cos angle) angle에 대한 cos 값을 반환한다.
(tan angle) angle에 대한 tan 값을 반환한다.
(trunc val) val에 대해서 소수점 버림 값을 반환한다.
(round val) val에 대해서 반올림값을 반환한다.

문자열 처리 함수

문자열 처리 Built-in 함수의 목록은 다음과 같다.

함수 시그너쳐 설명
(concat str1 str2...) 인자 스트링들을 붙여서 연결된 하나의 스트링을 반환한다.
(trim str) str 인자 스트링의 앞뒤에 존재하는 공백 문자가 제거된 스트링을 반환한다.
(length str) str 인자 스트링의 길이를 반환한다.
(tokenize str deli) str 인자 스트링으로, deli 인자를 구분자로, 나누어진 스트링의 리스트를 반환한다.

리스트 처리 함수

리스트 처리 Built-in 함수의 목록은 다음과 같다.

함수 시그너쳐 설명
(list val1 val2 ...) 인자들로 구성된 리스트를 반환한다.
(append lst lst) 두 개의 리스트를 합한 리스트를 반환한다.
(append lst item)
(itemat lst index) index 위치에 존재하는 리스트를 반환한다.
(itemcount lst) lst 리스트안에 존재하는 아이템 개수를 반환한다.

모델 접근 함수

모델 접근 Built-in 함수의 목록은 다음과 같다.

함수 시그너쳐 설명
(mofattr elem attr) elem 인자(IElement)의 attr 인자 값을 이름으로 하는 속성의 값을 반환한다.
(mofsetattr elem attr val) elem 인자(IElement)의 attr 인자 값을 이름으로 하는 속성을 val값을 설정한다.
(mofref elem ref) elem 인자(IElement)의 ref 인자 값을 이름으로 하는 reference를 반환한다.
(mofcolat elem col at) elem 인자의 col 이름으로 하는 모델링 요소 참조의 collection에서 at 위치에 있는 객체 참조를 반환한다.
(mofcolcount elem col) elem 인자(IElement)의 col 인자 값을 이름으로 하는 collection에 포함된 요소의 개수를 반환한다
(constraintval elem name) elem 인자(IElement)의 name 인자 값을 이름으로 하는 constraint의 값을 반환한다.
(tagval elem tagset name) elem 인자(IElement)의 tagset 인자 값의 TagDefinitionSet의 name 인자 값을 이름으로 하는 primitive 타입의 태그값을 반환한다.
(tagref elem tagset name) elem 인자(IElement)의 tagset 인자 값의 TagDefinitionSet의 name 인자 값을 이름으로 하는 reference 타입의 태그값을 반환한다.
(tagcolat elem tagset name at) elem 인자(IElement)의 tagset 인자 값의 TagDefinitionSet의 name 인자 값을 이름으로 하는 reference의 collection 타입일 경우의 at 위치의 태그값을 반환한다.
(tagcolcount elem tagset name) elem 인자(IElement)의 tagset 인자 값의 TagDefinitionSet의 name 인자 값을 이름으로 하는 reference의 collection 타입일 경우의 collection에 포함된 요소의 개수를 반환한다.

그래픽 관련 함수

스타일 관련 Built-in 함수의 목록은 다음과 같다.

함수 시그너쳐 설명
(setpencolor color)

Pen의 색깔을 인자 color 값으로 변경한다. 색깔은 다음 값 중 하나를 가질수 있다.

Value Meaning
clNone White
clAqua Aqua
clBlack Black
clBlue Blue
clCream Cream
clDkGray Dark Gray
clFuchsia Fuchsia
clGray Gray
clGreen Green
clLime Lime green
clLtGray Light Gray
clMaroon Maroon
clMedGray Medium Gray
clMoneyGreen Mint green
clNavy Navy blue
clOlive Olive green
clPurple Purple
clRed Red clGrayText
clSilver Silver
clSkyBlue Sky blue
clTeal Teal
clWhite White
clYellow Yellow

(setpenstyle style)

Pen의 style을 변경한다. psSolid, psDash, psDot, psDashDot, psDashDotDot, psClear, psInsideFrame중의 하나의 값이 가능하다.

Value Meaning
psSolid A solid line.
psDash A line made up of a series of dashes.
psDot A line made up of a series of dots.
psDashDot A line made up of alternating dashes and dots.
psDashDotDot A line made up of a series of dash-dot-dot combinations.
psClear No line is drawn (used to omit the line around shapes that draw an outline using the current pen).
psInsideFrame A solid line, but one that may use a dithered color if Width is greater than 1.
(setbrushcolor color) Brush의 색깔을 인자 color 값으로 변경한다.
(setbrushstyle style) Brush의 style을 변경한다. 다음 중 하나의 값이 가능하다.

bsSolid, bsClear, bsHorizontal, bsVertical, bsFDiagonal, bsBDiagonal, bsCross, bsDiagCross

(setfontface font) 인자의 폰트 이름으로 폰트를 변경한다.
(setfontcolor color) 폰트의 색깔을 인자 color 값으로 변경한다.
(setfontsize size) 폰트의 크기를 인자 값으로 변경한다.
(setfontstyle style)

폰트의 스타일을 인자의 값으로 변경한다. fsBold, fsItalic, fsUnderline, fsStrikeOut 값의 조합으로 구성되며, 두개 이상의 값을 지정할 경우에는 | 문자를 사용해서 값을 조합한다.

Value Meaning
fsBold The font is boldfaced.
fsItalic he font is italicized.
fsUnderline The font is underlined.
fsStrikeOut The font is displayed with a horizontal line through it.
(setdefaultstyle) 사용자의 조작에 의해서 변경된 Pen, Brush, Font 정보를 원래 정보로 복구한다.

텍스트 출력 관련 Built-in 함수의 목록은 다음과 같다.

함수 시그너쳐 설명
(textheight str) 인자 스트링의 height 값을 반환한다.
(textwidth str) 인자 스트링의 width 값을 반환한다.
(textout x y str) x, y 좌표에 str 스트링을 출력한다.
(textbound x1 y1 x2 y2 yspace text clipping) (x1, y1)점과 (x2, y2)점의 영역에 text를 출력한다. yspace는 문자의 행간 공백이다. clipping값이 참일 경우에는 영역에 포함되는 문자만 출력한다.
(textrect x1 y1 x2 y2 x y str) (x1, y1)점과 (x2, y2)점의 영역에서 x, y 위치에 str 스트링을 출력한다.

도형 관련 Built-in 함수의 목록은 다음과 같다.

함수 시그너쳐 설명
(rect x1 y1 x2 y2) (x1, y1)점과 (x2, y2)점을 영역의 끝점으로 하는 사각형을 그린다.
(filerect x1 y1 x2 y2) (x1, y1)점과 (x2, y2)점을 영역의 끝점으로 하는 채움 사각형을 그린다.
(ellipse x1 y1 x2 y2) (x1, y1)점과 (x2, y2)점을 영역의 끝점으로 하는 타원을 그린다.
(roundrect x1 y1 x2 y2 x3 y3) (x1, y1)점과 (x2, y2)점을 영역의 끝점으로 하는 끝이 둥근 사각형을 그린다. x3, y3 값은 둥근 모서리 사각형의 폭과 높이를 의미한다.
(arc x1 y1 x2 y2 x3 y3 x4 y4) draws an arc inside an ellipse bounded by the rectangle defined by (X1,Y1) and (X2,Y2). The arc starts at the intersection of the line drawn between the ellipse center ((X1+X2) / 2.0,(Y1+Y2) / 2.0) and the point (X3,Y3) and is drawn counterclockwise until it reaches the intersection of the line drawn between the ellipse center and the point (X4,Y4)
(pie x1 y1 x2 y2 x3 y3 x4 y4) draws a pie-shaped wedge on the image. The wedge is defined by the ellipse bounded by the rectangle determined by the points (X1, Y1) and X2, Y2). The section drawn is determined by two lines radiating from the center of the ellipse through the points (X3, Y3) and (X4, Y4)
(drawbitmap x y img transparent) x, y 위치에 img 파일명의 이미지를 출력한다. transparent 속성값이 true이면 배경색을 투명하게 출력한다. transparent 속성은 생략될수 있으며, 생략될 경우에는 false로 설정된다.
x1, y1, x2, y2 범위에 img 파일명의 이미지를 늘려서 출력한다.
(drawbitmap x1 y1 x2 y2 img transparent)
(moveto x y) 선을 그리는 팬을 x y 위치로 이동한다.
(lineto x y) 마지막으로 팬이 이동된 위치에서 x y 위치를 연결하는 선을 그린다.
(line x1 y1 x2 y2) (x1, y1)점과 (x2, y2)점을 연결하는 선을 그린다.
(pt x y) 인자를 x, y 좌표로 하는 포인트 객체를 반환한다.
(polygon (pt x1 y1) (pt x2 y2) ...) 인자 포인트 객체를 연결하는 polygon을 그린다.
(polyline (pt x1 y1) (pt x2 y2) ...) 인자 포인트 객체를 연결하는 polyline을 그린다.
(polybezier (pt x1 y1) (pt x2 y2) ...) 인자 포인트 객체를 연결하는 bezier 곡선을 그린다.
(ptatx index) 대상 모델의 뷰가 Edge일 경우에 대해서만 사용 가능하다. Edge의 점들중에 index 위치의 x 좌표를 반환한다.
(ptaty index) 대상 모델의 뷰가 Edge일 경우에 대해서만 사용 가능하다. Edge의 점들중에 index 위치의 y 좌표를 반환한다.
(ptcount) 대상 모델의 뷰가 Edge일 경우에 대해서만 사용 가능하다. Edge의 점 개수를 반환한다.
(drawedge headOrTail endStyle)

It is available when current view element is edge element. it draws end of edge in argument style. Style is composed of the followings and seperator is "|" character.

대상 모델의 뷰가 Edge일 경우에 대해서만 사용 가능하다. Edge의 끝 모양을 endStyle 형태로 그린다. endStyle의 값은 다음의 조합으로 구성되며, 두개 이상의 값을 지정할 경우에는 | 문자를 사용한다.

Value Shape
esStickArrow
esSolidArrow
esTriangle
esDiamond
esMiniDiamond
esArrowDiamond
esCrowFoot
esHalfStickArrow
esBar
esDoubleBar
esBelowCircle
esCircle
esRect
esFilledTriangle
esFilledDiamond
esMiniFilledDiamond
esArrowFilledDiamond
esFilledHalfStickArrow
esFilledCircle
esFilledRect
esMiniHalfDiamond
(drawobject elem) 인자 elem(IView)를 StarUML에서 정의된 방식으로 화면에 출력한다.
(arrangeobject elem) 인자 elem(IView)를 StarUML에서 정의된 방식으로 재배열한다.

새로운 다이어그램 타입을 만들기

Notation Extension을 사용하기 위해서 준비해야할 사항이 몇가지 있다. 노테이션이 적용될 요소를 기술하는 프로파일이 준비되어야 한다. 그리고 어떻게 표기법이 그려질지 정의하는 Notation Extension 파일(.NXT 확장자)이 필요하다. 프로파일에서 어떤 스테레오 타입과 어떤 Notation Extension 파일이 연결되어질지 정보를 기술해야 한다. 또한 Notation Extension에서 사용할 속성을 해당 스테레오 타입의 태그값에 추가한다. 그러면 이러한 과정을 ER-Diagram에 대한 표기법 확장을 통해서 간단하게 알아보자.

프로파일의 정의

먼저 ER-Diagram에서 사용되는 요소를 살펴보면 Table, Column, Relationship등이 있다.

이들 요소에 대해서 각각 스테레오타입을 만들고 UML 모델의 Class, Attribute, Association으로 각각 매핑하여 스테레오타입 적용시 동일한 의미를 지닐수 있게 한다. 이러한 관계를 프로파일로 옮기면 다음과 같다. 프로파일의 <STEREOTYPELIST>에  table이라는 스테레오타입을 새로 추가하고, 스테레오타입이 적용될 모델이 UMLClass 타입이라는 것을 <BASECLASS>에 기술한다. 그리고 table이 ER 형식의 표기법으로 보여지도록 Notation Extension 파일명을 <NOTATION>에 기술한다.

column 스테레오타입의 경우는 PK, FK, AK, IK등인지 구분되어져야 하므로 이들 정보를 저장하기 위해서 별도의 태그값이 필요하다. 따라서 이러한 태그값을 정의하고 있는 태그셋 참조명을 <RELATEDTAGDEFINITIONSET>에 기술한다.

<PROFILE version="1.0">
    <HEADER>
        ...
    </HEADER>
    <BODY>
        <STEREOTYPELIST>
            <STEREOTYPE>
                <NAME>table</NAME>
                <BASECLASSES>
                    <BASECLASS>UMLClass</BASECLASS>
                </BASECLASSES>
                <NOTATION>table.nxt</NOTATION>
            </STEREOTYPE>

            <STEREOTYPE>
                <NAME>column</NAME>
                <BASECLASSES>
                    <BASECLASS>UMLAttribute</BASECLASS>
                    <RELATEDTAGDEFINITIONSET>table</RELATEDTAGDEFINITIONSET>
                </BASECLASSES>
            </STEREOTYPE>
            ...

        </STEREOTYPELIST>

태그셋은 <TAGDEFINITIONSETLIST>의 <TAGDEFINITIONSET>에 기술되며, <TAGDEFINITION>에서 추가된 태그값의 이름, 타입, 디폴트값을 기술한다. 현재는 PK와 FK인지를 판별하기 위한 태그값이 추가되어 있고, 태그값의 타입은 Boolean이다. 그리고 기본값은 false를 가지므로써, 모든 column은 기본적으로 어떠한 키도 부여되지 않고 생성된다.

        ...
        </STEREOTYPELIST>

        <TAGDEFINITIONSETLIST>
            <TAGDEFINITIONSET>
                <NAME>column</NAME>
                <BASECLASSES>
                    <BASECLASS>UMLAttribute</BASECLASS>
                </BASECLASSES>

                <TAGDEFINITIONLIST>
                    ...
                    <TAGDEFINITION lock="False">
                        <NAME>PK</NAME>
                        <TAGTYPE>Boolean</TAGTYPE>
                        <DEFAULTDATAVALUE>false</DEFAULTDATAVALUE>
                    </TAGDEFINITION>

                    <TAGDEFINITION lock="False">
                        <NAME>FK</NAME>
                        <TAGTYPE>Boolean</TAGTYPE>
                        <DEFAULTDATAVALUE>false</DEFAULTDATAVALUE>
                    </TAGDEFINITION>
                    ...
                </TAGDEFINITIONLIST>
            </TAGDEFINITIONSET>
        </TAGDEFINITIONSETLIST>

이렇게 정의된 스테레오타입을 보여질 다이어그램을 형태를 선택해야 한다. <DIAGRAMTYPELIST>에서 새로운 다이어그램 ER Diagram이라는 타입을 정의하고 ClassDiagram을 기반으로 한다고 명시한다. 그리고 ER Diagram을 작성할 때 보여지는 팔레트의 참조명을 <AVAILABLEPALLETTE>에 기술한다.

        <DIAGRAMTYPELIST>
            <DIAGRAMTYPE>
                <NAME>ER(IE) Diagram</NAME>
                <DISPLAYNAME>ER(IE) Diagram</DISPLAYNAME>
                <BASEDIAGRAM>ClassDiagram</BASEDIAGRAM>
                <ICON>DataModelDiagram.bmp</ICON>
                <AVAILABLEPALETTELIST>
                    <AVAILABLEPALETTE>ERD(IE)</AVAILABLEPALETTE>
                </AVAILABLEPALETTELIST>
            </DIAGRAMTYPE>
        </DIAGRAMTYPELIST>

위에서 참조된 팔레트 목록의 정의는 <PALLETTE>의 <PALLETTEITEMLIST>에 기술된다. 그리고 팔레트의 각 버튼에 대한 세부 정보를 기술하는 부분에 대한 참조명을 <PALLETTEITEM>에 기술하고, <ELEMENTPROTOTYPE>에서 참조된 PALLETTEITEM에 대한 정보를 자세히 기술한다. <ELEMENTPROTOTYPE>은 팔레트 버튼의 명칭과 버튼의 아이콘, 생성될 요소의 타입 등에 대한 정보가 기술된다. 이중에서 생성시에 요소가 NOTATION EXTENSION의 적용을 받도록 하기 위해서 <SHOWEXTENSION>의 값을 true로 설정해야 한다.

        <PALETTELIST>
            <PALETTE>
                <NAME>ERD(IE)</NAME>
                <DISPLAYNAME>ERD(IE) Diagram</DISPLAYNAME>
                <PALETTEITEMLIST>
                    <PALETTEITEM>Table</PALETTEITEM>
                    <PALETTEITEM>identifying</PALETTEITEM>
                    <PALETTEITEM>non-identifying</PALETTEITEM>
                </PALETTEITEMLIST>
            </PALETTE>
        </PALETTELIST>

        <ELEMENTPROTOTYPELIST>
            <ELEMENTPROTOTYPE>
                <NAME>Table</NAME>
                <DISPLAYNAME>Table</DISPLAYNAME>
                <ICON>Table.bmp</ICON>
                <DRAGTYPE>Rect</DRAGTYPE>
                <BASEELEMENT>Class</BASEELEMENT>
                <STEREOTYPENAME>table</STEREOTYPENAME>
                <SHOWEXTENDEDNOTATION>True</SHOWEXTENDEDNOTATION>
            </ELEMENTPROTOTYPE>
            ...
        <ELEMENTPROTOTYPELIST>
    ...

Notation Extension 작성

프로파일 정의만으로도 Data Modeling은 가능하지만 ER 모델링 표기법으로 보여지기 위해서는 스테레오타입 정의 부분의 <NOTATION>에서 기술된 Notation Extension 파일(.nxt)을 작성해야 된다.

다음은 table 스테레오타입에 대한 표기법 출력하는 table.nxt 파일이다. notation식은 onarrange에서 drawing하기 전에 필요한 상태의 설정들을 수행한다.  ondraw에서는 테이블의 이름 부분, PK 컬럼 부분, 그외의 컬럼 부분을 보여지는 부분으로 구성된다.

(notation
    (onarrange ...)

    (ondraw
        // draw name part ...

        // draw PK column part ...

        // draw other column part ...
    )
)

테이블 이름을 보여주는 부분에서는 테이블을 그리는데 필요한 변수값을 설정하고 모델로부터 Name 속성값을 가져와서 x, y 위치에 출력한다.

(set x left)
(set y top)
...
(set name (mofattr model 'Name'))
(textout x y name)
...

여기서 left, top 변수는 Notation Extension이 수행될 때마다 매번 StarUML 플랫폼으로부터 넘겨받고, Notation Extension 종료후에 다시 값을 StarUML 플랫폼에 설정한다. 이러한 변수에는 다음과 같다. 넘겨View 요소로부터 받아오는 변수이다. 이와 같이 이것이외에도 view와 model 변수는 현재 선택된 View요소와 Model요소에 대한 객체이다.

변수명 적용 뷰 요소 플랫폼으로 반환 여부 설명
view Node,Edge not return 현재 표기 대상이 되는 View 요소
model Node,Edge not return 현재 표기 대상이 되는 Model 요소
left Node return 현재 표기 대상이 되는 Node View 요소의 Left 값
top Node return 현재 표기 대상이 되는 Node View 요소의 Top 값
right Node return 현재 표기 대상이 되는 Node View 요소의 Right 값
bottom Node return 현재 표기 대상이 되는 Node View 요소의 Bottom 값
width Node return 현재 표기 대상이 되는 Node View 요소의 Width 값
height Node return 현재 표기 대상이 되는 Node View 요소의 Height 값
minwidth Node not return 현재 표기 대상이 되는 Node View 요소의 MinWidth 값
minheight Node not return 현재 표기 대상이 되는 Node View 요소의 MinHeight 값
points Edge not return 현재 표기 대상이 되는 Edge View 요소의 point 집합 객체
head Edge not return 현재 표기 대상이 되는 Edge View 요소의 Head로 참조하는 View 요소
tail Edge not return 현재 표기 대상이 되는 Edge View 요소의 Tail로 참조하는 View 요소

다음은 현재 테이블이 다른 테이블에 대해서 종속적인 관계를 가지고 있는지 검사한다. 이를 위해서 현재 테이블(클래스)의 연관을 반복하면서 연관의 머리쪽에 테이블이 연결되어 있다면 테이블이 종속적이라고 판단한다. 이러한 판단정보를 이용하여 종속적인 테이블은 둥근 모서리의 사각형으로 테두리 사각형을 그리고, 종속적이지 않은 테이블일 경우에는 일반 사각형으로 테두리를 그린다.

(set isSuperType true)

(set c (mofcolcount model 'Associations'))
(for i 0 (- c 1)
    (sequence
        (set assocEnd (mofcolat model 'Associations' i))
        (if (= assocEnd (mofcolat (mofref assocEnd 'Association') 'Connections' 1))
            (set isSuperType false)
            nil)))
...
// outline
(setdefaultstyle)
(if isSuperType
    (rect x y right bottom)
    (roundrect x y right bottom 10 10))

컬럼의 내용을 출력할 때는 테이블에 포함된 모든 컬럼(attribute)을 반복하면서 PK 태그값이 true인 요소들에 대해서 다른 컬럼보다 상위에 그려지고, PK 컬럼 표시의 이미지를 좌측에 표시하고 컬럼 이름을 화면에 출력한다.

...
(for i 0 (- (mofColCount model 'Attributes') 1)
    (sequence
        // select i-th column
        (set attr (mofColAt model 'Attributes' i))
        ...
        // column is PK?
        (if (tagVal attr 'ERD' 'column' 'PK')
            (sequence
                ...
                (set attrName (mofAttr attr 'Name'))
                ...
                (drawbitmap x y 'primarykey.bmp' true)
                (textout (+ x 16) y attrName)
                (setdefaultstyle)
                ... ))))
...
(line left y right y)

다시 한번 컬럼을 반복하면서 PK 태그값이 false인 요소들만을 찾아서 컬럼 이미지와 컬럼의 이름을 화면에 출력한다.

...
(for i 0 (- (mofColCount model 'Attributes') 1)
    (sequence
        // select i-th column
        (set attr (mofColAt model 'Attributes' i))
        (set keys '')
        ...
        // column is not PK?
        (if (= (tagVal attr 'ERD' 'column' 'PK') false)
        (sequence
            ...
            (set attrName (mofAttr attr 'Name'))
            ...
            // draw column
            (drawbitmap x y 'column.bmp' true))
            (textout (+ x 16) y attrName)
            (setdefaultstyle)
                ... ))))

Notation Extension의 설치와 사용

작성된 Notation Extension 파일을 프로파일에서 기술된 경로에 존재해야 한다. table 스테레오타입의 예에서는 별도의 경로가 명시되지 않고 파일명만 명시되었으므로, 프로파일과 Noation Extension 파일은 동일한 폴더에 위치시키도록 한다.

모든 작성이 완료되었으면 설치를 위해서는 다음의 과정을 수행한다.

  1. 프로파일과 Notation Extension 파일, 관련 이미지 파일들을 특정이름의 모듈 폴더에 넣는다.
  2. 해당 모듈 폴더를 staruml/modules 폴더 아래에 복사한다.
  3. StarUML을 재시작하면 설치가 완료된다.


 

참고

  • ER-Diagram에 대한 완전한 Notation Extension과 프로파일을 포함하는 모듈은 StarUML 공식 홈페이지의 module download에서 받아서 설치하도록 한다.

설치된 프로파일과 Notation Extension 기능을 사용하는 방법은 다음과 같다.

  1. StarUML을 시작한다.
     
  2. [Model] -> [Profiles...] 메뉴에서 클릭한다.


     
  3. [Profile Manager] 다이얼로그가 나타나면 [Available profiles] 리스트창에서 Data Modeling 프로파일을 선택하고 [Include] 버튼을 클릭한다.


     
  4. [Model Explorer]에서  ER-Diagram을 포함할 패키지를 선택하고, 팝업 메뉴 [Add Diagram] -> [ER(IE) Diagram] 메뉴를 클릭한다.


     
  5. ER-Diagram이 [Main] 화면에 나타나고 ER 모델링용 팔레트가 화면에 나타난다.

  6. 팔레트에서 노테이션을 이용하여 모델링을 하고, 속성 정보는 버튼을 클릭하여 [Tagged Value Editor][ERD]  탭의 태그값들을 이용하여 설정한다.

  7. 원하는 형태의 ER Diagram을 작성한다.


반응형

댓글