MAKITTDocs

Organization

docs/domain/organization.md

Organization

개요

조직(Organization) 생성, 멤버 관리, 물류(ARGO) 연동을 관리하는 도메인. Seller가 Shop을 운영하기 위한 상위 단위이며, 멤버 초대/역할 관리와 ARGO 물류 시스템 통합을 담당한다.

서버 패키지: com.makitt.core.domain.organization


DynamoDB Entity

Organization

Organization의 메타데이터 엔티티.

키 구조:

패턴예시
PKORGANIZATION#{organizationId}ORGANIZATION#abc123
SKMETADATAMETADATA

필드:

필드DynamoDB Attribute타입필수설명
pkPKStringOPartition Key
skSKStringOSort Key
entityTypeentity_typeStringO"ORGANIZATION" 고정
organizationIdorganization_idStringO조직 고유 ID (UUID)
namenameStringO조직명
descriptiondescriptionStringX조직 설명
logoUrllogo_urlStringX로고 URL
ownerIdowner_idStringO생성자 User ID
integrationInfointegration_infoIntegrationInfoOARGO 연동 정보 (nested)
businessInfobusiness_infoBusinessInfoX사업자 정보 (nested)
createdAtcreated_atInstantO생성 시각
updatedAtupdated_atInstantO수정 시각

Factory Methods:

  • Organization.create(organizationId, name, description, ownerId) — 조직 생성, integrationInfo 초기화 (NONE)

Business Methods:

  • updateInfo(name, description, logoUrl) — 기본 정보 수정
  • activateLogistics(vendorId, argoLoginId, businessInfo) — ARGO 물류 활성화
  • hasActiveLogistics() — ARGO 연동 활성화 여부
  • suspendLogistics() — ARGO 일시 중지
  • deactivateLogistics() — ARGO 연동 해제 (모든 연동 데이터 초기화)

Nested Objects

IntegrationInfo

ARGO 물류 시스템 연동 상태 정보.

필드DynamoDB Attribute타입설명
vendorIdvendor_idLongARGO Vendor ID
vendorStatusvendor_statusVendorStatus연동 상태
argoLoginIdargo_login_idStringARGO 공유 로그인 ID (예: org_xxx@makitt.argo)

Methods:

  • IntegrationInfo.initial() — vendorStatus=NONE 으로 초기화
  • activateArgo(vendorId, argoLoginId) — 연동 활성화 (status=ACTIVE)
  • hasActiveArgo() — status==ACTIVE && vendorId!=null
  • suspendArgo() — 일시 중지 (status=SUSPENDED)
  • deactivateArgo() — 연동 해제 (모든 필드 초기화, status=NONE)

BusinessInfo

사업자 등록 정보. 물류 연동 시 필요.

필드DynamoDB Attribute타입설명
businessNumberbusiness_numberString사업자등록번호
businessNamebusiness_nameString상호명
representativerepresentativeString대표자명
addressaddressString사업장 주소
addressDetailaddress_detailString상세주소
postalCodepostal_codeString우편번호
managerNamemanager_nameString담당자명
managerPhonemanager_phoneString담당자 연락처
managerEmailmanager_emailString담당자 이메일

OrganizationMember

조직-사용자 간 멤버십 엔티티. 역할 기반 접근 제어 및 초대 관리.

키 구조:

패턴예시
PKORGANIZATION#{organizationId}ORGANIZATION#abc123
SKMEMBER#{userId}MEMBER#user456

필드:

필드DynamoDB Attribute타입필수설명
pkPKStringOPartition Key
skSKStringOSort Key
entityTypeentity_typeStringO"ORGANIZATION_MEMBER" 고정
organizationIdorganization_idStringO조직 ID
userIduser_idStringO사용자 ID
roleroleOrganizationRoleO멤버 역할
statusstatusMemberStatusO멤버 상태
invitedByinvited_byStringX초대한 사용자 ID
invitedAtinvited_atInstantX초대 시각
joinedAtjoined_atInstantX참여 시각
createdAtcreated_atInstantO생성 시각
updatedAtupdated_atInstantO수정 시각

Factory Methods:

  • createOwner(organizationId, userId) — OWNER 역할, ACTIVE 상태
  • createInvited(organizationId, userId, role, invitedBy) — INVITED 상태

Business Methods:

  • acceptInvitation() — INVITED → ACTIVE 전환, joinedAt 설정
  • updateRole(newRole) — 역할 변경
  • deactivate() — INACTIVE 전환

ArgoVendorMapping

ARGO vendorId → MAKITT organizationId 역방향 매핑. Kafka Consumer에서 ARGO 이벤트를 MAKITT 조직으로 라우팅할 때 사용.

키 구조:

패턴예시
PKARGO_VENDOR#{vendorId}ARGO_VENDOR#12345
SKMAPPINGMAPPING

필드:

필드DynamoDB Attribute타입필수설명
vendorIdvendor_idLongOARGO Vendor ID
organizationIdorganization_idStringOMAKITT 조직 ID
createdAtcreated_atInstantO생성 시각

Enums

OrganizationRole

멤버 역할. ordinal 기반 권한 계층 (OWNER > ADMIN > MEMBER).

설명
OWNER조직 소유자 (모든 권한)
ADMIN관리자 (멤버/Shop 관리)
MEMBER일반 멤버 (제한된 접근)

MemberStatus

멤버 상태.

설명
ACTIVE활성 멤버
INVITED초대됨 (수락 대기)
INACTIVE비활성 (탈퇴/제거)

VendorStatus

ARGO 물류 연동 상태.

설명
NONE물류 서비스 미연동
PENDING물류 서비스 연동 중
ACTIVE물류 서비스 활성화
SUSPENDED물류 서비스 일시 중지

VendorType

사업자 유형. 물류 활성화 시 사용.

설명businessInfo 필수
INDIVIDUAL개인X
SOLE_PROPRIETOR개인사업자O
CORPORATION법인사업자O

GSI (Global Secondary Index)

GSIPK 패턴SK 패턴용도
EntityLookupIndexUSER#{userId}ORGANIZATION#{organizationId}사용자별 조직 목록 조회

OrganizationMember의 gsi1_pk, gsi1_sk 필드로 구성. KEYS_ONLY 프로젝션 후 BatchGetItem으로 전체 데이터 조회.


Key Builder

OrganizationKey

클래스: com.makitt.core.common.dynamodb.key.OrganizationKey

OrganizationKey.pk(organizationId)          → "ORGANIZATION#{organizationId}"
OrganizationKey.sk()                        → "METADATA"
OrganizationKey.extractOrganizationId(pk)   → organizationId (PK에서 추출)

OrganizationMemberKey

클래스: com.makitt.core.common.dynamodb.key.OrganizationMemberKey

// Primary Keys
OrganizationMemberKey.pk(organizationId)             → "ORGANIZATION#{organizationId}"
OrganizationMemberKey.sk(userId)                     → "MEMBER#{userId}"
OrganizationMemberKey.skPrefix()                     → "MEMBER#" (begins-with 쿼리용)

// GSI1: EntityLookupIndex
OrganizationMemberKey.gsi1Pk(userId)                 → "USER#{userId}"
OrganizationMemberKey.gsi1Sk(organizationId)         → "ORGANIZATION#{organizationId}"
OrganizationMemberKey.gsi1SkPrefix()                 → "ORGANIZATION#"

// Helper
OrganizationMemberKey.extractOrganizationId(pk)      → organizationId
OrganizationMemberKey.extractUserId(sk)              → userId

관련 도메인

도메인관계설명
UserN:M (via OrganizationMember)사용자는 여러 조직에 소속, 조직은 여러 멤버 보유
Shop1:N조직 하위에 여러 Shop 존재 (Shop.organizationId)
UserOnboardingtrigger조직 생성/물류 연동 시 온보딩 sub-step 완료 트리거

온보딩 연동

UserOnboardingStep.ORGANIZATION_COMPLETION의 sub-step:

Sub-Step필수트리거 시점
ORG_INFO_SETO조직 생성 시 (OrganizationApplication.createOrganization)
BUSINESS_INFO_SETO물류 활성화 시 (LogisticsApplication.activateLogistics)
LOGISTICS_CONNECTEDX물류 활성화 시 (LogisticsApplication.activateLogistics)

필수 sub-step(ORG_INFO_SET + BUSINESS_INFO_SET) 모두 완료 시 ORGANIZATION_COMPLETION 자동 완료. 이 단계는 FIRST_SHOP_CREATED의 선행 조건.