다음을 통해 공유


모델, 클래스 및 관계 이해

DSL(도메인별 언어)은 작성할 수 있는 사용자 지정 프로그램 코드와 함께 DSL 정의 파일에 의해 정의됩니다. DSL 솔루션의 대부분의 프로그램 코드는 이 파일에서 생성됩니다.

이 항목에서는 DSL 정의의 핵심 기능에 대해 설명합니다.

DSL 정의

Dsl\DslDefinition.dsl을 열면 Visual Studio 창이 다음 그림처럼 보입니다.

dsl designer

DSL 정의의 가장 중요한 정보는 DSL 정의 다이어그램에 표시됩니다. DslDefinition.dsl의 일부인 추가 정보는 일반적으로 다이어그램의 측면에 표시되는 DSL 탐색기에 표시됩니다. 가장 빈번한 작업에 대한 다이어그램과 고급 사용자 지정을 위한 DSL 탐색기를 사용하여 작업합니다.

DSL 정의 다이어그램은 모델 요소를 정의하는 도메인 클래스와 모델 요소 간의 링크를 정의하는 관계를 보여 줍니다. 또한 사용자에게 모델 요소를 표시하는 데 사용되는 셰이프 및 연결선도 보여 줍니다.

스윔 레인이 있는 DSL 설계자

다이어그램 또는 DSL 탐색기에서 DSL 정의에서 항목을 선택하면 속성 창에 해당 항목에 대한 정보가 표시됩니다. DSL 세부 정보 창에 추가 정보가 표시될 수 있습니다.

모델은 DSL의 인스턴스입니다.

모델은 사용자가 만든 DSL의 인스턴스입니다. 모델에는 사용자가 정의하는 도메인 클래스의 인스턴스인 모델 요소와 정의한 도메인 관계의 인스턴스인 요소 간의 연결이 포함됩니다. 모델에는 다이어그램에 모델 요소와 링크를 표시하는 셰이프와 연결선이 있을 수도 있습니다. DSL 정의에는 셰이프 클래스, 연결선 클래스 및 다이어그램에 대한 클래스가 포함됩니다.

DSL 정의를 도메인 모델이라고도 합니다. DSL 정의 또는 도메인 모델은 도메인 특정 언어의 디자인 타임 표현인 반면 모델은 도메인 특정 언어의 런타임 인스턴스화입니다.

도메인 클래스는 모델 요소를 정의합니다.

도메인 클래스는 도메인에서 다양한 요소를 만드는 데 사용되며 도메인 관계는 요소 간의 링크입니다. 모델을 만들 때 디자인별 언어의 사용자가 인스턴스화할 요소 및 링크의 디자인 타임 표현입니다.

이 그림에서는 음악 라이브러리 DSL 사용자가 만든 모델을 보여 줍니다. 음악 앨범은 노래 목록이 포함된 상자로 표시됩니다. 아티스트는 둥근 상자로 표현되며 기여한 앨범과 연결됩니다.

생성된 DSL의 인스턴스 모델

DSL 정의는 두 가지 측면을 구분합니다. 모델 다이어그램에서 모델 요소의 모양은 셰이프 클래스 및 연결선 클래스를 사용하여 정의됩니다. 모델에 전달된 정보는 도메인 클래스 및 도메인 관계를 사용하여 정의됩니다.

다음 그림에서는 음악 라이브러리의 DSL 정의에 있는 도메인 클래스 및 관계를 보여 줍니다.

내포 및 참조 관계

그림에서는 음악, 앨범, 아티스트 및 노래의 네 가지 도메인 클래스를 보여 줍니다. 도메인 클래스는 Name, Title 등과 같은 도메인 속성을 정의합니다. 인스턴스 모델에서 이러한 속성 중 일부의 값이 다이어그램에 표시됩니다.

클래스 사이에는 도메인 관계인 MusicHasAlbums, MusicHasArtists, AlbumbHasSongs 및 ArtistAppearedOnAlbums가 있습니다. 관계에는 1..1, 0..*과 같은 곱셈이 있습니다. 예를 들어, 모든 노래는 AlbumHasSongs 관계를 통해 정확히 하나의 앨범과 관련되어야 합니다. 모든 앨범에는 다양한 노래가 있을 수 있습니다.

DSL 정의 다이어그램 다시 정렬

이 그림에서처럼 도메인 클래스가 DSL 정의 다이어그램에 여러 번 나타날 수 있습니다. 항상 하나의 기본 보기가 있으며 몇 가지 참조 보기가 있을 수 있습니다.

DSL 정의 다이어그램을 다시 정렬하려면 다음을 수행할 수 있습니다.

  • 여기에 트리 가져오기트리 분할 명령을 사용하여 기본 및 참조 뷰를 교환합니다. 이러한 명령을 보려면 단일 도메인 클래스를 마우스 오른쪽 단추로 클릭합니다.

  • Ctrl+위쪽 및 Ctrl+아래쪽을 눌러 도메인 클래스 및 셰이프 클래스의 순서를 다시 지정합니다.

  • 각 셰이프의 오른쪽 위에 있는 아이콘을 사용하여 클래스를 축소하거나 확장합니다.

  • 도메인 클래스의 맨 아래에 있는 빼기 기호(-)를 클릭하여 트리의 일부를 축소합니다.

상속

상속을 사용하여 도메인 클래스를 정의할 수 있습니다. 상속 파생을 만들려면 상속 도구를 클릭하고 파생 클래스를 클릭한 다음 기본 클래스를 클릭합니다. 모델 요소에는 기본 클래스에서 상속된 모든 속성과 함께 자체 도메인 클래스에 정의된 모든 속성이 있습니다. 또한 관계에서 해당 역할을 상속합니다.

관계, 셰이프 및 연결선 간에 상속을 사용할 수도 있습니다. 상속은 동일한 그룹 내에 있어야 합니다. 셰이프는 도메인 클래스에서 상속할 수 없습니다.

도메인 관계

모델 요소는 관계로 연결할 수 있습니다. 링크는 항상 이진입니다. 정확히 두 요소를 연결합니다. 그러나 모든 요소에는 다른 개체에 대한 많은 링크가 있을 수 있으며 동일한 요소 쌍 사이에는 둘 이상의 링크가 있을 수도 있습니다.

다양한 요소 클래스를 정의할 수 있는 것처럼 다양한 링크 클래스를 정의할 수 있습니다. 링크의 클래스를 도메인 관계라고합니다. 도메인 관계는 해당 인스턴스가 연결할 수 있는 요소의 클래스를 지정합니다. 관계의 각 끝을 역할이라고 하며 도메인 관계는 관계 자체뿐만 아니라 두 역할의 이름을 정의합니다.

도메인 관계의 두 종류는 관계 포함 및 참조 관계입니다. DSL 정의 다이어그램에서 포함 관계는 각 역할에 실선이 있고 참조 관계에는 파선이 있습니다.

관계 임베딩

루트를 제외한 모델의 모든 요소는 하나의 포함 링크의 대상입니다. 따라서 전체 모델은 포함 링크의 단일 트리를 형성합니다. 포함 관계는 포함 또는 소유권을 나타냅니다. 이러한 방식으로 관련된 두 가지 모델 요소를 부모 및 자식이라고도 합니다. 자식은 부모에 포함되어 있다고합니다.

링크 포함은 일반적으로 다이어그램에 커넥터로 명시적으로 표시되지 않습니다. 대신 일반적으로 포함으로 표시됩니다. 모델의 루트는 다이어그램으로 표현되며, 모델에 포함된 요소는 다이어그램에 셰이프로 표시됩니다.

이 예제에서 루트 클래스 Music에는 MusicHasAlbums와 Album에 대한 포함 관계가 있으며, 이 관계에는 AlbumHasSongs를 Song에 포함합니다. 노래는 각 앨범 내의 목록에 항목으로 표시됩니다. 음악은 또한 MusicHasArtists를 아티스트 클래스에 포함하며, 해당 인스턴스는 다이어그램에도 셰이프로 표시됩니다.

기본적으로 임베디드 요소들은 부모 요소가 삭제될 때 자동으로 삭제됩니다.

모델이 XML 형식으로 파일에 저장되면 serialization을 사용자 지정하지 않은 한 포함된 요소가 부모 내부에 중첩됩니다.

비고

포함은 상속과 동일하지 않습니다. 포함 관계의 자식은 부모의 속성을 상속하지 않습니다. 포함은 모델 요소 간의 링크 유형입니다. 상속은 클래스 간의 관계이며 모델 요소 간에 링크를 만들지 않습니다.

규칙 포함

인스턴스 모델의 모든 요소는 모델의 루트를 제외하고 정확히 하나의 포함 링크의 대상이어야 합니다.

따라서 루트 클래스를 제외한 모든 비추상 도메인 클래스는 하나 이상의 포함 관계의 대상이어야 하거나 기본 클래스에서 포함을 상속해야 합니다. 클래스는 둘 이상의 포함 대상일 수 있지만 인스턴스 모델 요소는 한 번에 하나의 부모만 가질 수 있습니다. 대상에서 원본으로의 곱셈은 0..1 또는 1..1이어야 합니다.

탐색기가 임베디드 트리를 표시합니다.

또한 DSL 정의는 사용자가 모델 다이어그램과 함께 볼 수 있는 탐색기를 만듭니다.

생성된 DSL 탐색기

탐색기에는 모델의 모든 요소가 표시되며, 셰이프를 정의하지 않은 요소도 표시됩니다. 요소를 표시하고 관계를 포함하지만 참조 관계는 표시하지 않습니다.

요소의 도메인 속성 값을 보려면 사용자는 모델 다이어그램 또는 모델 탐색기에서 요소를 선택하고 속성 창을 엽니다. 다이어그램에 표시되지 않는 속성을 포함하여 모든 도메인 속성을 표시합니다. 이 예제에서 각 노래에는 제목과 장르가 모두 있지만 제목 값만 다이어그램에 표시됩니다.

참조 관계

참조 관계는 포함하지 않는 모든 종류의 관계를 나타냅니다.

참조 관계는 일반적으로 다이어그램에 셰이프 간의 연결선으로 표시됩니다.

모델의 XML 표현에서 두 요소 간의 참조 링크는 모니커 를 사용하여 표시됩니다. 즉, 모니커가 모델의 각 요소를 고유하게 식별하는 이름입니다. 각 모델 요소의 XML 노드에는 관계의 이름과 다른 요소의 모니커를 지정하는 노드가 포함됩니다.

역할

모든 도메인 관계에는 원본 역할과 대상 역할이라는 두 가지 역할이 있습니다.

다음 그림에서는 Publisher 도메인 클래스와 PublisherCatalog 도메인 관계 사이의 줄이 원본 역할입니다. 도메인 관계와 Album 도메인 클래스 사이의 줄이 대상 역할입니다.

역할 및 속성.

관계와 연결된 이름은 모델을 트래버스하는 프로그램 코드를 작성할 때 특히 중요합니다. 예를 들어, DSL 솔루션을 빌드할 때 생성된 클래스인 Publisher에는 Albums 컬렉션인 속성 Catalog가 있습니다. 클래스 Album에는 Publisher 클래스의 단일 인스턴스인 속성 Publisher가 있습니다.

DSL 정의에서 관계를 만들면 속성 및 관계 이름에 기본값이 지정됩니다. 그러나 변경할 수 있습니다.

다중성

다중성은 도메인 관계에서 동일한 역할을 가질 수 있는 요소 수를 지정합니다. 이 예제에서 카탈로그 역할의 0 대 다(0..*) 곱하기 설정은 Publisher 도메인 클래스의 모든 인스턴스에 제공하려는 만큼 PublisherCatalog 관계 링크를 포함할 수 있음을 지정합니다.

역할의 다중성을 구성하려면 다이어그램에서 입력하거나 Multiplicity 속성 창의 속성을 수정하십시오. 다음 표에서는 이 속성에 대한 설정을 설명합니다.

다중성 유형 Description
0..* (0에서 다까지) 도메인 클래스의 각 인스턴스에는 관계의 여러 인스턴스가 있거나 관계의 인스턴스가 없을 수 있습니다.
0..1(0대 1) 도메인 클래스의 각 인스턴스에는 관계의 인스턴스가 하나 이상 있거나 관계의 인스턴스가 없을 수 있습니다.
1..1(하나) 도메인 클래스의 각 인스턴스에는 관계의 인스턴스가 하나 있을 수 있습니다. 역할 클래스의 인스턴스에서 이 관계의 인스턴스를 둘 이상 만들 수 없습니다. 유효성 검사를 사용하도록 설정하면 역할 클래스의 인스턴스에 관계의 인스턴스가 없는 경우 유효성 검사 오류가 표시됩니다.
1..* (일 대 다) 이 곱셈이 있는 역할의 각 클래스 인스턴스에는 관계의 여러 인스턴스가 있을 수 있으며 각 인스턴스에는 관계의 인스턴스가 하나 이상 있어야 합니다. 유효성 검사를 사용하도록 설정하면 역할 클래스의 인스턴스에 관계의 인스턴스가 없는 경우 유효성 검사 오류가 표시됩니다.

클래스로서의 도메인 관계

링크는 Store에서 ModelElement의 파생 클래스인 LinkElement의 인스턴스로 표시됩니다. 도메인 관계에 대한 도메인 모델 다이어그램에서 이러한 속성을 정의할 수 있습니다.

관계를 다른 관계의 원본 또는 대상으로 만들 수도 있습니다. 도메인 모델 다이어그램에서 도메인 관계를 마우스 오른쪽 단추로 클릭한 다음 클래스로 표시를 클릭합니다. 추가 클래스 상자가 나타납니다. 그런 다음 관계를 연결할 수 있습니다.

도메인 클래스와 마찬가지로 상속을 통해 관계를 부분적으로 정의할 수 있습니다. 파생 관계를 선택하고 속성 창에서 기본 관계를 설정합니다.

파생 관계는 기본 관계를 특수화합니다. 연결하는 도메인 클래스는 기본 관계에서 연결된 클래스에서 파생되거나 같아야 합니다. 파생 관계의 링크가 모델에 만들어지면 파생 관계와 기본 관계의 인스턴스입니다. 프로그램 코드에서 기본 또는 파생 클래스에서 생성된 속성을 사용하여 링크의 반대쪽 끝으로 이동할 수 있습니다.