User Management 도메인 이벤트 스토밍
개요
본 문서는 User Management 도메인의 이벤트 스토밍 워크샵 결과를 정리한 것입니다. User Management는 App-User 정보 조회 및 리포트 생성을 담당하며, 운영자와 외부 시스템이 app-user의 치료 진행 상황과 데이터를 조회할 수 있도록 지원합니다.
도메인 이벤트
도메인에서 발생하는 app-user 정보 조회 및 리포트 관련 이벤트들입니다.
1. app-user 목록 조회 이벤트
1.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|---|---|
| AppUsersQueryRequested | app-user 목록 조회 요청됨 | API 호출 |
| AccessVerified | 접근 권한 검증됨 | 권한 체크 |
| AccessDenied | 접근 권한 거부됨 | 권한 체크 실패 |
| OperationUserRetrieved | 운영자 계정 정보 조회됨 | USER 타입 인증 |
| AppUsersQueried | app-user 목록 DB 조회 실행됨 | 조회 실행 |
| LastLoginTimeRetrieved | 마지막 로그인 시간 조회됨 | app-user별 조회 |
| AppUsersFiltered | 필터 조건 적용됨 | 필터링 로직 |
| AppUsersSorted | 정렬 조건 적용됨 | 정렬 로직 |
| AppUsersRetrieved | app-user 목록 조회 완료됨 | 조회 성공 |
| InvalidSiteIdProvided | 유효하지 않은 사이트 ID 제공됨 | 검증 실패 |
2. app-user 리포트 조회 이벤트
2.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|---|---|
| AppUserReportRequested | app-user 리포트 조회 요청됨 | API 호출 |
| UserCycleRetrieved | 사용자 주기 정보 조회됨 | 리포트 생성 시작 |
| CurrentDayCalculated | 현재 일차 계산됨 | 일차 계산 로직 |
| SleepDiariesRetrieved | 수면 일기 목록 조회됨 | Sleep 도메인 조회 |
| RtibAlgorithmGoalRetrieved | 첫 번째 rTIB 알고리즘 목표 조회됨 | Sleep 도메인 조회 |
| SleepGoalsRetrieved | 수면 목표 로그 목록 조회됨 | Sleep 도메인 조회 |
| QuestionnairesRetrieved | 설문 응답 목록 조회됨 | Questionnaire 도메인 조회 |
| GoalSuccessRecordsRetrieved | 목표 성공 기록 조회됨 | Sleep 도메인 조회 |
| SuccessCountCalculated | 성공 횟수 계산됨 | LOT/AET 카운트 |
| SleepDiaryCountCalculated | 분모용 수면 일기 개수 계산됨 | 계산 로직 |
| LotConsistencyCalculated | LOT 일관성 퍼센티지 계산됨 | 퍼센티지 계산 |
| AetConsistencyCalculated | AET 일관성 퍼센티지 계산됨 | 퍼센티지 계산 |
| ReportSummaryGenerated | 리포트 요약 정보 생성됨 | 요약 데이터 집계 |
| AppUserReportGenerated | app-user 리포트 생성 완료됨 | 리포트 생성 완료 |
3. 외부 토큰 인증 이벤트
3.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|---|---|
| ExternalTokenReceived | 외부 액세스 토큰 수신됨 | API 호출 |
| TokenValidationRequested | 토큰 검증 요청됨 | 인증 프로세스 |
| TokenValidated | 토큰 검증 성공됨 | 토큰 유효성 확인 |
| TokenValidationFailed | 토큰 검증 실패됨 | 토큰 무효 |
| TokenClaimsExtracted | 토큰 클레임 추출됨 | 토큰 파싱 |
| SubjectVerified | Subject 클레임 검증됨 | userCycleId 일치 확인 |
| SubjectMismatch | Subject 클레임 불일치됨 | userCycleId 불일치 |
정책(Policies)
시스템의 자동화된 app-user 정보 조회 및 리포트 생성 규칙입니다.
app-user 목록 조회 정책
백엔드 정책
- siteId는 필수 입력 값으로 검증
- 페이징 기본값: limit=10, page=1
- 정렬 기본값: sortBy="createdAt", sortOrder="desc"
- lastLogin 정렬 시 별도 정렬 로직(searchUsersByLastLogin) 사용
- 조회 결과에 항상 totalCount와 count 포함
- Welt 사이트 계정은 showGroup=true 설정
| When | Then |
|---|---|
| AppUsersQueryRequested (operators.site.admin, operators.site.member 그룹) | OperationUserRetrieved 발생, AccessVerified 발생 |
| AppUsersQueryRequested (operators.medi-dashboard.admin Group) | AppUsersQueried 발생 (권한 검증 생략) |
| AccessDenied | InvalidSiteIdProvided 발생, BAD_REQUEST 에러 반환 |
| AppUsersQueried | LastLoginTimeRetrieved 발생 (각 app-user별) |
| LastLoginTimeRetrieved | AppUsersRetrieved 발생 |
app-user 리포트 생성 정책
백엔드 정책
- 리포트 생성 시 사용자 주기 정보 필수 조회
- 현재 시간이 userCycle.EndAt 이후면 EndAt 기준으로 일차 계산
- startDate~endDate 범위로 수면 일기, 목표 로그 조회
- 분모용 수면 일기 개수는 calculateSleepDiaryCountForDenominator 로직 사용
- LOT/AET 일관성 퍼센티지는 소수점 첫째 자리에서 반올림
- 성공 횟수가 분모보다 크면 퍼센티지 100으로 설정
- totalUsageDays는 app-user의 plan에 정의된 값으로 설정
| When | Then |
|---|---|
| AppUserReportRequested | UserCycleRetrieved 발생, CurrentDayCalculated 발생 |
| UserCycleRetrieved | SleepDiariesRetrieved 발생, RtibAlgorithmGoalRetrieved 발생, SleepGoalsRetrieved 발생, QuestionnairesRetrieved 발생 |
| GoalSuccessRecordsRetrieved | SuccessCountCalculated 발생 |
| SuccessCountCalculated | SleepDiaryCountCalculated 발생 |
| SleepDiaryCountCalculated | LotConsistencyCalculated 발생, AetConsistencyCalculated 발생 |
| AetConsistencyCalculated | ReportSummaryGenerated 발생 |
| ReportSummaryGenerated | AppUserReportGenerated 발생 |
외부 토큰 인증 정책
백엔드 정책
- 토큰 타입은 TokenTypeMdAccess만 허용
- 빈 토큰은 즉시 BAD_REQUEST 반환
- "sub" 클레임은 float64 타입이어야 함
- "sub" 값과 userCycleId 일치 여부 검증 필수
| When | Then |
|---|---|
| ExternalTokenReceived (빈 문자열) | TokenValidationFailed 발생, BAD_REQUEST 에러 반환 |
| TokenValidationRequested | TokenValidated 발생 또는 TokenValidationFailed 발생 |
| TokenValidated | TokenClaimsExtracted 발생 |
| TokenClaimsExtracted ("sub" 없음) | SubjectMismatch 발생, BAD_REQUEST 에러 반환 |
| TokenClaimsExtracted ("sub" 불일치) | SubjectMismatch 발생, BAD_REQUEST 에러 반환 |
| SubjectVerified | AppUserReportRequested 발생 |
명령(Commands)
도메인 이벤트를 발생시키는 app-user 정보 관리 및 리포트 생성 동작입니다.
1. app-user 목록 관리 명령
1.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|---|---|
| GetAppUsers | app-user 목록 조회 | AppUsersQueryRequested 이벤트 발생 |
| VerifyOperationUserAccess | 운영자 접근 권한 검증 | AccessVerified 또는 AccessDenied 이벤트 발생 |
| RetrieveOperationUser | 운영자 정보 조회 | OperationUserRetrieved 이벤트 발생 |
| SearchAppUsers | app-user 검색 및 필터링 | AppUsersQueried 이벤트 발생 |
| GetLastLoginTime | 마지막 로그인 시간 조회 | LastLoginTimeRetrieved 이벤트 발생 |
| ApplyFilters | 필터 조건 적용 | AppUsersFiltered 이벤트 발생 |
| ApplySorting | 정렬 조건 적용 | AppUsersSorted 이벤트 발생 |
| ValidateSiteId | 사이트 ID 검증 | InvalidSiteIdProvided 이벤트 발생 (실패 시) |
2. app-user 리포트 관리 명령
2.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|---|---|
| GetAppUserReport | app-user 리포트 조회 | AppUserReportRequested 이벤트 발생 |
| RetrieveUserCycle | 사용자 주기 정보 조회 | UserCycleRetrieved 이벤트 발생 |
| CalculateCurrentDay | 현재 일차 계산 | CurrentDayCalculated 이벤트 발생 |
| RetrieveSleepDiaries | 수면 일기 조회 | SleepDiariesRetrieved 이벤트 발생 |
| RetrieveRtibGoal | 첫 번째 rTIB 목표 조회 | RtibAlgorithmGoalRetrieved 이벤트 발생 |
| RetrieveSleepGoals | 수면 목표 로그 조회 | SleepGoalsRetrieved 이벤트 발생 |
| RetrieveQuestionnaires | 설문 응답 조회 | QuestionnairesRetrieved 이벤트 발생 |
| RetrieveGoalSuccessRecords | 목표 성공 기록 조회 | GoalSuccessRecordsRetrieved 이벤트 발생 |
| CalculateSuccessCount | 성공 횟수 계산 | SuccessCountCalculated 이벤트 발생 |
| CalculateSleepDiaryCount | 분모용 수면 일기 개수 계산 | SleepDiaryCountCalculated 이벤트 발생 |
| CalculateLotConsistency | LOT 일관성 계산 | LotConsistencyCalculated 이벤트 발생 |
| CalculateAetConsistency | AET 일관성 계산 | AetConsistencyCalculated 이벤트 발생 |
| GenerateReportSummary | 리포트 요약 생성 | ReportSummaryGenerated 이벤트 발생 |
3. 외부 토큰 인증 명령
3.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|---|---|
| GetAppUserReportWithExternalToken | 외부 토큰으로 리포트 조회 | ExternalTokenReceived 이벤트 발생 |
| ValidateToken | 토큰 검증 | TokenValidationRequested 이벤트 발생 |
| ExtractTokenClaims | 토큰 클레임 추출 | TokenClaimsExtracted 이벤트 발생 |
| VerifySubject | Subject 클레임 검증 | SubjectVerified 또는 SubjectMismatch 이벤트 발생 |
액터(Actors)
시스템과 상호작용하는 주체들입니다.
운영자 (OperationUser)
- app-user 목록 조회 및 검색
- app-user 리포트 조회
- 본인 사이트 app-user만 접근 가능
외부 시스템 (ExternalSystem)
- 외부 액세스 토큰으로 리포트 조회
- 특정 app-user의 리포트만 접근 가능
Auth 도메인
- 운영자 정보 조회
- 토큰 검증 수행
Sleep 도메인
- 수면 일기 데이터 제공
- 수면 목표 로그 제공
- 목표 성공 기록 제공
Questionnaire 도메인
- 설문 응답 데이터 제공
애그리게잇(Aggregates)
4.1 AppUser
트랜잭션 경계: app-user의 기본 정보와 치료 상태를 원자적으로 관리
담당 Command:
- GetAppUsers
- SearchAppUsers
- ApplyFilters
- ApplySorting
발행 Event:
- AppUsersQueried
- AppUsersFiltered
- AppUsersSorted
- AppUsersRetrieved
적용된 정책:
- When: AppUsersQueryRequested → Then: AppUsersQueried 발생
4.2 AppUserReport
트랜잭션 경계: app-user의 치료 진행 상황과 통계 데이터를 일관성 있게 생성
담당 Command:
- GetAppUserReport
- RetrieveUserCycle
- CalculateCurrentDay
- CalculateSuccessCount
- CalculateLotConsistency
- CalculateAetConsistency
- GenerateReportSummary
발행 Event:
- AppUserReportRequested
- UserCycleRetrieved
- CurrentDayCalculated
- SuccessCountCalculated
- LotConsistencyCalculated
- AetConsistencyCalculated
- ReportSummaryGenerated
- AppUserReportGenerated
적용된 정책:
- When: AppUserReportRequested → Then: UserCycleRetrieved 발생, CurrentDayCalculated 발생
- When: UserCycleRetrieved → Then: SleepDiariesRetrieved 발생, SleepGoalsRetrieved 발생, QuestionnairesRetrieved 발생
- When: SuccessCountCalculated → Then: SleepDiaryCountCalculated 발생
- When: SleepDiaryCountCalculated → Then: LotConsistencyCalculated 발생, AetConsistencyCalculated 발생
4.3 ExternalAccess
트랜잭션 경계: 외부 토큰 기반 인증과 리포트 접근을 안전하게 처리
담당 Command:
- GetAppUserReportWithExternalToken
- ValidateToken
- ExtractTokenClaims
- VerifySubject
발행 Event:
- ExternalTokenReceived
- TokenValidated
- TokenValidationFailed
- TokenClaimsExtracted
- SubjectVerified
- SubjectMismatch
적용된 정책:
- When: ExternalTokenReceived (빈 문자열) → Then: TokenValidationFailed 발생
- When: TokenValidated → Then: TokenClaimsExtracted 발생
- When: SubjectVerified → Then: AppUserReportRequested 발생
읽기 모델(Read Models)
조회 최적화를 위한 데이터 구조입니다.
AppUser List View
- 사이트별 app-user 목록
- 검색 키워드 인덱스
- 상태별 필터링 지원
- 마지막 로그인 시간 포함
AppUser Report View
- app-user별 리포트 데이터
- 치료 진행 상황 요약
- 수면 일기, 목표, 설문 응답 집계
- LOT/AET 일관성 퍼센티지
Operation User Access View
- 운영자별 접근 가능한 사이트
- 역할 및 권한 정보
- Site와 Position 정보
Last Login View
- app-user별 마지막 로그인 시간
- 빠른 조회를 위한 캐시 레이어
변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|---|---|---|
| 0.1.0 | 2025-12-31 | dalia@weltcorp.com | 초기 작성 - GetAppUsers, GetAppUserReport, GetAppUserReportWithExternalAccessToken 기반 |