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 이벤트 발생 |
| ProcessStepUpLinkInitialized | Step-up 인증 세션 시작 처리 | GuestAccountUpgradeInitiated 이벤트 발생 |
| ProcessStepUpCompleted | Step-up 완료 처리 및 계정 타입/플랜 전환 | GuestAccountUpgraded 이벤트 발생 |
| HandleGuestExpiry | 게스트 만료 타이머 실행 및 후속 조치 | GuestAccountExpired, UserDeletionScheduled 이벤트 발생 |
| CleanupExpiredGuest | 만료된 게스트 계정 정리 (삭제/익명화) | GuestAccountCleaned 이벤트 발생 |
| CancelGuestExpirySchedule | Step-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는 참조)UserNameLanguagePreference(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에 연결되어야 함. -
AccountType은GUEST또는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.0 | 2025-04-18 | bok@weltcorp.com | 최초 작성 |
| 0.2.0 | 2025-05-08 | bok@weltcorp.com | 사용자 데이터 삭제 및 익명화 관련 이벤트, 명령, 정책, 집계 정보 추가 |
| 0.3.0 | 2025-06-14 | bok@weltcorp.com | Service Account 관련 이벤트, 명령, 정책, 집계 정보를 IAM 도메인으로 이관 |
| 0.4.0 | 2025-10-27 | bok@weltcorp.com | 게스트 계정 온보딩/승격/만료 이벤트와 Step-up 명령, TimeMachine 연동 내용 추가 |