본문으로 건너뛰기

User 도메인 이벤트 스토밍

개요

본 문서는 User 도메인의 이벤트 스토밍 워크샵 결과를 정리한 것입니다. 사용자 계정, 프로필, 상태, 역할, 주기, 개인정보 등과 관련된 도메인 이벤트, 명령, 액터, 정책 등을 포함합니다.

바운디드 컨텍스트 참조

  • User 도메인은 사용자 정보의 마스터 역할을 수행하며 여러 다른 도메인과 상호작용합니다.
  • Auth 도메인: 사용자 인증, 비밀번호/이메일 변경, 동의 관리 등에서 User 정보 참조 및 상태 변경 트리거 (예: 계정 잠금).
  • Access Code 도메인: 회원 가입 시 Access Code 검증을 위해 User 도메인과 협력.
  • IAM 도메인: 사용자의 그룹(Group), 플랜(Plan), 역할(Role) 할당 정보를 User 도메인이 관리하며, IAM은 이를 기반으로 최종 권한을 평가합니다.
  • Sleep/Learning 도메인: 사용자 식별 및 사용자 주기(UserCycle) 정보 연동.
  • Audit 도메인: 사용자 정보 변경 및 개인정보 관련 활동 로깅.
  • 상세한 컨텍스트 매핑은 각 도메인의 bounded-context.md 또는 requirements.md 문서를 참조하세요.

도메인 이벤트

도메인에서 발생하는 중요한 변화나 사실을 나타내는 이벤트들입니다.

1. 사용자 계정 및 프로필 이벤트

이벤트설명트리거
UserCreated새 사용자 계정이 생성되었음 (PENDING 상태)CreateUser (Auth 도메인의 EmailVerificationCompleted 이후)
GuestAccountOnboarded게스트 계정이 약관 동의만으로 생성되었음RecordGuestOnboarding (auth.guest.onboarded 이벤트 수신)
GuestAccountUpgradeInitiated게스트 Step-up 인증이 시작되었음ProcessStepUpLinkInitialized (auth.guest.link.init)
GuestAccountUpgraded게스트 계정이 정규 사용자로 승격되었음ProcessStepUpCompleted (auth.identity-level.changed)
GuestAccountExpired게스트 계정이 만료되어 제한이 적용되었음HandleGuestExpiry (TimeMachine 만료 트리거)
GuestAccountCleaned만료된 게스트 계정이 삭제/익명화로 정리되었음CleanupExpiredGuest (스케줄러 또는 관리자 조치)
UserActivated사용자 계정이 활성화되었음 (ACTIVE 상태)ActivateUser (이메일 인증 완료 등)
UserProfileUpdated사용자 프로필 정보(이름, 언어, 타임존 등)가 업데이트되었음UpdateUserProfile
UserNameUpdated사용자 이름이 업데이트되었음 (UserProfileUpdated의 구체화)UpdateUserProfile (이름 변경 시)
UserLanguagePreferenceUpdated사용자 선호 언어가 업데이트되었음 (UserProfileUpdated의 구체화)UpdateUserProfile (언어 변경 시)
UserTimezoneUpdated사용자 타임존이 업데이트되었음 (UserProfileUpdated의 구체화)UpdateUserProfile (타임존 변경 시)
UserDeactivationRequested사용자가 계정 비활성화를 요청했음RequestUserDeactivation
UserDeactivated사용자 계정이 비활성화되었음 (INACTIVE 상태)ProcessUserDeactivation (요청 처리 후)
UserReactivated비활성화된 사용자 계정이 재활성화되었음 (ACTIVE 상태 복귀)ReactivateUser (관리자 또는 시스템 정책)
UserDeletionScheduled비활성화된 사용자의 데이터 삭제 또는 익명화가 예약되었음비활성화 후 일정 기간 경과 (시스템 정책) 또는 게스트 만료 정리
UserDeleted사용자 데이터가 영구 삭제되었음DeleteScheduledUser (스케줄된 작업 실행)
UserAnonymized사용자 개인 식별 정보가 익명화되었음AnonymizeScheduledUser (스케줄된 작업 실행, 삭제 대신 익명화 선택 시)
UserAnonymizationInitiated사용자 데이터 익명화 프로세스가 시작되었음InitiateUserAnonymization (관리자 또는 시스템 정책)
UserAnonymizationCompleted사용자 데이터 익명화 프로세스가 완료되었음AnonymizeUser 명령 처리 완료
UserDeletionProcessInitiated사용자 데이터 삭제 프로세스가 시작되었음InitiateUserDeletionProcess (관리자 또는 시스템 정책)
UserDeletionProcessCompleted사용자 데이터 삭제 프로세스가 완료되었음DeleteUser 명령 처리 완료
UserDeletionProcessFailed사용자 데이터 삭제 프로세스 중 오류가 발생했음DeleteUser 명령 처리 중 예외 발생
UserDeletionProcessRetryRequested실패한 삭제 프로세스 재시도 요청이 발생했음RequestRetryFailedDeletionProcess (관리자)
DomainDeletionStatusChanged특정 도메인의 삭제 상태가 변경되었음각 도메인별 삭제 처리 진행 중 상태 변경
UserLocked사용자 계정이 일시 잠금되었음 (LOCKED 상태)Auth 도메인의 LockAccount 명령 또는 시스템 정책 (연속 로그인 실패 등)
UserUnlocked잠긴 사용자 계정이 해제되었음 (이전 상태 복귀)Auth 도메인의 UnlockAccount 명령 또는 시간 만료
UserSuspended사용자 계정이 이용 정지되었음 (SUSPENDED 상태)SuspendUser (관리자 조치)
UserUnsuspended정지된 사용자 계정이 해제되었음 (ACTIVE 상태 복귀)UnsuspendUser (관리자 조치 또는 기간 만료)
UserBanned사용자 계정이 영구 정지되었음 (BANNED 상태)BanUser (관리자 조치)
UserTypeAssigned사용자 유형(USER)이 지정되었음 (생성 시)CreateUser
UserAssignedToGroup사용자가 그룹에 할당되었음 (IAM 도메인 연관)AssignUserToGroup (IAM에서 처리 후 User에 반영)
UserRemovedFromGroup사용자가 그룹에서 제거되었음 (IAM 도메인 연관)RemoveUserFromGroup (IAM에서 처리 후 User에 반영)
UserLinkedToPlan사용자가 플랜에 연결되었음 (IAM 도메인 연관)LinkUserToPlan (IAM에서 처리 후 User에 반영)
UserUnlinkedFromPlan사용자의 플랜 연결이 해제되었음 (IAM 도메인 연관)UnlinkUserFromPlan (IAM에서 처리 후 User에 반영)
UserDataDeletionRequested사용자 데이터 삭제 요청이 접수되었음 (GDPR)RequestUserDataDeletion
UserDataAccessRequested사용자 데이터 접근 요청이 접수되었음 (GDPR)RequestUserDataAccess

2. 사용자 주기 이벤트 (Sleep 도메인 연관)

이벤트설명트리거
UserCycleStarted사용자 주기가 시작되었음StartUserCycle
UserCycleUpdated사용자 주기 정보가 업데이트되었음UpdateUserCycle
UserCycleCompleted사용자 주기가 완료되었음CompleteUserCycle
UserCycleCancelled사용자 주기가 취소되었음CancelUserCycle

정책(Policies)

시스템의 자동화된 비즈니스 규칙입니다.

사용자 계정 정책

  • 신규 계정 생성 시 기본 상태는 PENDING.
  • 이메일 인증 완료 시 ACTIVE 상태로 변경.
  • 모바일 가입 시 Access Code 검증 필수 (Access Code 도메인 협력).
  • 모든 사용자는 최소 1개 이상의 Group에 속해야 함 (IAM 도메인 검증).
  • USER 타입 사용자는 반드시 Plan에 연결되어야 함 (IAM 도메인 검증).
  • 연속 로그인 실패 시 계정 LOCKED 상태 자동 변경 (Auth 도메인 트리거).
  • INACTIVE 상태 전환 후 일정 기간(예: 30일) 경과 시 데이터 삭제/익명화 처리 예약.
  • 계정 상태 변경 시 이력 자동 기록 ([Audit 도메인] 연동).

사용자 프로필 정책

  • 이름 필드는 필수.
  • 선호 언어, 타임존 기본값 설정.
  • 프로필 정보 변경 시 유효성 검사 (필요시).

개인정보 보호 정책 (GDPR 등)

  • 데이터 접근/삭제 요청 처리 프로세스 정의.
  • 개인 식별 정보(PII) 암호화 저장 규칙.
  • 데이터 처리 활동 로깅 규칙 ([Audit 도메인] 연동).
  • 비활성화된 계정 데이터 보존 기간 및 삭제/익명화 정책.
  • 도메인별 데이터 삭제 프로세스 조율 규칙:
    • 삭제 초기화는 User 도메인 책임.
    • 각 도메인은 자체 데이터 익명화/삭제 처리 구현 책임.
    • 삭제 상태 트래킹 메커니즘으로 전체 프로세스 감시.
  • 익명화 처리 규칙:
    • 특정 PII 필드(이메일, 이름 등) 익명화 처리 방법.
    • 익명화 식별자(anonymizationId) 사용으로 도메인 간 일관성 유지.
    • 익명화된 사용자의 로그인 및 데이터 접근 제한 정책.
    • 데이터 보존 종료일(dataRetentionEndDate) 설정 및 관리 정책.

사용자 계정 유형 정책

  • User 도메인은 일반 사용자 계정(USER 타입)만 관리.
  • Service Account 정책: Service Account 관련 정책은 IAM 도메인에서 정의 및 관리.

명령(Commands)

도메인 이벤트를 발생시키는 사용자 의도나 시스템 동작입니다.

1. 사용자 계정 및 프로필 명령

명령설명영향
CreateUser새 사용자 계정 생성 요청 (Access Code, 이메일 등 필요)UserCreated 이벤트 (Auth/AccessCode 검증 후)
ActivateUser사용자 계정 활성화 처리UserActivated 이벤트
GetUserInfo사용자 정보 조회사용자 정보 반환
UpdateUserProfile사용자 프로필 정보(이름, 언어, 타임존 등) 업데이트UserProfileUpdated (및 구체적 이벤트) 발생
RequestUserDeactivation사용자 계정 비활성화 요청UserDeactivationRequested 이벤트 발생
ProcessUserDeactivation비활성화 요청 처리UserDeactivated 이벤트 발생
ReactivateUser비활성화된 계정 재활성화 (관리자)UserReactivated 이벤트 발생
ScheduleUserDeletion비활성화된 사용자 데이터 삭제/익명화 예약 (시스템)UserDeletionScheduled 이벤트 발생
DeleteScheduledUser예약된 사용자 데이터 삭제 실행 (시스템)UserDeleted 이벤트 발생
AnonymizeScheduledUser예약된 사용자 데이터 익명화 실행 (시스템)UserAnonymized 이벤트 발생
InitiateUserAnonymization사용자 데이터 익명화 프로세스 시작 (관리자/시스템)UserAnonymizationInitiated 이벤트 발생
AnonymizeUser사용자 데이터 익명화 실행 (익명화 프로세스의 일부)UserAnonymizationCompleted 이벤트 발생
InitiateUserDeletionProcess사용자 데이터 삭제 프로세스 시작 (관리자/시스템)UserDeletionProcessInitiated 이벤트 발생
DeleteUser사용자 데이터 삭제 실행 (삭제 프로세스의 일부)UserDeletionProcessCompleted/UserDeletionProcessFailed 이벤트 발생
RequestRetryFailedDeletionProcess실패한 삭제 프로세스 재시도 요청 (관리자)UserDeletionProcessRetryRequested 이벤트 발생
GetUserDeletionProcessInfo사용자 데이터 삭제 프로세스 정보 조회 (관리자)삭제 프로세스 정보 반환
GetUserAnonymizationRecords사용자 데이터 익명화 기록 조회 (관리자)익명화 기록 정보 반환
LockUser사용자 계정 잠금 (Auth 도메인 또는 관리자)UserLocked 이벤트 발생
UnlockUser사용자 계정 잠금 해제 (Auth 도메인 또는 관리자)UserUnlocked 이벤트 발생
SuspendUser사용자 계정 이용 정지 (관리자)UserSuspended 이벤트 발생
UnsuspendUser사용자 계정 정지 해제 (관리자)UserUnsuspended 이벤트 발생
BanUser사용자 계정 영구 정지 (관리자)UserBanned 이벤트 발생

| AssignUserToGroup | 사용자에게 그룹 할당 (IAM 도메인 주도) | UserAssignedToGroup 이벤트 발생 (User 도메인 반영) | | RemoveUserFromGroup | 사용자 그룹 할당 해제 (IAM 도메인 주도)| UserRemovedFromGroup 이벤트 발생 (User 도메인 반영) | | LinkUserToPlan | 사용자에게 플랜 연결 (IAM 도메인 주도) | UserLinkedToPlan 이벤트 발생 (User 도메인 반영) | | UnlinkUserFromPlan | 사용자 플랜 연결 해제 (IAM 도메인 주도)| UserUnlinkedFromPlan 이벤트 발생 (User 도메인 반영) | | RequestUserDataDeletion | 사용자 데이터 삭제 요청 접수 | UserDataDeletionRequested 이벤트 발생, 비활성화 플로우 트리거 가능 | | RequestUserDataAccess | 사용자 데이터 접근 요청 접수 | UserDataAccessRequested 이벤트 발생, 데이터 제공 프로세스 시작 | | ProcessAuthIdentityLevelChanged | Auth에서 identityLevel 변경 이벤트 처리 | GuestAccountUpgraded 또는 GuestAccountExpired 이벤트 발생 | | ScheduleGuestExpiry | 게스트 만료 타이머 예약 | GuestAccountLifecycle 기록, TimeMachine 스케줄 생성 | | CancelGuestExpirySchedule | Step-up 등으로 게스트 만료 타이머 해제 | GuestAccountLifecycle 업데이트, TimeMachine 스케줄 제거 |

2. 사용자 주기 명령 (Sleep 도메인 연관)

명령설명영향
StartUserCycle사용자 주기 시작UserCycleStarted 이벤트 발생
UpdateUserCycle사용자 주기 정보 업데이트UserCycleUpdated 이벤트 발생
CompleteUserCycle사용자 주기 완료 처리UserCycleCompleted 이벤트 발생
CancelUserCycle사용자 주기 취소 처리UserCycleCancelled 이벤트 발생

3. 게스트 계정 명령 (Auth 연동)

명령설명영향
RecordGuestOnboarding게스트 온보딩 결과 기록 및 기본 그룹/플랜 설정GuestAccountOnboarded 이벤트 발생
ProcessStepUpLinkInitializedStep-up 인증 세션 시작 처리GuestAccountUpgradeInitiated 이벤트 발생
ProcessStepUpCompletedStep-up 완료 처리 및 계정 타입/플랜 전환GuestAccountUpgraded 이벤트 발생
HandleGuestExpiry게스트 만료 타이머 실행 및 후속 조치GuestAccountExpired, UserDeletionScheduled 이벤트 발생
CleanupExpiredGuest만료된 게스트 계정 정리 (삭제/익명화)GuestAccountCleaned 이벤트 발생
CancelGuestExpiryScheduleStep-up 완료 등으로 만료 타이머 해제GuestAccountLifecycle 업데이트, 타이머 제거

액터(Actors)

시스템과 상호작용하는 주체들입니다.

내부 액터

액터설명주요 명령
일반 사용자 (USER)모바일 앱 등 서비스 이용자UpdateUserProfile, RequestUserDeactivation, RequestUserDataDeletion, RequestUserDataAccess
시스템 관리자 (Admin)시스템 운영 및 사용자 관리자ReactivateUser, LockUser, UnlockUser, SuspendUser, UnsuspendUser, BanUser, CleanupExpiredGuest
고객 지원 담당자사용자 지원 및 문제 해결 담당자GetUserInfo (제한적), 사용자 상태 변경 요청 등
시스템 (System)자동화된 프로세스 실행 주체ScheduleUserDeletion, DeleteScheduledUser, AnonymizeScheduledUser

외부 시스템/도메인 액터

액터설명주요 상호작용
Auth 도메인인증/인가 및 관련 기능 담당LockUser/UnlockUser 트리거, 사용자 상태 조회, 이메일/비밀번호 변경 처리, Step-up 이벤트 발행
TimeMachine 도메인시간 제어 및 예약 처리게스트 만료 타이머 실행, 서비스 기간 계산
IAM 도메인역할/권한/그룹/플랜 관리 담당AssignUserToGroup/RemoveUserFromGroup, LinkUserToPlan/UnlinkUserFromPlan 처리 후 User 반영
Access Code 도메인Access Code 검증 담당회원 가입 시 User 생성 전 검증 요청
Sleep 도메인수면 관련 주기 및 데이터 관리Start/Update/Complete/CancelUserCycle 명령 수신 및 처리, User 정보 조회
Audit 도메인감사 로그 기록User 도메인의 주요 변경 이벤트 수신 및 로깅

집계(Aggregates)

연관된 엔티티와 값 객체들의 클러스터입니다.

User 집계

  • 루트: User
  • 엔티티:
    • UserProfile (이름, 언어, 타임존 등)
    • UserStatusHistory (상태 변경 이력)
    • UserSuspensionHistory (치료 활동 일시 정지 이력)
    • UserCycle (사용자 주기 정보)
    • UserDeletionProcess (사용자 데이터 삭제 프로세스)
    • AnonymizationRecord (사용자 데이터 익명화 기록)
    • (필요시) UserCycleLink (Sleep 도메인 UserCycle ID 참조)
  • 값 객체:
    • UserId (UUID)
    • Email (Auth 도메인 소유, User는 참조)
    • UserName
    • LanguagePreference (Enum: 'ko', 'en', 'de')
    • Timezone (String, e.g., 'Asia/Seoul')
    • UserStatus (Enum: ACTIVE, INACTIVE, LOCKED, PENDING, SUSPENDED, BANNED)
    • UserType (Enum: USER)
    • UserGroup (List of Group IDs, IAM 도메인 참조)
    • PlanAssignment (Plan ID, IAM 도메인 참조)
    • Timestamp (createdAt, updatedAt, deletedAt 등)
    • DeletionType (Enum: SOFT_DELETE, ANONYMIZE, HARD_DELETE)
    • DeletionStatus (Enum: PENDING, IN_PROGRESS, COMPLETED, FAILED, PARTIALLY_COMPLETED)
    • AnonymizationId (익명화 식별자)
  • 불변식:
    • 모든 사용자는 고유한 UserId를 가짐.

    • Email은 Auth 도메인과 일관성을 유지해야 함 (Eventual Consistency).

    • UserStatus 전이 규칙 준수 (예: PENDING -> ACTIVE, ACTIVE -> INACTIVE/SUSPENDED/BANNED/LOCKED).

    • USER 타입은 반드시 하나 이상의 Group에 속해야 함.

    • USER 타입은 반드시 Plan에 연결되어야 함.

    • AccountTypeGUEST 또는 REGISTERED이며, Step-up 완료 시 후자로 전환되어야 함.

    • GUEST 계정은 guestExpiresAt 타이머가 설정되어야 하며, 승격 시 해제되어야 함.

    • INACTIVE 상태가 아닌 사용자는 삭제될 수 없음.

    • 익명화된 사용자(isAnonymized = true)는 계정 복구가 불가능함.

    • 익명화된 사용자는 새로운 익명화 프로세스를 시작할 수 없음.

    • 삭제 프로세스가 진행 중인 사용자는 다른 삭제 프로세스를 시작할 수 없음.

(UserCycle 집계는 Sleep 도메인 소유)

핫스팟 및 해결책

(기존 내용 유지 또는 User 도메인 특화 내용으로 보강)

1. 개인정보보호 규정 준수 (GDPR 등)

문제: 복잡한 규정 준수 요구사항 (데이터 접근, 수정, 삭제/익명화, 처리 로그) 해결책:

  • 명확한 데이터 처리 정책 및 사용자 동의 관리 (Auth 도메인 협력).
  • 데이터 접근/삭제 요청 처리 자동화 방안 검토.
  • PII 암호화 및 접근 제어 강화.
  • Audit 도메인 연동을 통한 상세 로깅.

2. 사용자 데이터 동기화 (특히 IAM, Auth)

문제: 여러 도메인에 걸친 사용자 정보 일관성 유지 (예: User 상태 변경 시 Auth/IAM 반영) 해결책:

  • 이벤트 기반 아키텍처 활용 (예: UserStatusChanged 이벤트 발행).
  • 각 도메인 간 책임 명확화 및 API 계약 정의.
  • Saga 패턴 등 분산 트랜잭션 관리 기법 고려 (필요시).

3. 대규모 사용자 관리 성능

문제: 사용자 수 증가에 따른 조회/수정 성능 저하. 해결책:

  • 데이터베이스 인덱싱 최적화 (상태, 유형, 그룹 등).
  • 사용자 검색/필터링 기능 최적화.
  • 자주 조회되는 정보(예: 사용자 기본 정보) 캐싱 전략 도입.
  • 필요시 데이터베이스 샤딩 또는 Read Replica 구성 검토.

4. 역할/권한 관리 복잡성

문제: User 도메인이 IAM 도메인과 연동하여 역할/그룹/플랜 정보를 관리해야 함. 해결책:

  • User 도메인은 IAM 엔티티 ID 참조 및 기본 연결 정보만 관리.
  • 실제 권한 평가 로직은 IAM 도메인에 완전히 위임.
  • 도메인 간 API 호출 최소화 및 비동기 이벤트 기반 연동 고려.

변경 이력

버전날짜작성자변경 내용
0.1.02025-04-18bok@weltcorp.com최초 작성
0.2.02025-05-08bok@weltcorp.com사용자 데이터 삭제 및 익명화 관련 이벤트, 명령, 정책, 집계 정보 추가
0.3.02025-06-14bok@weltcorp.comService Account 관련 이벤트, 명령, 정책, 집계 정보를 IAM 도메인으로 이관
0.4.02025-10-27bok@weltcorp.com게스트 계정 온보딩/승격/만료 이벤트와 Step-up 명령, TimeMachine 연동 내용 추가