Mermaid로 완성하는 도메인 설계: 클래스 다이어그램 점검

zion·2025년 11월 6일

간단하게 그려진 초기 클래스 다이어그램을 점검하고, 핵심 요소를 반영하며 최종 문서를 완성하는 과정을 정리합니다.

1. 🔑 접근 범위(Visibility) 및 메서드 추가

Mermaid 문법을 활용하여 클래스 멤버(필드, 메서드)의 접근 범위를 명확히 표현했습니다.

기호의미설명
+Public공개 멤버, 어디서든 접근 가능
-Private비공개 멤버, 클래스 내부에서만 접근 가능
#Protected상속 관계 내에서 접근 가능
~Package / Internal같은 패키지 내에서 접근 가능
수정된 클래스 다이어그램1

2. 🧱 VO(Value Object)와 Enum 추가

도메인 설계의 완성도를 높이기 위해 식별자가 없는 VO와 상태를 정의하는 Enum을 추가했습니다.

1) Point VO (Value Object)

지난주 User 엔티티와 별도 테이블로 관리하던 Point 데이터를 VO로 전환하고 User 클래스에 포함시켰습니다.
평소 유저 테이블은 ERP에서 전송받는 데이터로 수정이 일어나지 않는 테이블이다보니 수정이 반복되는 Point가 포함되는 것이 어색해보여서 분리하게 되었었습니다. 하지만 현재 Point 테이블에 userId, pointAmount 외에 추가로 들어갈 정보들이나 요구사항이 없기 때문에 테이블로 분리하는 것은 나중 일이라는 것을 이해하게 되었습니다.

2) OrderStatus Enum

도메인 내에서 통일된 언어(유비쿼터스 언어)로 정의한 주문 상태를 Enum으로 추가했습니다.

수정된 클래스 다이어그램2

3. ➡️ 관계 및 방향 명확화 (Mermaid 화살표 사용)

Mermaid가 지원하는 UML 관계 표현을 사용하여 도메인 간의 결합도와 생명주기를 명확하게 정의했습니다.

Mermaid에서 표현할수 있는 화살표중 아래 상속,연관,집합,합성 4가지의 관계를 알아보겠습니다.

1) Inheritance(상속)

자식 --|> 부모
하나의 클래스가 다른 클래스의 특성과 동작을 물려받는 관계입니다.
예) 사과는 과일이다.

2) Association(연관)

참조하는 --> 참조되는
독립적인 객체 간의 느슨한 관계로, "has-a" 관계입니다. 객체들은 독자적인 라이프사이클을 가지며 서로 소유하지 않고 사용할 수 있습니다.
예) 선생님과 학생 관계

3) Aggregation(집합)

전체 o-- 부분
특별한 형태의 Association으로, 소유권을 가진 약한 결합 관계입니다. 포함된 객체는 독립적으로 존재할 수 있고, 부모 객체가 사라져도 자식 객체는 남습니다.
예) 부서와 직원 관계

4) Composition(합성)

전체 *-- 부분
Aggregation보다 강한 결합 관계로, 부모 객체가 소멸되면 자식 객체도 함께 소멸합니다.
예) 집과 방 관계

처음 정의한 관계코드
Order --> User  
Like --> Product  
Like --> User

Order --> OrderItem  
Product --> Brand
OrderItem --> Product  
User *--Point : has 
OrderStatus <-- Order : has

1) 강한 결합으로 Order가 사라지면 OrderItem은 독립적인 의미가 소멸하게 때문에 OrderItem 과 Order 를 "합성" 관계로 수정했습니다.
2) VO와 Class 의 관계는 "contains", Enum과 Class 의 관계는 "uses", Order Class 와 OrderItem의 합성 관계는 "owns" 로 눈에 띄도록 수정했습니다.

수정된 클래스 다이어그램3

4. ✅ 클래스 구조가 도메인 설계를 잘 표현하고 있는가?

체크리스트 중 있었던 "도메인 설계를 잘 표현하는 클래스 구조"란 무엇일까?
perplexity 검색에 검색하니 핵심 요소들 5가지를 알려주었습니다.이를 보고 현재 반영하면 좋을 부분들을 찾다가 생략되었던 엔티티의 고유 식별자와 생성자를 추가하기로 했습니다.

  1. 엔티티(Entity)
  • 고유 식별자(ID)를 갖고 생명주기 관리
  • 도메인 규칙과 상태를 가진 핵심 객체
  1. 밸류 오브젝트(Value Object, VO)
  • 식별자가 없으며 불변의 특성을 가짐
  • 엔티티의 속성으로 포함되어 의미 부여
  1. 애그리게이트(Aggregate)
  • 하나 이상의 엔티티와 밸류 오브젝트 묶음
  • 일관성 경계(Boundary)를 정의, 외부에서 일괄 접근
  • 루트 엔티티가 존재하여 외부 참조 포인트 역할
최종 클래스 다이어그램를 완성했습니다.

5.🌟 클래스 다이어그램 학습 후기 정리

단계별 수정 과정을 통해 클래스 다이어그램의 설계를 구체화하고 객체 간 관계 표현에 대한 이해도를 심화할 수 있었습니다. 특히 클래스 다이어그램 작성 중 가장 어려움을 느꼈던 연관/집합/합성 관계간 구분과 화살표의 방향을 확인하면서 스스로 명확히 정리할수 있었습니다.

profile
be_zion

0개의 댓글