# 조직도 기반 테넌트 및 권한 매핑 정책 (Organization Chart Policy)

이 문서는 실무 부서 및 직급 체계가 포함된 인사(HR) 데이터를 기반으로, Baron SSO의 다형성 테넌트(Polymorphic Tenant)와 Ory Keto 기반의 ReBAC 권한 모델을 어떻게 구축하고 동기화할 것인지에 대한 아키텍처 설계와 가이드라인을 정의합니다.

## 1. 개요 및 요구사항 분석

제공된 인사 데이터(샘플)는 다음과 같은 특징을 가집니다.

| 연번 | 그룹 | 디비젼 | 팀 | 셀 | 직급 | 이름 | 직무 | 구분 | 소속 |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 사장단 | - | - | - | 사장 | 정태원 | 사장단 | 센터장 | 한맥 |
| 4 | 엔지니어링 기획 | - | - | - | 부사장 | 양병홍 | 엔지니어 | 그룹장 | 삼안 |
| 5 | 엔지니어링 기획 | 일반구조물 | - | - | 수석 | 이동원 | 엔지니어 | 디비젼장 | 삼안 |
| 6 | 엔지니어링 기획 | 일반구조물 | 구조물계획 | - | 수석 | 김일태 | 엔지니어 | 팀장 | 삼안 |
| 7 | 엔지니어링 기획 | 일반구조물 | 구조물계획 | - | 수석 | 곽현석 | 엔지니어 | 팀원 | 한맥 |

### 🔍 주요 분석 포인트 (Matrix Organization)
가장 중요한 점은 6번(삼안 소속)과 7번(한맥 소속)이 **서로 다른 법인 소속임에도 불구하고 "엔지니어링 기획그룹 > 일반구조물 디비젼 > 구조물계획 팀" 이라는 동일한 논리적 부서에 속해 있다**는 것입니다.
이는 개별 법인(COMPANY) 산하에 부서가 종속되는 Tree 구조가 아니라, 지주사(COMPANY_GROUP) 차원에서 부서를 관리하고 법인 소속은 개인의 속성(Attribute)으로 분리해야 함을 의미합니다.

---

## 2. 아키텍처 매핑 전략 (Data to DB)

엑셀의 각 컬럼은 데이터베이스 모델과 다음과 같이 1:1로 매핑됩니다.

### 2.1 조직 (Tenant) 매핑
모든 조직 단위는 `Tenant` 테이블에 저장되며 `type`과 `parent_id`로 계층을 구성합니다.

*   **소속 (한맥, 삼안):** `Tenant` (Type: `COMPANY`) - 법인 격리 공간
*   **그룹 / 디비젼 / 팀 / 셀:** `Tenant` (Type: `USER_GROUP`) - 논리적 사내 조직
*   **계층 연결:** 하위 조직(팀)의 `parent_id`는 상위 조직(디비젼)의 `id`를 참조합니다.

### 2.2 사용자 (User) 속성 매핑
*   **이름:** `User.Name`
*   **직급 (사장, 부사장, 수석 등):** `User.Position`
*   **직무 (엔지니어, 기획자 등):** `User.JobTitle`
*   **소속 (법인 코드):** `User.CompanyCode` (`hanmac`, `saman` 등)
*   **식별자:** (엑셀에 누락됨) 시스템 로그인을 위해 반드시 **이메일(Email) 또는 사번(LoginID)** 컬럼이 추가되어야 합니다.

### 2.3 권한 및 역할 (Keto ReBAC) 매핑
엑셀의 **구분(센터장, 그룹장, 디비젼장, 팀장, 팀원)** 컬럼은 해당 사용자가 조직 내에서 어떤 권한을 가지는지(Ory Keto의 Relation)를 결정합니다.

*   **리더 (장급):** 해당 조직 테넌트의 `owners` 또는 `admins` 튜플 부여.
    *   *예:* 양병홍 부사장은 `엔지니어링 기획그룹`의 `owners`가 됩니다.
*   **팀원:** 가장 말단 조직 테넌트의 `members` 튜플 부여.
    *   *예:* 곽현석 수석은 `구조물계획 팀`의 `members`가 됩니다.

---

## 3. 다이어그램: 통합 조직도 계층 설계

아래는 위 전략을 바탕으로 구성된 지주사 통합 조직도와 권한 상속(Keto OPL) 다이어그램입니다.

```mermaid
graph TD
    %% 지주사 및 법인
    G[지주사<br>Type: COMPANY_GROUP] --> C1[한맥<br>Type: COMPANY]
    G --> C2[삼안<br>Type: COMPANY]

    %% 통합 조직도 (지주사 직속 논리적 연결)
    G -.-> T1[전략기획그룹<br>Type: USER_GROUP]
    G -.-> T2[엔지니어링 기획그룹<br>Type: USER_GROUP]
    
    T2 --> T2_1[일반구조물 디비젼<br>Type: USER_GROUP]
    T2_1 --> T2_1_1[구조물계획 팀<br>Type: USER_GROUP]

    %% 유저 권한 매핑 (Keto Tuples)
    U2([양병홍 / 삼안]) -. owners (그룹장) .-> T2
    U3([이동원 / 삼안]) -. owners (디비젼장) .-> T2_1
    U4([김일태 / 삼안]) -. owners (팀장) .-> T2_1_1
    U5([곽현석 / 한맥]) -. members (팀원) .-> T2_1_1

    %% Keto OPL 상속 (부모의 권한이 자식으로 흐름)
    T2 -. 부모/자식 상속 .-> T2_1
    T2_1 -. 부모/자식 상속 .-> T2_1_1
    
    %% 결과적인 권한 도달
    U2 -. 자동 상속 (Read/Write) .-> T2_1_1

    %% 스타일
    classDef company fill:#e3f2fd,stroke:#0277bd,stroke-width:2px;
    classDef group fill:#fff3e0,stroke:#e65100,stroke-width:2px;
    classDef user fill:#f3e5f5,stroke:#4a148c,stroke-width:1px;
    
    class G,C1,C2 company;
    class T1,T2,T2_1,T2_1_1 group;
    class U2,U3,U4,U5 user;
```

### 💡 ReBAC 상속의 이점 (OPL)
위 다이어그램에서 **양병홍 부사장(그룹장)**은 최상위 조직인 `엔지니어링 기획그룹`의 `owners`로 한 번만 매핑됩니다.
하지만 Keto의 `parents` 상속 설계 덕분에, 하위의 `일반구조물 디비젼`과 `구조물계획 팀`, 그리고 향후 생겨날 모든 하위 '셀' 단위까지 **자동으로 관리 권한(Read/Write)을 상속**받게 됩니다. 권한 부여 작업을 1회로 최소화할 수 있습니다.

---

## 4. 구축 파이프라인 (Bulk Import) 가이드

수백, 수천 명의 조직도를 수동으로 입력하는 것은 불가능하므로, 시스템은 **CSV 일괄 등록(Bulk Import)** API를 제공해야 합니다.

1. **데이터 준비:** 엑셀 데이터를 CSV로 변환합니다. (반드시 이메일 또는 사번 컬럼 포함)
2. **조직(Tenant) 순차 생성 (Upsert):**
   *   스크립트는 CSV의 그룹 ➔ 디비젼 ➔ 팀 ➔ 셀 순서로 읽으며, 없는 조직은 생성하고 상위 조직의 ID를 `parent_id`로 연결합니다.
   *   생성 시 백엔드 `TenantService`는 자동으로 Keto에 `parents` 튜플을 동기화합니다.
3. **사용자(User) 계정 생성:**
   *   Ory Kratos에 계정을 생성하고(`POST /identities`), 로컬 DB `users` 테이블에 직급, 직무 등의 메타데이터를 저장합니다.
4. **멤버십(Keto 튜플) 매핑:**
   *   사용자가 속한 **가장 깊은(Deepest) 말단 조직 단위 하나**를 찾습니다.
   *   직책(장급/일반)에 따라 `owners` 또는 `members` 권한을 Keto에 부여합니다.

이 정책을 통해 복잡한 매트릭스 조직과 권한 체계를 단일 아키텍처로 우아하게 통합할 수 있습니다.
