모델, 클래스 및 관계 이해
DSL(도메인 특정 언어)은 사용자가 작성할 수 있는 사용자 지정 프로그램 코드와 함께 DSL 정의 파일에 의해 정의됩니다. DSL 솔루션의 프로그램 코드는 대부분 이 파일에서 생성됩니다.
이 항목에서는 DSL 정의의 핵심 기능에 대해 설명합니다.
DSL 정의
Dsl\DslDefinition.dsl
을 열면 Visual Studio 창이 다음 그림과 같이 표시됩니다.
DSL 정의에서 가장 중요한 정보는 DSL 정의 다이어그램에 표시됩니다. DslDefinition.dsl의 일부이기도 한 추가 정보는 DSL 탐색기에서 일반적으로 다이어그램의 측면에 표시됩니다. 가장 자주 사용되는 작업은 다이어그램에서 수행하고 보다 고급 사용자 지정은 DSL 탐색기에서 수행합니다.
DSL 정의 다이어그램은 모델 요소를 정의하는 도메인 클래스와 모델 요소 간의 링크를 정의하는 관계를 보여 줍니다. 또한 모델 요소를 표시하는 데 사용되는 도형 및 연결선을 사용자에게 보여 줍니다.
다이어그램 또는 DSL 탐색기에서 DSL 정의의 항목을 선택하면 속성 창에 해당 항목에 대한 정보가 표시됩니다. 추가 정보가 DSL 세부 정보 창에 표시될 수 있습니다.
모델은 DSL의 인스턴스
“모델”은 사용자가 만든 DSL의 인스턴스입니다. 모델에는 사용자가 정의하는 도메인 클래스의 인스턴스인 모델 요소와 사용자가 정의하는 도메인 관계의 인스턴스인 요소 간의 링크가 포함되어 있습니다. 또한 모델에는 다이어그램의 모델 요소와 링크를 표시하는 도형 및 연결선도 포함될 수 있습니다. DSL 정의에는 도형 클래스, 연결선 클래스 및 다이어그램에 대한 클래스가 포함되어 있습니다.
DSL 정의를 “도메인 모델”이라고도 합니다. DSL 정의 또는 도메인 모델은 도메인 특정 언어의 디자인 타임 표현이고, 모델은 도메인 특정 언어의 런타임 인스턴스화입니다.
도메인 클래스가 모델 요소를 정의
도메인 클래스는 도메인에서 다양한 요소를 만드는 데 사용되고 도메인 관계는 요소 간의 링크입니다. 이들은 디자인별 언어의 사용자가 모델을 만들 때 인스턴스화할 요서 및 링크의 디자인 타임 표현입니다.
다음 그림은 음악 라이브러리 DSL의 사용자가 만든 모델을 보여 줍니다. 음악 앨범이 곡 목록을 포함하는 상자로 표시됩니다. 음악가는 둥근 상자로 표현되고 이들이 제공한 앨범에 연결됩니다.
DSL 정의는 두 가지 측면을 구분합니다. 모델 다이어그램에서 모델 요소의 모양은 도형 클래스 및 연결선 클래스를 사용하여 정의됩니다. 모델에 전달되는 정보는 도메인 클래스 및 도메인 관계를 사용하여 정의됩니다.
다음 그림에서는 음악 라이브러리의 DSL 정의에서 도메인 클래스와 관계를 보여 줍니다.
이 그림은 Music, Album, Artist, Song의 네 가지 도메인 클래스를 보여 줍니다. 도메인 클래스는 이름, 제목 등의 도메인 속성을 정의합니다. 인스턴스 모델에서는 이러한 속성 일부의 값이 다이어그램에 표시됩니다.
클래스 간에는 도메인 관계(MusicHasAlbums, MusicHasArtists, AlbumbHasSongs, ArtistAppearedOnAlbums)가 있습니다. 관계에는 다중성이 있습니다(예: 1..1, 0..*). 예를 들어 모든 Song은 AlbumHasSongs 관계를 통해 정확히 하나의 Album에 연결되어야 합니다. 모든 Album에는 임의의 수의 Song이 있을 수 있습니다.
DSL 정의 다이어그램 다시 정렬
이 그림에서 Album이 표시되는 것처럼 DSL 정의 다이어그램에는 도메인 클래스가 여러 번 나타날 수 있습니다. 항상 하나의 기본 보기가 있고 몇 개의 “참조” 보기가 있을 수 있습니다.
DSL 정의 다이어그램을 다시 정렬하려면 다음을 수행할 수 있습니다.
여기로 트리 가져오기 및 트리 분할 명령을 사용하여 기본 보기와 참조 보기 간에 전환합니다. 단일 도메인 클래스를 마우스 오른쪽 단추로 클릭하면 다음 명령이 표시됩니다.
Ctrl+Up 또는 Ctrl+Down을 눌러 도메인 클래스 및 도형 클래스의 순서를 다시 조정합니다.
각 도형의 오른쪽 위에 있는 아이콘을 사용하여 클래스를 축소하거나 확장합니다.
도메인 클래스의 맨 아래에 있는 빼기 기호(-)를 클릭하여 트리의 일부를 축소합니다.
상속
상속을 사용하여 도메인 클래스를 정의할 수 있습니다. 상속 파생을 만들려면 상속 도구를 클릭하고 파생 클래스를 클릭한 다음 기본 클래스를 클릭합니다. 모델 요소에는 자체 도메인 클래스에 정의된 모든 속성과 기본 클래스에서 상속된 모든 속성이 있습니다. 또한 관계에서 해당 역할을 상속합니다.
관계, 도형, 연결선 간에도 상속을 사용할 수 있습니다. 상속은 동일한 그룹 내에 유지되어야 합니다. 도형은 도메인 클래스에서 상속할 수 없습니다.
도메인 관계
모델 요소는 관계로 연결할 수 있습니다. 링크는 항상 이진입니다. 정확히 두 개의 요소를 연결합니다. 그러나 모든 요소는 다른 개체에 대한 많은 링크를 포함할 수 있으며 동일한 요소 쌍 사이에 둘 이상의 링크가 있을 수 있습니다.
다양한 요소 클래스를 정의할 수 있는 것처럼 다양한 링크 클래스를 정의할 수 있습니다. 링크 클래스를 “도메인 관계”라고 합니다. 도메인 관계는 인스턴스에 연결할 수 있는 요소의 클래스를 지정합니다. 관계의 각 끝을 “역할”이라고 하며, 도메인 관계는 두 역할의 이름과 관계 자체에 대한 이름을 정의합니다.
도메인 관계에는 포함 관계와 참조 관계 두 종류가 있습니다. DSL 정의 다이어그램에서 포함 관계는 각 역할에서 실선을 가지며 참조 관계는 점선이 있습니다.
포함 관계
해당 루트를 제외한 모델의 모든 요소는 한 포함 링크의 대상입니다. 따라서 전체 모델은 포함 링크의 단일 트리를 형성합니다. 포함 관계는 포함 또는 소유권을 나타냅니다. 이러한 방식으로 관련된 두 모델 요소를 부모 및 자식이 라고도 합니다. 자식은 부모에 포함된 것으로 간주됩니다.
일반적으로 포함 링크는 다이어그램에서 명시적으로 연결선으로 표시되지 않습니다. 대신, 일반적으로 포함으로 표시됩니다. 모델의 루트는 다이어그램에 의해 표시되고 여기에 포함된 요소는 다이어그램에서 도형으로 표시됩니다.
이 예제에서 Music 루트 클래스는 Album에 대해 MusicHasAlbums 포함 관계를 가지며, Album은 Song에 대해 AlbumHasSongs 포함 관계를 가집니다. Song은 각 Album 내에서 목록의 항목으로 표시됩니다. 또한 Music에는 Artist 클래스에 대한 포함 관계 MusicHasArtists도 있습니다. 이 경우 해당 인스턴스는 다이어그램에서 도형으로도 표시됩니다.
기본적으로 포함된 요소는 부모가 삭제될 때 자동으로 삭제됩니다.
모델을 XML 형식으로 파일에 저장할 때 serialization을 사용자 지정하지 않은 경우 포함된 요소가 부모 내부에 중첩됩니다.
참고 항목
포함은 상속과는 다릅니다. 포함 관계의 자식은 부모의 속성을 상속하지 않습니다. 포함은 모델 요소 간의 링크 형식입니다. 상속은 클래스 간의 관계이며 모델 요소 간에 링크를 만들지 않습니다.
포함 규칙
인스턴스 모델의 모든 요소는 모델의 루트를 제외하고 정확히 하나의 포함 링크의 대상이어야 합니다.
따라서 루트 클래스를 제외한 모든 비추상 도메인 클래스는 하나 이상의 포함 관계의 대상이거나 기본 클래스에서 포함을 상속해야 합니다. 클래스는 둘 이상의 포함 관계의 대상이 될 수 있지만 인스턴스 모델 요소는 한 번에 하나의 부모만 가질 수 있습니다. 대상에서 원본으로의 다중성은 0..1 또는 1..1이어야 합니다.
포함 트리는 탐색기에 표시
DSL 정의는 탐색기도 만듭니다. 사용자는 모델 다이어그램과 함께 탐색기를 볼 수 있습니다.
탐색기에는 모델의 모든 요소가 표시됩니다(도형이 정의되지 않은 요소도 포함). 탐색기는 요소 및 포함 관계를 표시하지만 참조 관계는 표시하지 않습니다.
요소에 대한 도메인 속성 값을 확인하려면 사용자는 모델 다이어그램 또는 모델 탐색기에서 요소를 선택하고 속성 창을 엽니다. 탐색기는 다이어그램에 표시되지 않는 속성을 포함하여 모든 도메인 속성을 표시합니다. 이 예제에서는 각 Song에 Title 및 Genre가 모두 있지만, Title 값만 다이어그램에 표시됩니다.
참조 관계
참조 관계는 포함이 아닌 모든 종류의 관계를 나타냅니다.
참조 관계는 보통 다이어그램에 도형 간의 연결선으로 표시됩니다.
모델의 XML 표현에서 두 요소 간의 참조 링크는 모니커를 사용하여 표시됩니다. 즉, 모니커는 모델의 각 요소를 고유하게 식별하는 이름입니다. 각 모델 요소에 대한 XML 노드에는 관계의 이름과 다른 요소의 모니커를 지정하는 노드가 포함됩니다.
Roles
모든 도메인 관계에는 원본 역할과 대상 역할 두 가지가 있습니다.
다음 그림에서 Publisher 도메인 클래스와 PublisherCatalog 도메인 관계 사이의 선은 원본 역할입니다. 도메인 관계와 Album 도메인 클래스 사이의 선은 대상 역할입니다.
관계와 연결된 이름은 모델을 트래버스하는 프로그램 코드를 작성할 때 특히 중요합니다. 예를 들어 DSL 솔루션을 빌드하면 생성된 클래스 Publisher에는 Album 모음인 Catalog 속성이 있습니다. Album 클래스에는 Publisher 클래스의 단일 인스턴스인 Publisher 속성이 있습니다.
DSL 정의에서 관계를 만들 때 속성 및 관계 이름에 기본값이 지정됩니다. 그러나 이 이름은 변경할 수 있습니다.
다중성
다중성은 도메인 관계에서 동일한 역할을 가질 수 있는 요소 수를 지정합니다. 이 예제에서 Catalog 역할에 대한 영대다(0..*) 다중성 설정은 Publisher 도메인 클래스의 모든 인스턴스가 PublisherCatalog 관계 링크를 사용자가 지정하는 수만큼 포함할 수 있도록 지정합니다.
역할의 다중성은 다이어그램에 입력하거나 속성 창에서 Multiplicity
속성을 수정하여 구성합니다. 다음 표에서는 이 속성에 대한 설정을 설명합니다.
다중성 유형 | 설명 |
---|---|
0..*(영대다) | 도메인 클래스의 각 인스턴스에 관계 인스턴스가 여러 개 있거나 없을 수 있습니다. |
0..1(영대일) | 도메인 클래스의 각 인스턴스에 관계 인스턴스가 하나 있거나 없을 수 있습니다. |
1..1(일대일) | 도메인 클래스의 각 인스턴스에 관계 인스턴스가 하나만 있을 수 있습니다. 역할 클래스의 인스턴스에서는 이 관계의 인스턴스를 둘 이상 만들 수 없습니다. 유효성 검사를 사용하도록 설정하면 역할 클래스의 인스턴스에 관계 인스턴스가 없는 경우 유효성 검사 오류가 표시됩니다. |
1..*(일대다) | 이 다중성을 갖는 역할에 있는 클래스의 각 인스턴스에는 관계 인스턴스가 여러 개 있을 수 있으며, 각 인스턴스에는 적어도 하나 이상의 관계 인스턴스가 있어야 합니다. 유효성 검사를 사용하도록 설정하면 역할 클래스의 인스턴스에 관계 인스턴스가 없는 경우 유효성 검사 오류가 표시됩니다. |
클래스로서의 도메인 관계
링크는 저장소에서 ModelElement의 파생 클래스인 LinkElement 인스턴스로 표시됩니다. 도메인 관계에 대한 도메인 모델 다이어그램에서 이러한 속성을 정의할 수 있습니다.
다른 관계의 원본 또는 대상에 관계를 설정할 수도 있습니다. 도메인 모델 다이어그램에서 도메인 관계를 마우스 오른쪽 단추로 클릭한 다음 클래스로 표시를 클릭합니다. 추가 클래스 상자가 표시됩니다. 여기에서 관계를 연결할 수 있습니다.
도메인 클래스에서와 마찬가지로 상속을 통해 부분적으로 관계를 정의할 수 있습니다. 파생 관계를 선택하고 속성 창에서 기본 관계를 설정합니다.
파생 관계는 기본 관계를 특수화합니다. 연결되는 도메인 클래스는 기본 관계에 의해 연결된 클래스에서 파생되거나 동일해야 합니다. 모델에서 생성된 파생 관계의 링크는 파생 관계와 기본 관계 모두의 인스턴스입니다. 프로그램 코드에서 기본 또는 파생 클래스에 의해 생성된 속성을 사용하여 링크의 반대쪽 끝으로 이동할 수 있습니다.