본 문서는 Sleep(수면) 도메인의 이벤트 스토밍 워크샵 결과를 정리한 것입니다. 도메인 전문가, 개발자, 그리고 이해관계자들이 참여하여 도출된 도메인 이벤트, 명령, 액터, 정책 등을 포함합니다.
DTA-WIDE 시스템은 Cloud Run 기반의 분산 마이크로서비스 환경에서 운영되며, 도메인 이벤트는 GCP Pub/Sub를 통한 중앙화된 이벤트 시스템을 활용하여 처리됩니다. 상세한 이벤트 아키텍처는 분산 이벤트 시스템 아키텍처 문서를 참조하세요.
바운디드 컨텍스트 참조
Sleep 도메인과 다른 도메인(특히 User, TimeMachine, Notification 도메인) 간의 협력 관계는 bounded-context.md 문서에 상세히 기술되어 있습니다. 이 문서에서는 주로 Sleep 도메인 내부의 이벤트와 명령에 집중합니다.
참고: User 도메인과의 책임 분리 및 협력 방식에 대한 자세한 내용은 bounded-context.md 문서의 "3. 컨텍스트 경계" 및 "4. 컨텍스트 매핑" 섹션을 참조하세요.
도메인 이벤트
도메인에서 발생하는 중요한 변화나 사실을 나타내는 이벤트들입니다.
1. 수면 기록 관련 이벤트
1.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| SleepLogRecorded | 수면 기록이 저장되었음 | RecordSleep |
| SleepLogRecordFailed | 수면 기록 저장이 실패했음 | RecordSleep 실패 |
| SleepLogValidationFailed | 수면 기록 유효성 검증에 실패했음 | RecordSleep 시 유효성 검증 |
| SleepLogUpdated | 수면 기록이 업데이트되었음 | UpdateSleepLog |
| SleepLogUpdateFailed | 수면 기록 업데이트가 실패했음 | UpdateSleepLog 실패 |
| SleepLogDeleted | 수면 기록이 삭제되었음 | DeleteSleepLog 또는 TimeMachine 변경 |
| DailySleepMetricsCalculated | 일일 수면 지표가 계산되었음 | CalculateDailySleepMetrics |
| SleepEfficiencyCalculated | 수면 효율이 계산되었음 | RecordSleep 또는 UpdateSleepLog |
| WeeklySleepSummaryGenerated | 주간 수면 요약이 생성되었음 | GenerateWeeklySummary |
| UserSuspensionStatusChecked | 사용자 치료 활동 일시 정지 상태 확인 | CheckUserSuspensionStatus |
| SleepLogRejectedDueToSuspension | 치료 활동 일시 정지로 수면 기록 거부됨 | RecordSleep (사용자 치료 활동 일시 정지 상태) |
| WeeklySleepMetricsCalculated | 주차별 수면 통계가 계산되었음 | CalculateWeeklySleepMetrics |
| WeeklySleepEfficiencyCalculated | 주차별 수면 효율 통계가 계산되었음 | CalculateWeeklySleepEfficiency |
| WeeklySleepQualityCalculated | 주차별 수면의 질 통계가 계산되었음 | CalculateWeeklySleepQuality |
| WeeklyTstCalculated | 주차별 총 수면 시간 통계가 계산되었음 | CalculateWeeklyTst |
| WeeklySleepMedicationCalculated | 주차별 수면제 복용 통계가 계산되었음 | CalculateWeeklySleepMedication |
| WeeklySolCalculated | 주차별 SOL 통계가 계산되었음 | CalculateWeeklySol |
| WeeklyNapTimeCalculated | 주차별 낮잠 시간 통계가 계산되었음 | CalculateWeeklyNapTime |
| WeeklySleepFactorsCalculated | 주차별 수면 영향 요인 통계가 계산되었음 | CalculateWeeklySleepFactors |
| TemporarySleepLogRecorded | 임시 수면 기록이 저장되었음 | RecordTemporarySleep |
| TemporarySleepLogCompleted | 임시 수면 기록이 완전한 기록으로 전환되었음 | CompleteTemporarySleep |
| DnsStatusChanged | 수면 여부(DNS) 상태가 변경되었음 | UpdateSleepLog (DNS 변경 시) |
| SleepDataResetAfterDnsChange | DNS를 true로 변경 후 불필요 데이터 초기화됨 | UpdateSleepLog (DNS false→true 변경 시) |
| SleepTimeValidationFailed | 수면 기록의 시간 검증에 실패했음 | RecordSleep 또는 UpdateSleepLog 시 시간 검증 |
| DateValidationFailed | 수면 기록의 날짜 검증에 실패했음 | RecordSleep 또는 UpdateSleepLog 시 날짜 검증 |
| FlexibleDataRangeQueried | 유연한 범위의 데이터 조회가 요청됨 | GetSleepDataByCustomRange |
| AdminDataAccessRequested | 관리자 또는 서비스 계정의 데이터 접근이 요청됨 | AccessUserSleepData |
1.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| SleepLogFormSubmitted | 사용자가 수면 기록 폼을 제출했음 | 수면 기록 제출 |
| SleepLogFormValidated | 수면 기록 폼이 유효성 검증을 통과했음 | 폼 유효성 검증 |
| SleepLogFormValidationFailed | 수면 기록 폼 유효성 검증에 실패했음 | 폼 유효성 검증 실패 |
| SleepFactorsSelected | 사용자가 수면 영향 요인을 선택했음 | 수면 영향 요인 선택 |
| CustomSleepFactorAdded | 사용자가 커스텀 수면 영향 요인을 추가했음 | 커스텀 요인 추가 |
| SleepChartDisplayed | 수면 차트가 표시되었음 | 수면 통계 화면 로드 |
| SleepLogSubmissionBlockedDuringTreatmentSuspension | 치료 활동 일시 정지 상태에서 수면 기록 제출이 차단됨 | 수면 기록 제출 시도 (사용자 치료 활동 일시 정지 상태) |
| TreatmentSuspensionNoticeDisplayed | 치료 활동 일시 정지 알림이 표시됨 | 수면 기록 화면 접근 (사용자 치료 활동 일시 정지 상태) |
| WeeklySleepMetricsDisplayed | 주차별 수면 통계가 표시되었음 | 주차별 통계 화면 로드 |
| WeeklySleepEfficiencyChartDisplayed | 주차별 수면 효율 차트가 표시되었음 | 주차별 수면 효율 화면 로드 |
| WeeklySleepQualityChartDisplayed | 주차별 수면의 질 차트가 표시되었음 | 주차별 수면의 질 화면 로드 |
| WeeklyTstChartDisplayed | 주차별 총 수면 시간 차트가 표시되었음 | 주차별 총 수면 시간 화면 로드 |
| WeeklySleepMedicationChartDisplayed | 주차별 수면제 복용 차트가 표시되었음 | 주차별 수면제 복용 화면 로드 |
| WeeklySolChartDisplayed | 주차별 SOL 차트가 표시되었음 | 주차별 SOL 화면 로드 |
| WeeklyNapTimeChartDisplayed | 주차별 낮잠 시간 차트가 표시되었음 | 주차별 낮잠 시간 화면 로드 |
| WeeklySleepFactorsChartDisplayed | 주차별 수면 영향 요인 차트가 표시되었음 | 주차별 수면 영향 요인 화면 로드 |
| WeekSelectorChanged | 주차 선택기가 변경되었음 | 주차 선택 변경 |
2. rTIB 관련 이벤트
2.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| RtibCalculated | rTIB가 계산되었음 | CalculateAndRecommendRtib |
| RtibCalculationFailed | rTIB 계산에 실패했음 | CalculateAndRecommendRtib 실패 |
| RtibCalculatedOnSleepLogCreation | 수면 기록 작성 시점에 rTIB가 계산되었음 | CalculateRtibOnSleepLogCreation |
| RtibEligibilityChecked | rTIB 계산 자격이 확인되었음 | CheckRtibCalculationEligibility |
| DataInsufficientForRtib | rTIB 계산을 위한 데이터 부족 | CalculateAndRecommendRtib (데이터 부족) |
| RtibDelayed | rTIB 계산이 지연되었음 | 데이터 부족 또는 시스템 문제 |
| RtibBatchProcessStarted | rTIB 배치 처리가 시작되었음 | 일일 배치 작업 시작 |
| RtibBatchProcessCompleted | rTIB 배치 처리가 완료되었음 | 일일 배치 작업 완료 |
| RtibDataDeleted | rTIB 데이터가 삭제되었음 | DeleteRtibDataAfter 또는 TimeMachine 변경 |
2.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| RtibDisplayed | rTIB가 화면에 표시되었음 | 홈 화면 또는 수면 목표 화면 로드 |
| RtibNotificationDisplayed | rTIB 알림이 표시되었음 | 새 rTIB 계산 완료 |
| RtibCountdownDisplayed | 다음 rTIB까지 남은 일수가 표시되었음 | 홈 화면 로드 |
| DelayedRtibMessageDisplayed | rTIB 지연 메시지가 표시되었음 | 데이터 부족으로 인한 rTIB 지연 |
| RtibFeedbackDisplayed | rTIB 피드백 메시지가 표시되었음 | rTIB 계산 결과에 따른 피드백 표시 |
3. 수면 목표 관련 이벤트
3.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| SleepGoalSet | 수면 목표가 설정되었음 | SetSleepGoalBasedOnRtib |
| SleepGoalUpdated | 수면 목표가 업데이트되었음 | SetSleepGoalBasedOnRtib |
| SleepGoalFetchedByDate | 날짜별 수면 목표 조회 | GetActiveSleepGoal |
| SleepGoalFetchedByDayIndex | 일차별 수면 목표 조회 | GetSleepGoalByDayIndex |
| SleepGoalWakeTimeUpdated | 목표 기상 시각이 사용자에 의해 업데이트됨 | UpdatetargetAET |
| SleepGoalDeleted | 수면 목표가 삭제되었음 | DeleteSleepGoal 또는 TimeMachine 변경 |
3.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| SleepGoalWakeTimeChangeRequested | 목표 기상 시각 변경이 요청되었음 | 목표 기상 시각 변경 요청 |
| SleepGoalWakeTimeChangeSubmitted | 목표 기상 시각 변경이 제출되었음 | 목표 기상 시각 변경 제출 |
| SleepGoalWakeTimeChangeDisabled | 목표 기상 시각 변경이 비활성화되었음 | 자정 이후 또는 rTIB 처방일이 아닌 경우 |
| SleepGoalDisplayed | 수면 목표가 화면에 표시되었음 | 홈 화면 또는 수면 목표 화면 로드 |
| BedTimeNotificationReceived | 취침 시간 알림이 수신되었음 | 목표 취침 시각 1시간 전 |
| WakeTimeNotificationReceived | 기상 시각 알림이 수신되었음 | 목표 기상 시각 도달 |
4. 수면 목표 달성 관련 이벤트
4.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| SleepGoalAdherenceCalculated | 수면 목표 달성 여부가 계산되었음 | CalculateAndRecordGoalAdherence |
| SleepGoalAdherenceFetched | 수면 목표 달성 기록이 조회되었음 | GetGoalAdherenceBetween |
| SleepGoalAdherenceDeleted | 수면 목표 달성 기록이 삭제되었음 | DeleteGoalAdherenceDataAfter 또는 TimeMachine 변경 |
4.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| SleepGoalAdherenceDisplayed | 수면 목표 달성 여부가 화면에 표시되었음 | 수면 통계 화면 로드 |
| WeeklyAdherenceChartDisplayed | 주간 목표 달성 차트가 표시되었음 | 주간 통계 화면 로드 |
| SleepGoalSuccessDisplayed | 목표 달성 성공이 표시되었음 | 목표 달성 시 |
| SleepGoalFailureDisplayed | 목표 달성 실패가 표시되었음 | 목표 달성 실패 시 |
5. TimeMachine 관련 이벤트
5.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| SleepDataDeletedAfterTimeMachineChange | TimeMachine 시간 변경 후 수면 데이터 삭제됨 | TimeMachineTimeChanged |
| RtibResetAfterTimeMachineChange | TimeMachine 시간 변경 후 rTIB 리셋 | TimeMachineTimeChanged |
5.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| TimeMachineChangeDetected | TimeMachine 시간 변경이 감지됨 | TimeMachine 변경 알림 수신 |
| DataRefreshRequiredAfterTimeChange | 시간 변경 후 데이터 새로고침 필요 | TimeMachine 변경 후 |
6. 데이터 관리 및 개인정보 보호 관련 이벤트
6.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| InactiveUserDetected | 비활성 사용자가 감지되었음 | CheckUserActivity (정기 배치) |
| UserDataMarkedAsInactive | 사용자 데이터가 비활성 상태로 표시되었음 | MarkUserDataAsInactive |
| ArchivingProcessStarted | 데이터 아카이빙 프로세스가 시작되었음 | StartDataArchiving |
| UserDataArchived | 사용자 데이터가 콜드 스토리지로 아카이빙되었음 | ArchiveUserData |
| ArchivingProcessCompleted | 데이터 아카이빙 프로세스가 완료되었음 | CompleteDataArchiving |
| ArchivingProcessFailed | 데이터 아카이빙 프로세스가 실패했음 | ArchiveUserData 실패 |
| RestorationProcessStarted | 데이터 복원 프로세스가 시작되었음 | StartDataRestoration |
| UserDataRestored | 사용자 데이터가 콜드 스토리지에서 복원되었음 | RestoreUserData |
| RestorationProcessCompleted | 데이터 복원 프로세스가 완료되었음 | CompleteDataRestoration |
| RestorationProcessFailed | 데이터 복원 프로세스가 실패했음 | RestoreUserData 실패 |
| UserDataDeletionRequested | 사용자 데이터 삭제가 요청되었음 | RequestUserDataDeletion (사용자 요청) |
| UserDataDeleted | 사용자 데이터가 영구 삭제되었음 | DeleteUserData |
| UserDataDeletionFailed | 사용자 데이터 삭제가 실패했음 | DeleteUserData 실패 |
| UserDataAnonymized | 사용자 데이터가 익명화되었음 | AnonymizeUserData |
| DataRetentionPeriodExpired | 데이터 보관 기간이 만료되었음 | CheckDataRetention (정기 배치) |
| UserDataExtractionRequested | 사용자 데이터 추출이 요청되었음 | RequestDataExtraction (사용자 요청) |
| UserDataExtracted | 사용자 데이터가 추출되었음 | ExtractUserData |
| DataAccessAudited | 관리자/서비스 계정 데이터 접근이 감사됨 | AuditAdminDataAccess |
| DataPolicyUpdated | 데이터 보관/관리 정책이 업데이트되었음 | UpdateDataPolicy (관리자) |
6.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| DataDeletionRequested | 데이터 삭제 요청이 제출되었음 | DataDeletionRequested 이벤트 발생 |
| DataExtractionRequested | 데이터 추출 요청이 제출되었음 | DataExtractionRequested 이벤트 발생 |
| PrivacyPolicyDisplayed | 개인정보 처리방침이 표시되었음 | PrivacyPolicyDisplayed 이벤트 발생 |
| DataConsentUpdated | 데이터 수집/이용 동의 상태가 업데이트되었음 | DataConsentUpdated 이벤트 발생 |
| DataRestorationNoticeDisplayed | 데이터 복원 알림이 표시되었음 | DataRestorationNoticeDisplayed 이벤트 발생 |
| InactivityWarningDisplayed | 비활성 전환 예정 알림이 표시되었음 | InactivityWarningDisplayed 이벤트 발생 |
7. 취침 시간 관련 이벤트
7.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| BedtimeOneHourBeforeReached | 취침시간 1시간 전이 되었음 | Cloud Scheduler 또는 배치 작업 |
| BedtimeReminderScheduled | 취침 1시간 전 알림이 스케줄되었음 | SetSleepGoalBasedOnRtib |
| BedtimeReminderTriggered | 취침 1시간 전 알림이 트리거되었음 | Cloud Scheduler 또는 배치 작업 |
| BedtimeReminderSent | 취침 1시간 전 알림이 발송되었음 | SendBedtimeReminder |
| BedtimeReminderFailed | 취침 1시간 전 알림 발송이 실패했음 | SendBedtimeReminder 실패 |
| BedtimeReminderCancelled | 취침 1시간 전 알림이 취소되었음 | 목표 변경 또는 사용자 요청 |
7.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| BedtimeOneHourBeforeReachedNotificationReceived | 취침시간 1시간 전 알림이 수신되었음 | 알림 수신 |
| BedtimeOneHourBeforeReachedNotificationDisplayed | 취침시간 1시간 전 알림이 표시되었음 | 알림 표시 |
| BedtimeReminderReceived | 취침 1시간 전 알림이 수신되었음 | 알림 수신 |
| BedtimeReminderDisplayed | 취침 1시간 전 알림이 표시되었음 | 알림 표시 |
| BedtimeReminderDismissed | 취침 1시간 전 알림이 무시되었음 | 사용자 알림 무시 |
| BedtimeReminderActionTaken | 취침 1시간 전 알림에서 액션이 취해졌음 | 사용자 알림 클릭 |
정책(Policies)
시스템의 자동화된 비즈니스 규칙입니다.
수면 기록 정책
백엔드 정책
- 수면 기록은 당일에만 수정 가능
- 자정 이후 수면 기록은 수정 불가
- 치료 활동 일시 정지 시 수면 기록 생성/수정 불가
- 날짜와 일차가 모두 유일해야 함 (중복 방지)
- 수면 기록 저장 시 자동으로 일일 수면 지표 계산
- 수면 기록 생성 및 수정 시 수면 효율(SE)을 즉시 계산하여 저장
- 과거 수면 기록 조회 항상 허용 (읽기 전용)
- DNS(Did Not Sleep)와 720분 초과 기록은 rTIB 계산에서 제외
- DNS(Did Not Sleep) 기록의 경우 수면 효율은 null로 설정
- 수면 여부(DNS)에 따른 필수 입력 항목 검증:
- 전혀 못 잤을 경우(DNS=true) 필수 항목: 수면에 부정적인 영향을 준 요인, 수면제 복용 여부, 낮잠 시간
- 잠을 잤을 경우(DNS=false) 필수 항목: 수면의 질, LOT(눈을 감고 잠을 청한 시각), AET(잠에서 깬 시각), 잠들기까지 걸린 시간, 도중에 깬 시간, 긍정적/부정적 영향 요인, 수면제 복용 여부, 낮잠 시간
- 주차별 데이터 계산 및 조회 규칙:
- 주차별 데이터는 연속된 7일 단위로 계산하며, 시작 일차(dayIndex)를 기준으로 함
- 모든 API는 시작 일차(dayIndex) 파라미터를 필수로 포함해야 함
- DNS 기록의 경우 총 수면 시간은 0분, 수면의 질/SOL/긍정적 영향 요인은 없음으로 표시
- 주차별 통계에는 다음 항목 포함: 수면 효율, 수면의 질, 총 수면 시간, 수면제 복용, SOL, 낮잠 시간, 수면 영향 요인, 목표 달성 여부
- 수면 여부(DNS)를 false에서 true로 변경하는 경우, DNS에 필요한 데이터(부정적 영향 요인, 수면제 복용 여부, 낮잠 시간) 이외의 모든 항목은 자동으로 초기화됨
- 임시 수면 기록은 일부 필수 필드가 누락되어도 저장이 가능함
- 임시 수면 기록에는 최소한 lot, sleepEndTime, sleepQuality, pill 중 하나 이상의 정보가 필요함
- 임시 수면 기록이라도 취침/기상 시각 정보가 있으면 목표 달성 여부 계산에 부분적으로 포함됨
- 주차 단위 데이터 조회 시 일시 정지 기간은 무시되며, dayIndex 기준으로 연속된 치료 일차를 하나의 주차로 처리함
- 수면 기록 시간 검증 규칙:
- AET(일어난 시각)는 LOT(잠자리에 든 시각)보다 이전일 수 없음
- SE(수면 효율)는 1.0을 넘을 수 없음
- 수면 효율은 총 수면 시간(TST)을 침대에 있던 총 시간(TIB)으로 나눈 값으로 계산
- TST = AET - (LOT + SOL) - WASO 공식을 사용하여 계산 (AET: 일어난 시각, LOT: 잠자리에 든 시각, SOL: 잠들기까지 걸린 시간, WASO: 수면 중 깬 시간 총합)
- TIB = AET - LOT 공식을 사용하여 계산
- 수면 효율은 0과 1 사이의 소수점 두 자리까지의 값으로 정규화하여 저장
- LOT(잠자리에 든 시각)는 18:00 이후여야 함
- 위 조건 중 하나라도 충족하지 않는 경우, 요청 거부 및 오류 메시지 반환
- 오류 메시지는 어떤 항목이 유효하지 않은지와 허용 가능한 값의 범위를 명확히 제시
- 수면 기록은 오늘(현재 날짜)에 한해서만 생성/수정이 가능하며, 과거나 미래 날짜에 대한 기록 생성은 불가능함
- 시스템은 저장 시점의
TimeMachine 시간(가상 또는 실제)과 요청의 date가 동일한지 검증해야 함
TimeMachine 시간과 요청의 date가 일치하지 않는 경우, 시스템은 오류를 발생시키고 수면 기록 생성/수정을 거부해야 함
- 데이터 조회 범위 유연성:
- 7일 단위 표시 외에도 다양한 기간 범위로 데이터 조회 지원
- 사용자의 전체 치료 주기에 걸친 데이터 조회 지원
- 특정 일차 범위를 지정하여 조회 가능
- 월별, 분기별 등 다양한 시간 단위로 집계된 통계 데이터 제공
프론트엔드 정책
- 시간 입력은 5분 단위로 제한
- 치료 활동 일시 정지 시 수면 기록 폼 비활성화
- 수면 영향 요인은 자유 입력 최대 10개, 각 100자 제한
- 수면 기록 완료 시 수면 지표 시각화 제공
- 일차(dayIndex) 기준 데이터 표시 및 정렬
- 수면 여부(DNS)에 따른 UI 동적 변경:
- 전혀 못 잤을 경우(DNS=true) 수면 시간, 수면의 질, 긍정적 영향 요인 입력 UI 비활성화
- 잠을 잤을 경우(DNS=false) 모든 입력 필드 활성화 및 필수 입력 항목 표시
- 필수 입력 항목 누락 시 사용자에게 시각적 피드백 제공
- 주차별 통계 표시 규칙:
- 주차 선택 UI를 통해 원하는 시작 일차 선택 가능
- 각 통계는 7일 데이터를 일차별로 구분하여 표시
- 주차별 차트는 한눈에 추이를 파악할 수 있도록 직관적으로 시각화
- DNS 기록은 차트에서 명확히 구분되도록 표시
- 각 통계에 대한 평균, 최소, 최대, 빈도 등 요약 정보 함께 제공
- DNS 상태 변경 시 관련 입력 필드 자동 초기화 및 시각적 피드백 제공
- 임시 수면 기록 입력 및 완료를 위한 UI 제공
- 치료 진행의 연속성(dayIndex)을 기준으로 주차 데이터를 표시
rTIB 계산 정책
백엔드 정책
- 7일 주기 rTIB 계산 및 갱신
- 일차(dayIndex) 기준 데이터 수집 및 계산
- 최소 유효 기록 수 기준 적용 (최초 4개, 이후 5개)
- 수면 효율 기반 계산 공식 차등 적용
- 15분 단위 결과값 올림
- 일일 배치 작업 대상 선별 (당일 계산 안된 사용자만)
- 수면 기록 저장 시 rTIB 계산 조건 확인 및 실시간 처리
- 권장 TIB는 수면 목표 필수 값으로 강제
프론트엔드 정책
- rTIB 계산 데이터 부족 시 사용자 피드백 제공
- 수면 기록 저장으로 rTIB 계산 시 즉시 알림
- 다음 rTIB 계산까지 남은 일수 표시
수면 목표 관리 정책
백엔드 정책
- rTIB 처방일 당일만 목표 기상 시각 변경 허용
- 다음 rTIB 처방까지 동일 목표 유지
- 목표 기상 시각 변경 시 목표 취침 시각 자동 계산
- 일차(dayIndex) 기준 목표 적용 및 관리
- 목표 달성 기준: 목표 시각 ±30분 이내
프론트엔드 정책
- 목표 시각 변경 UI는 처방일 당일만 활성화
- 목표 기상 시각 변경 시 취침 시각 연동 표시
- 자정 이후 목표 변경 UI 비활성화 및 안내
- 목표 달성 여부 시각적 표시
TimeMachine 연동 정책
백엔드 정책
- 모든 시간 관련 처리는 TimeMachine 의존
- 시간 변경 시 해당 시점 이후 데이터 자동 삭제
- 시간대(Timezone) 변환은 TimeMachine 위임
프론트엔드 정책
- 사용자 시간대 기반 UI 표시
- 시간 변경 감지 시 데이터 재로드
데이터 관리 & 개인정보 보호 정책 (GDPR 준수)
백엔드 정책
- 보관 기간: 수면 데이터는 5년간 보관 후 자동 파기 (요구사항 1.3, 3.12, 비즈니스 규칙 8.1, 8.3)
- 비활성 기준: 마지막 활동 후 6개월 경과 시 비활성 상태로 전환 (요구사항 1.3, 3.12, 비즈니스 규칙 8.1)
- 아카이빙: 비활성 상태 1년 경과 시 데이터는 압축/암호화되어 콜드 스토리지로 이전 (요구사항 1.3, 2.2, 3.12, 비즈니스 규칙 8.1)
- 복원: 비활성 사용자가 재로그인 시 콜드 스토리지에서 데이터 자동 복원 (요구사항 1.3, 3.12, 비즈니스 규칙 8.2)
- 삭제: 사용자 요청 시 또는 보관 기간 만료 시 개인 식별 정보 포함 모든 데이터 영구 삭제 (요구사항 1.3, 3.12, 비즈니스 규칙 8.3)
- 익명화: 사용자 요청이 없는 한, 개인 식별 정보 삭제 후 통계/연구 목적으로 익명화하여 보관 가능 (요구사항 1.3, 2.2, 3.12, 비즈니스 규칙 8.3)
- 이동성: 사용자 요청 시 모든 수면 데이터를 표준 형식(JSON/CSV)으로 암호화하여 추출/제공 (요구사항 1.3, 3.12, 비즈니스 규칙 8.4)
- 보안: 저장/전송 데이터 암호화, 최소 권한 원칙, 접근 감사 로그, 침해 대응 프로세스 준수 (요구사항 2.2, 비즈니스 규칙 8.5)
- 아카이빙/복원 성능: 아카이빙은 저부하 시간대 수행, 복원은 5초 이내 완료 (요구사항 2.1, 비즈니스 규칙 8.1, 8.2)
- 관리 도구: 데이터 보관 정책 설정, 아카이빙/복원 모니터링 및 수동 제어 기능 제공 (요구사항 1.3, 비즈니스 규칙 8.6)
프론트엔드 정책
- 개인정보 처리방침 및 GDPR 정보 명확히 제공
- 데이터 동의 설정, 데이터 다운로드, 계정/데이터 삭제 요청 기능 제공
- 데이터 복원 시 사용자 알림 제공
- 비활성 전환 전 사용자 알림 제공
- 복원된 과거 데이터와 현재 데이터 UI 구분 표시
알림 정책
백엔드 정책
- 목표 취침 시각 1시간 전 알림 발송
- 목표 기상 시각 도달 시 알림 발송
- rTIB 처방 완료 시 알림 발송
- 수면 기록 작성 시점 rTIB 계산 시 알림 발송
프론트엔드 정책
- 알림 수신 및 표시
- 알림 터치 시 적절한 화면으로 이동
명령(Commands)
도메인 이벤트를 발생시키는 사용자 의도나 시스템 동작입니다.
1. 수면 기록 관련 명령
1.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| RecordSleep | 수면 기록 저장 | SleepLogRecorded 또는 SleepLogRecordFailed 이벤트 발생 |
| UpdateSleepLog | 수면 기록 업데이트 | SleepLogUpdated 또는 SleepLogUpdateFailed 이벤트 발생 |
| DeleteSleepLog | 수면 기록 삭제 | SleepLogDeleted 이벤트 발생 |
| GetSleepLog | 특정 날짜 수면 기록 조회 | 해당 날짜의 수면 기록 반환 |
| GetSleepLogByDayIndex | 특정 일차 수면 기록 조회 | 해당 일차의 수면 기록 반환 |
| GetSleepLogsBetween | 기간 내 수면 기록 조회 | 해당 기간의 수면 기록 목록 반환 |
| GetSleepLogsByDayIndexRange | 일차 범위 내 수면 기록 조회 | 해당 일차 범위의 수면 기록 목록 반환 |
| CalculateDailySleepMetrics | 일일 수면 지표 계산 | DailySleepMetricsCalculated 이벤트 발생 |
| CalculateSleepEfficiency | 수면 효율 계산 | SleepEfficiencyCalculated 이벤트 발생 |
| GetTodaySleepSummary | 오늘의 수면 요약 조회 | 오늘 수면 기록 요약 정보 반환 |
| CheckUserSuspensionStatus | 사용자 치료 활동 일시 정지 상태 확인 | UserSuspensionStatusChecked 이벤트 발생 |
| DeleteSleepDataAfter | 특정 시점 이후 수면 데이터 삭제 | SleepLogDeleted 이벤트 발생 |
| CalculateWeeklySleepMetrics | 주차별 수면 통계 계산 | WeeklySleepMetricsCalculated 이벤트 발생 |
| GetWeeklySleepEfficiency | 주차별 수면 효율 조회 | 주차 시작 일차별 수면 효율 통계 반환 |
| GetWeeklySleepQuality | 주차별 수면의 질 조회 | 주차 시작 일차별 수면의 질 통계 반환 |
| GetWeeklyTst | 주차별 총 수면 시간 조회 | 주차 시작 일차별 총 수면 시간 통계 반환 |
| GetWeeklySleepMedication | 주차별 수면제 복용 조회 | 주차 시작 일차별 수면제 복용 통계 반환 |
| GetWeeklySol | 주차별 SOL 조회 | 주차 시작 일차별 SOL 통계 반환 |
| GetWeeklyNapTime | 주차별 낮잠 시간 조회 | 주차 시작 일차별 낮잠 시간 통계 반환 |
| GetWeeklySleepFactors | 주차별 수면 영향 요인 조회 | 주차 시작 일차별 수면 영향 요인 통계 반환 |
| RecordTemporarySleep | 임시 수면 기록 저장 | TemporarySleepLogRecorded 이벤트 발생 |
| CompleteTemporarySleep | 임시 수면 기록 완료 | TemporarySleepLogCompleted 이벤트 발생 |
| GetSleepDataByCustomRange | 사용자 지정 범위의 수면 데이터 조회 | FlexibleDataRangeQueried 이벤트 발생 |
| GetSleepDataForEntireTreatment | 전체 치료 기간의 수면 데이터 조회 | 사용자의 전체 치료 기간 수면 데이터 반환 |
| GetAggregatedSleepDataByPeriod | 특정 기간 단위로 집계된 수면 데이터 조회 | 월별/분기별 등 집계된 수면 데이터 반환 |
| AccessUserSleepData | 관리자 권한으로 사용자 수면 데이터 접근 | AdminDataAccessRequested 이벤트 발생 |
| GetAnonymizedSleepStatistics | 익명화된 수면 통계 데이터 조회 | 연구/분석용 익명화된 통계 데이터 반환 |
| AuditAdminDataAccess | 관리자의 데이터 접근 감사 로그 기록 | 누가, 언제, 어떤 데이터에 접근했는지 기록 |
1.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|
| SubmitSleepLogForm | 수면 기록 폼 제출 | SleepLogFormSubmitted 이벤트 발생 |
| ValidateSleepLogForm | 수면 기록 폼 유효성 검증 | SleepLogFormValidated 또는 SleepLogFormValidationFailed 이벤트 발생 |
| SelectSleepFactors | 수면 영향 요인 선택 | SleepFactorsSelected 이벤트 발생 |
| AddCustomSleepFactor | 커스텀 수면 영향 요인 추가 | CustomSleepFactorAdded 이벤트 발생 |
| SleepChartDisplayed | 수면 차트 표시 | SleepChartDisplayed 이벤트 발생 |
| DisplayTreatmentSuspensionNotice | 치료 활동 일시 정지 알림 표시 | TreatmentSuspensionNoticeDisplayed 이벤트 발생 |
| DisplayWeeklySleepMetrics | 주차별 수면 통계 표시 | WeeklySleepMetricsDisplayed 이벤트 발생 |
| DisplayWeeklySleepEfficiencyChart | 주차별 수면 효율 차트 표시 | WeeklySleepEfficiencyChartDisplayed 이벤트 발생 |
| DisplayWeeklySleepQualityChart | 주차별 수면의 질 차트 표시 | WeeklySleepQualityChartDisplayed 이벤트 발생 |
| DisplayWeeklyTstChart | 주차별 총 수면 시간 차트 표시 | WeeklyTstChartDisplayed 이벤트 발생 |
| DisplayWeeklySleepMedicationChart | 주차별 수면제 복용 차트 표시 | WeeklySleepMedicationChartDisplayed 이벤트 발생 |
| DisplayWeeklySolChart | 주차별 SOL 차트 표시 | WeeklySolChartDisplayed 이벤트 발생 |
| DisplayWeeklyNapTimeChart | 주차별 낮잠 시간 차트 표시 | WeeklyNapTimeChartDisplayed 이벤트 발생 |
| DisplayWeeklySleepFactorsChart | 주차별 수면 영향 요인 차트 표시 | WeeklySleepFactorsChartDisplayed 이벤트 발생 |
| ChangeWeekSelector | 주차 선택기 변경 | WeekSelectorChanged 이벤트 발생 |
2. rTIB 관련 명령
2.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| CalculateAndRecommendRtib | rTIB 계산 및 처방 | RtibCalculated 또는 RtibCalculationFailed 이벤트 발생 |
| BatchCalculateRtib | 배치 rTIB 계산 | RtibBatchProcessStarted 및 RtibBatchProcessCompleted 이벤트 발생 |
| CalculateRtibOnSleepLogCreation | 수면 기록 작성 시 rTIB 계산 | RtibCalculatedOnSleepLogCreation 이벤트 발생 |
| CheckRtibCalculationEligibility | rTIB 계산 자격 확인 | RtibEligibilityChecked 이벤트 발생 |
| GetActiveRtibRecommendation | 활성 rTIB 처방 조회 | 해당 날짜의 활성 rTIB 처방 반환 |
| DeleteRtibDataAfter | 특정 시점 이후 rTIB 데이터 삭제 | RtibDataDeleted 이벤트 발생 |
2.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|
| DisplayRtib | rTIB 표시 | RtibDisplayed 이벤트 발생 |
| DisplayRtibNotification | rTIB 알림 표시 | RtibNotificationDisplayed 이벤트 발생 |
| DisplayRtibCountdown | rTIB 카운트다운 표시 | RtibCountdownDisplayed 이벤트 발생 |
| DisplayDelayedRtibMessage | rTIB 지연 메시지 표시 | DelayedRtibMessageDisplayed 이벤트 발생 |
| DisplayRtibFeedback | rTIB 피드백 표시 | RtibFeedbackDisplayed 이벤트 발생 |
3. 수면 목표 관련 명령
3.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| SetSleepGoalBasedOnRtib | rTIB 기반 수면 목표 설정 | SleepGoalSet 또는 SleepGoalUpdated 이벤트 발생 |
| GetActiveSleepGoal | 활성 수면 목표 조회 | SleepGoalFetchedByDate 이벤트 발생 |
| GetSleepGoalByDayIndex | 일차별 수면 목표 조회 | SleepGoalFetchedByDayIndex 이벤트 발생 |
| GetSleepGoalsByDayIndexRange | 일차 범위별 수면 목표 조회 | 해당 일차 범위의 수면 목표 목록 반환 |
| UpdatetargetAET | 목표 기상 시각 업데이트 | SleepGoalWakeTimeUpdated 이벤트 발생 |
| DeleteSleepGoal | 수면 목표 삭제 | SleepGoalDeleted 이벤트 발생 |
3.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|
| RequestSleepGoalWakeTimeChange | 목표 기상 시각 변경 요청 | SleepGoalWakeTimeChangeRequested 이벤트 발생 |
| SubmitSleepGoalWakeTimeChange | 목표 기상 시각 변경이 제출되었음 | SleepGoalWakeTimeChangeSubmitted 이벤트 발생 |
| DisplaySleepGoal | 수면 목표 표시 | SleepGoalDisplayed 이벤트 발생 |
4. 수면 목표 달성 관련 명령
4.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| CalculateAndRecordGoalAdherence | 목표 달성 여부 계산 및 기록 | SleepGoalAdherenceCalculated 이벤트 발생 |
| GetGoalAdherenceBetween | 기간 내 목표 달성 기록 조회 | SleepGoalAdherenceFetched 이벤트 발생 |
| DeleteGoalAdherenceDataAfter | 특정 시점 이후 목표 달성 데이터 삭제 | SleepGoalAdherenceDeleted 이벤트 발생 |
4.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|
| DisplaySleepGoalAdherence | 수면 목표 달성 여부 표시 | SleepGoalAdherenceDisplayed 이벤트 발생 |
| DisplayWeeklyAdherenceChart | 주간 목표 달성 차트 표시 | WeeklyAdherenceChartDisplayed 이벤트 발생 |
| DisplaySleepGoalSuccess | 목표 달성 성공이 표시되었음 | SleepGoalSuccessDisplayed 이벤트 발생 |
| DisplaySleepGoalFailure | 목표 달성 실패가 표시되었음 | SleepGoalFailureDisplayed 이벤트 발생 |
5. 리포트 관련 명령
5.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| GenerateWeeklySummary | 주간 수면 요약 생성 | WeeklySleepSummaryGenerated 이벤트 발생 |
5.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|
| DisplayWeeklySleepSummary | 주간 수면 요약 표시 | WeeklySleepSummaryDisplayed 이벤트 발생 |
6. 취침 시간 관련 명령
6.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| TriggerBedtimeOneHourBeforeReached | 취침시간 1시간 전 도달 트리거 | BedtimeOneHourBeforeReached 이벤트 발생 |
| ScheduleBedtimeReminder | 취침 1시간 전 알림 스케줄 | BedtimeReminderScheduled 이벤트 발생 |
| TriggerBedtimeReminder | 취침 1시간 전 알림 트리거 | BedtimeReminderTriggered 이벤트 발생 |
| SendBedtimeReminder | 취침 1시간 전 알림 발송 | BedtimeReminderSent 또는 BedtimeReminderFailed 이벤트 발생 |
| CancelBedtimeReminder | 취침 1시간 전 알림 취소 | BedtimeReminderCancelled 이벤트 발생 |
6.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|
| DisplayBedtimeOneHourBeforeReachedNotification | 취침시간 1시간 전 알림 표시 | BedtimeOneHourBeforeReachedNotificationDisplayed 이벤트 발생 |
| HandleBedtimeOneHourBeforeReachedAction | 취침시간 1시간 전 알림 액션 처리 | 취침 목표 달성 준비 처리 |
| DisplayBedtimeReminder | 취침 1시간 전 알림 표시 | BedtimeReminderDisplayed 이벤트 발생 |
| DismissBedtimeReminder | 취침 1시간 전 알림 무시 | BedtimeReminderDismissed 이벤트 발생 |
| HandleBedtimeReminderAction | 취침 1시간 전 알림 액션 처리 | BedtimeReminderActionTaken 이벤트 발생 |
7. 데이터 관리 및 개인정보 보호 관련 명령
7.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| CheckUserActivity | 사용자 활동 상태 확인 (배치) | InactiveUserDetected 이벤트 발생 가능 |
| MarkUserDataAsInactive | 사용자 데이터를 비활성 상태로 표시 | MarkUserDataAsInactive 이벤트 발생 |
| StartDataArchiving | 데이터 아카이빙 프로세스 시작 (배치) | ArchivingProcessStarted 이벤트 발생 |
| ArchiveUserData | 사용자 데이터를 콜드 스토리지로 아카이빙 | UserDataArchived 또는 ArchivingProcessFailed 이벤트 발생 |
| CompleteDataArchiving | 데이터 아카이빙 프로세스가 완료되었음 | ArchivingProcessCompleted 이벤트 발생 |
| StartDataRestoration | 데이터 복원 프로세스가 시작되었음 | RestorationProcessStarted 이벤트 발생 |
| UserDataRestored | 사용자 데이터가 콜드 스토리지에서 복원되었음 | RestoreUserData |
| CompleteDataRestoration | 데이터 복원 프로세스가 완료되었음 | RestorationProcessCompleted 이벤트 발생 |
| RestorationProcessFailed | 데이터 복원 프로세스가 실패했음 | RestoreUserData 실패 |
| UserDataDeletionRequested | 사용자 데이터 삭제가 요청되었음 | RequestUserDataDeletion (사용자 요청) |
| UserDataDeleted | 사용자 데이터가 영구 삭제되었음 | DeleteUserData |
| UserDataDeletionFailed | 사용자 데이터 삭제가 실패했음 | DeleteUserData 실패 |
| UserDataAnonymized | 사용자 데이터가 익명화되었음 | AnonymizeUserData |
| DataRetentionPeriodExpired | 데이터 보관 기간이 만료되었음 | CheckDataRetention (정기 배치) |
| UserDataExtractionRequested | 사용자 데이터 추출이 요청되었음 | RequestDataExtraction (사용자 요청) |
| UserDataExtracted | 사용자 데이터가 추출되었음 | ExtractUserData |
| DataAccessAudited | 관리자/서비스 계정 데이터 접근이 감사됨 | AuditAdminDataAccess |
| DataPolicyUpdated | 데이터 보관/관리 정책이 업데이트되었음 | UpdateDataPolicy (관리자) |
6.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|
| SubmitDataDeletionRequest | 데이터 삭제 요청이 제출되었음 | DataDeletionRequested 이벤트 발생 |
| SubmitDataExtractionRequest | 데이터 추출 요청이 제출되었음 | DataExtractionRequested 이벤트 발생 |
| ViewPrivacyPolicy | 개인정보 처리방침 보기 | PrivacyPolicyDisplayed 이벤트 발생 |
| UpdateConsentSettings | 데이터 수집/이용 동의 설정 변경 | DataConsentUpdated 이벤트 발생 |
| AcknowledgeDataRestoration | 데이터 복원 알림이 확인되었음 | (UI 상태 변경) |
| DismissInactivityWarning | 비활성 전환 예정 알림이 닫기 | (UI 상태 변경) |
액터(Actors)
시스템과 상호작용하는 주체들입니다.
내부 액터
| 액터 | 설명 | 주요 명령 |
|---|
| 일반 사용자 | 수면 관리 앱 사용자 | 수면 기록 저장, 목표 확인, 통계 조회, 데이터 삭제/추출 요청, 동의 설정 변경 |
| 배치 시스템 | 정기적 처리 담당 | rTIB 배치 계산, 사용자 활동 확인, 데이터 아카이빙, 데이터 보관 기간 확인 및 삭제 |
| 시스템 관리자 | 시스템 운영 관리자 | 데이터 관리(아카이빙/복원 모니터링 및 수동 실행), 설정 변경, 모든 사용자 수면 데이터 접근, 데이터 보관 정책 관리, 데이터 접근 감사 조회 |
| IAM 관리자 | 권한 관리 담당자 | 관리 권한이 할당된 범위 내 사용자들의 수면 데이터 접근 |
| 서비스 계정 | 외부 시스템 연동용 계정 | 할당된 권한에 따라 API를 통해 특정 사용자 또는 익명화된 집계 데이터 접근 |
외부 액터
| 액터 | 설명 | 주요 명령 |
|---|
| User 도메인 | 사용자 정보 제공 | 사용자 식별, 치료 활동 일시 정지 상태 제공, 일차(dayIndex) 제공 |
| TimeMachine 도메인 | 시간 정보 제공 | 현재 시간 제공, 시간 변경 이벤트 발생 |
| Notification 도메인 | 알림 발송 서비스 | 목표 시간 알림, rTIB 알림 발송 |
집계(Aggregates)
연관된 엔티티와 값 객체들의 클러스터입니다.
SleepLog 집계
- 루트: SleepLog
- 엔티티: SleepLog
- 값 객체: DailySleepMetrics, SleepQuality, SleepFactors
- 불변식:
- 한 사용자 주기에 특정 날짜 기록은 하나만 존재해야 함
- 한 사용자 주기에 특정 일차 기록은 하나만 존재해야 함
- 당일에만 수정 가능
- 치료 활동 일시 정지 상태에서는 생성/수정 불가
- DNS를 true로 변경 시 불필요 데이터 초기화
- 임시 수면 기록은 일부 필수 필드가 누락되어도 저장이 가능함
- 임시 수면 기록에는 최소한 lot, sleepEndTime, sleepQuality, pill 중 하나 이상의 정보가 필요함
- 임시 수면 기록이라도 취침/기상 시각 정보가 있으면 목표 달성 여부 계산에 부분적으로 포함됨
- 주차 단위 데이터 조회 시 일시 정지 기간은 무시되며, dayIndex 기준으로 연속된 치료 일차를 하나의 주차로 처리함
- 수면 기록 시간 검증 규칙:
- AET(일어난 시각)는 LOT(잠자리에 든 시각)보다 이전일 수 없음
- SE(수면 효율)는 1.0을 넘을 수 없음
- 수면 효율은 총 수면 시간(TST)을 침대에 있던 총 시간(TIB)으로 나눈 값으로 계산
- TST = AET - (LOT + SOL) - WASO 공식을 사용하여 계산 (AET: 일어난 시각, LOT: 잠자리에 든 시각, SOL: 잠들기까지 걸린 시간, WASO: 수면 중 깬 시간 총합)
- TIB = AET - LOT 공식을 사용하여 계산
- 수면 효율은 0과 1 사이의 소수점 두 자리까지의 값으로 정규화하여 저장
- LOT(잠자리에 든 시각)는 18:00 이후여야 함
- 위 조건 중 하나라도 충족하지 않는 경우, 요청 거부 및 오류 메시지 반환
- 오류 메시지는 어떤 항목이 유효하지 않은지와 허용 가능한 값의 범위를 명확히 제시
- 수면 기록은 오늘(현재 날짜)에 한해서만 생성/수정이 가능하며, 과거나 미래 날짜에 대한 기록 생성은 불가능함
- 시스템은 저장 시점의
TimeMachine 시간(가상 또는 실제)과 요청의 date가 동일한지 검증해야 함
TimeMachine 시간과 요청의 date가 일치하지 않는 경우, 시스템은 오류를 발생시키고 수면 기록 생성/수정을 거부해야 함
- 데이터 조회 범위 유연성:
- 7일 단위 표시 외에도 다양한 기간 범위로 데이터 조회 지원
- 사용자의 전체 치료 주기에 걸친 데이터 조회 지원
- 특정 일차 범위를 지정하여 조회 가능
- 월별, 분기별 등 다양한 시간 단위로 집계된 통계 데이터 제공
SleepGoal 집계
- 루트: SleepGoal
- 엔티티: SleepGoal
- 값 객체: SleepGoalType
- 불변식:
- 한 사용자 주기에 특정 날짜 목표는 하나만 존재해야 함
- 한 사용자 주기에 특정 일차 목표는 하나만 존재해야 함
- 목표 기상 시각은 처방일 당일에만 변경 가능
- rTIB는 필수 값이어야 함
RtibRecommendation 집계
- 루트: RtibRecommendation
- 엔티티: RtibRecommendation
- 값 객체: CalculationBasis
- 불변식:
- 한 사용자 주기에 특정 계산 날짜에는 하나의 처방만 존재해야 함
- 계산 근거 데이터는 변경 불가
- 7일 주기로 갱신
- 최소 유효 기록 수 만족 필요
SleepGoalAdherence 집계
- 루트: SleepGoalAdherence
- 엔티티: SleepGoalAdherence
- 값 객체: AdherenceStatus
- 불변식:
- 한 사용자 주기에 특정 날짜 달성 기록은 하나만 존재해야 함
- 한 사용자 주기에 특정 일차 달성 기록은 하나만 존재해야 함
- 기록 생성 후 수정 불가
WeeklySleepSummary 집계
- 루트: WeeklySleepSummary
- 엔티티: WeeklySleepSummary
- 값 객체: WeeklyMetrics
- 불변식:
- 한 사용자 주기에 특정 주 요약은 하나만 존재해야 함
- 주 단위로 계산
핫스팟 및 해결책
1. 사용자 일시 정지 상태 관리
문제: 치료 활동 일시 정지 상태에 따른 수면 기록 관리 복잡성
해결책:
- 사용자 도메인 의존성 명확화
- 상태 확인 캐싱 전략 적용
- 프론트엔드에서 상태에 따른 UI 분기 처리
2. dayIndex 기반 데이터 관리
문제: 날짜와 일차 기반 데이터 관리의 복잡성
해결책:
- 복합 인덱싱 전략
- 일차 기반 데이터 조회 API 최적화
- 일차 기반 데이터 표시 컴포넌트 표준화
3. rTIB 계산 최적화
문제: 배치 작업과 실시간 계산의 이중 처리
해결책:
- 계산 결과 캐싱
- 계산 상태 플래그 도입
- 배치 작업 대상 필터링 최적화
4. 시간대 처리
문제: 다양한 시간대 사용자 지원
해결책:
- TimeMachine 도메인에 모든 시간 로직 위임
- 사용자별 시간대 설정 적용
- 모든 시간 저장은 UTC 기준, 표시는 사용자 시간대 기준
5. 데이터 일관성 유지
문제: TimeMachine 시간 변경 시 데이터 일관성 유지
해결책:
- 이벤트 구독 메커니즘
- 트랜잭션 기반 데이터 정리
- 데이터 스냅샷 관리
변경 이력