본문으로 건너뛰기

Sleep 도메인 이벤트 스토밍

개요

본 문서는 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 변경 시)
SleepDataResetAfterDnsChangeDNS를 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 백엔드 이벤트

이벤트설명트리거
RtibCalculatedrTIB가 계산되었음CalculateAndRecommendRtib
RtibCalculationFailedrTIB 계산에 실패했음CalculateAndRecommendRtib 실패
RtibCalculatedOnSleepLogCreation수면 기록 작성 시점에 rTIB가 계산되었음CalculateRtibOnSleepLogCreation
RtibEligibilityCheckedrTIB 계산 자격이 확인되었음CheckRtibCalculationEligibility
DataInsufficientForRtibrTIB 계산을 위한 데이터 부족CalculateAndRecommendRtib (데이터 부족)
RtibDelayedrTIB 계산이 지연되었음데이터 부족 또는 시스템 문제
RtibBatchProcessStartedrTIB 배치 처리가 시작되었음일일 배치 작업 시작
RtibBatchProcessCompletedrTIB 배치 처리가 완료되었음일일 배치 작업 완료
RtibDataDeletedrTIB 데이터가 삭제되었음DeleteRtibDataAfter 또는 TimeMachine 변경

2.2 프론트엔드 이벤트

이벤트설명트리거
RtibDisplayedrTIB가 화면에 표시되었음홈 화면 또는 수면 목표 화면 로드
RtibNotificationDisplayedrTIB 알림이 표시되었음새 rTIB 계산 완료
RtibCountdownDisplayed다음 rTIB까지 남은 일수가 표시되었음홈 화면 로드
DelayedRtibMessageDisplayedrTIB 지연 메시지가 표시되었음데이터 부족으로 인한 rTIB 지연
RtibFeedbackDisplayedrTIB 피드백 메시지가 표시되었음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 백엔드 이벤트

이벤트설명트리거
SleepDataDeletedAfterTimeMachineChangeTimeMachine 시간 변경 후 수면 데이터 삭제됨TimeMachineTimeChanged
RtibResetAfterTimeMachineChangeTimeMachine 시간 변경 후 rTIB 리셋TimeMachineTimeChanged

5.2 프론트엔드 이벤트

이벤트설명트리거
TimeMachineChangeDetectedTimeMachine 시간 변경이 감지됨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 백엔드 명령

명령설명영향
CalculateAndRecommendRtibrTIB 계산 및 처방RtibCalculated 또는 RtibCalculationFailed 이벤트 발생
BatchCalculateRtib배치 rTIB 계산RtibBatchProcessStarted 및 RtibBatchProcessCompleted 이벤트 발생
CalculateRtibOnSleepLogCreation수면 기록 작성 시 rTIB 계산RtibCalculatedOnSleepLogCreation 이벤트 발생
CheckRtibCalculationEligibilityrTIB 계산 자격 확인RtibEligibilityChecked 이벤트 발생
GetActiveRtibRecommendation활성 rTIB 처방 조회해당 날짜의 활성 rTIB 처방 반환
DeleteRtibDataAfter특정 시점 이후 rTIB 데이터 삭제RtibDataDeleted 이벤트 발생

2.2 프론트엔드 명령

명령설명영향
DisplayRtibrTIB 표시RtibDisplayed 이벤트 발생
DisplayRtibNotificationrTIB 알림 표시RtibNotificationDisplayed 이벤트 발생
DisplayRtibCountdownrTIB 카운트다운 표시RtibCountdownDisplayed 이벤트 발생
DisplayDelayedRtibMessagerTIB 지연 메시지 표시DelayedRtibMessageDisplayed 이벤트 발생
DisplayRtibFeedbackrTIB 피드백 표시RtibFeedbackDisplayed 이벤트 발생

3. 수면 목표 관련 명령

3.1 백엔드 명령

명령설명영향
SetSleepGoalBasedOnRtibrTIB 기반 수면 목표 설정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 시간 변경 시 데이터 일관성 유지 해결책:

  • 이벤트 구독 메커니즘
  • 트랜잭션 기반 데이터 정리
  • 데이터 스냅샷 관리

변경 이력

버전날짜작성자변경 내용
0.1.02025-04-29bok@weltcorp.com최초 작성
0.2.02025-04-30bok@weltcorp.com수면 여부(DNS)에 따른 필수 입력 항목 정책 추가
0.3.02025-05-03bok@weltcorp.com주차별 데이터 조회 관련 이벤트, 명령, 정책 추가
0.4.02025-05-03bok@weltcorp.com수면 기록 수정 규칙, 임시 수면 기록 규칙, 치료 일시 정지와 주차 단위 조회 규칙 추가
0.5.02025-05-04bok@weltcorp.comDNS 상태 변경 시 불필요 데이터 초기화 규칙 추가
0.6.02025-05-04bok@weltcorp.com수면 기록 시간 검증 규칙, 데이터 조회 범위 유연성, 관리자 및 서비스 계정 접근 권한 추가
0.7.02025-05-05bok@weltcorp.com수면 기록 생성/수정 시 날짜 검증 제약 관련 이벤트 및 정책 추가
0.8.02025-05-13bok@weltcorp.comGDPR 준수 및 데이터 보관 정책 관련 이벤트, 명령, 정책 추가
0.9.02025-07-11bok@weltcorp.com취침 1시간 전 알림 관련 이벤트, 명령 추가
0.10.02025-07-11bok@weltcorp.com취침시간 1시간 전 도달 이벤트 추가 (목표 달성 준비용)