# 📖 DomainLink 개념 설명

## 🧩 **1. DomainLink란?**

**`DomainLink`**는 서로 다른 **도메인(Domain)** 간의 관계를 표현하는 개념입니다. 이 구조를 통해 도메인 간의 **유연한 연결**을 설정하고, 다양한 비즈니스 로직을 구축할 수 있습니다.

### 📋 **도메인(Domain) 정의:**

- **도메인**은 시스템 내의 **독립적인 엔티티**를 나타냅니다.
- 예시:
  - **Company** (회사)
  - **Factory** (공장)
  - **Warehouse** (창고)
  - **Store** (매장)

**`DomainLink`**는 이러한 도메인 간의 **구조적/논리적 연결**을 가능하게 합니다.

---

## 🔗 **2. DomainLink가 필요한 이유**

### ✅ **A. 비즈니스 로직 확장성**

- 복잡한 비즈니스 모델에서는 **다양한 엔티티 간의 관계**를 설정해야 합니다.
- **`DomainLink`**는 도메인 간의 **관계성**을 정의하고, 이를 기반으로 **비즈니스 로직**을 구현할 수 있게 해줍니다.

**예시:**

- **Company** → _"has"_ → **Factory**
- **O&M 회사** → _"maintains"_ → **Power Plant**
- **Franchise** → _"owns"_ → **Stores**

---

### ✅ **B. 유연한 도메인 모델링**

- 고정된 상하 관계 대신, **N:N** 및 **1:N** 등 다양한 관계를 표현할 수 있습니다.
- 새로운 관계를 손쉽게 추가할 수 있어, **확장성**이 뛰어납니다.

**예시 시나리오:**

- 하나의 **공장**이 여러 **창고**와 연결될 수 있음.
- **본사(Company)**와 **지사(Branch)** 간의 관계도 표현 가능.

---

### ✅ **C. 데이터 흐름 및 권한 관리**

- **도메인 간의 연결**을 통해 **데이터 흐름**을 설정하거나, **권한 상속**을 구현할 수 있습니다.

**예시:**

- **공장**과 연결된 **창고**에만 **재고 관리 권한**을 부여.
- **본사** → **지사**로의 **데이터 동기화** 설정.

---

## 🛠 **3. DomainLink 구조 설명**

**`DomainLink`**는 다음과 같은 기본 필드로 구성됩니다:

| 필드           | 설명                                |
| -------------- | ----------------------------------- |
| `id`           | 링크 고유 식별자                    |
| `sourceDomain` | 링크의 출발지 도메인                |
| `targetDomain` | 링크의 목적지 도메인                |
| `type`         | 링크의 유형 (`has`, `maintains` 등) |
| `createdAt`    | 생성일자                            |
| `updatedAt`    | 수정일자                            |
| `creator`      | 생성자                              |
| `updater`      | 마지막으로 수정한 사용자            |

---

### 📋 **A. Source & Target Domain**

- **`sourceDomain`**: 관계의 시작점 (ex: **Company**)
- **`targetDomain`**: 관계의 끝점 (ex: **Factory**)

이를 통해, **도메인 간의 방향성** 있는 연결을 표현할 수 있습니다.

---

### 📋 **B. Link Type**

**`type`** 필드는 **도메인 간의 관계 유형**을 나타냅니다.

- **`DomainLinkType`** Enum을 사용하여 관리합니다:

```typescript
export enum DomainLinkType {
  has = 'has',
  maintains = 'maintains',
  owns = 'owns'
}
```

**설명:**

- **`has`**: 도메인이 다른 도메인을 **소유**
  - 예: Company _has_ Factory
- **`maintains`**: 도메인이 다른 도메인을 **관리**
  - 예: O&M Company _maintains_ Power Plant
- **`owns`**: 도메인이 다른 도메인을 **소유**
  - 예: Franchise _owns_ Store

이러한 **링크 타입**을 통해 **도메인 간의 관계성**을 명확히 정의할 수 있습니다.

---

## 🔄 **4. 도메인 간 관계 예시**

### 🎯 **A. 산업 관리 시스템**

- **Company** → _"has"_ → **Factory**
- **Factory** → _"has"_ → **Warehouse**
- **O&M Company** → _"maintains"_ → **Factory**

이러한 구조를 통해 **공장 관리**, **유지보수 작업**, **재고 관리** 등을 구현할 수 있습니다.

---

### 🎯 **B. 프랜차이즈 관리 시스템**

- **Franchise HQ** → _"owns"_ → **Stores**
- **Store** → _"sells"_ → **Products**

**도메인 링크**를 통해 **프랜차이즈 본사**와 **매장** 간의 관계를 설정하고,  
매장별 **상품 목록**을 관리할 수 있습니다.

---

## 🚀 **5. DomainLink의 활용 사례**

1. **도메인 기반 권한 관리**

   - **상위 도메인**의 권한을 **하위 도메인**에 상속하거나,
   - 특정 링크 타입에 따라 **특화된 권한**을 부여할 수 있습니다.

2. **데이터 흐름 제어**

   - **링크를 기반**으로 도메인 간의 **데이터 전파**를 설정할 수 있습니다.
   - 예: **본사 → 지사**로 **재고 정보**를 동기화.

3. **비즈니스 로직 확장**
   - **도메인 간 연결**을 통해 새로운 비즈니스 로직을 유연하게 추가할 수 있습니다.
   - 예: **유지보수 이력 관리**, **물류 흐름 추적** 등.

---

## 📚 **6. 설계 철학 및 확장성**

### ✅ **A. 유연한 관계 표현**

- 도메인 간의 관계를 **고정된 트리 구조**가 아닌,  
  **그래프 기반**으로 표현할 수 있어 **확장성**이 뛰어납니다.

### ✅ **B. 단순화된 비즈니스 로직**

- **`DomainLink`**를 통해 복잡한 관계를 단순화하여 관리할 수 있습니다.
- **권한 관리**, **데이터 흐름**, **비즈니스 로직**을 하나의 연결 개념으로 통합.

### ✅ **C. 확장성 고려**

- 새로운 **링크 타입**을 추가하여,  
  기존 시스템에 영향을 주지 않고 **비즈니스 로직**을 확장할 수 있습니다.

---

## 🎯 **7. 결론**

- **`DomainLink`**는 **도메인 간의 관계**를 유연하고 직관적으로 표현할 수 있는 강력한 도구입니다.
- 다양한 **비즈니스 모델**과 **데이터 흐름**을 지원하며,  
  확장성과 유지보수성을 고려한 설계를 제공합니다.

🚀 **DomainLink**를 활용해 복잡한 도메인 관계를 쉽게 관리하세요! 🔗✨

---
