Files
BaronSSO/baron-sso/docs/organization-chart-policy.md

6.4 KiB

조직도 기반 테넌트 및 권한 매핑 정책 (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 테이블에 저장되며 typeparent_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) 다이어그램입니다.

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에 부여합니다.

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