Sleep 바운디드 컨텍스트
1. 컨텍스트 정의
Sleep 도메인은 사용자의 수면 패턴 기록, 수면 목표 설정 및 권장 수면 시간(rTIB) 계산, 목표 달성 추적을 담당하는 바운디드 컨텍스트입니다.
1.1 주요 책임
- 일일 수면 기록 관리 (
SleepLog) (요구사항 1.1, 모델 2.1, 5.1)- 수면 여부(DNS)에 따른 필수 입력 항목 검증:
- 전혀 못 잤을 경우(DNS=true): 부정적 영향 요인, 수면제 복용 여부, 낮잠 시간
- 잠을 잤을 경우(DNS=false): 수면의 질, LOT, AET, 잠들기까지 걸린 시간, 깬 시간 총합, 긍정적/부정적 영향 요인, 수면제 복용 여부, 낮잠 시간
- 임시 수면 기록 관리:
- 웨어러블 장치나 AI와의 대화를 통해 수집된 부분적 수면 데이터 저장
- 임시 수면 기록의 완전한 수면 기록으로의 전환 관리
- DNS 상태 변경 시 관련 데이터 초기화 처리
- 수면 효율 계산:
- 수면 기록 생성 및 수정 시 수면 효율(SE)을 즉시 계산하여 저장
- 수면 효율은 총 수면 시간(TST)을 침대에 있던 총 시간(TIB)으로 나눈 값으로 계산
- TST = AET - (LOT + SOL) - WASO 공식을 사용하여 계산
- TIB = AET - LOT 공식을 사용하여 계산
- 수면 효율은 0과 1 사이의 소수점 두 자리까지의 값으로 정규화하여 저장
- DNS(Did Not Sleep) 기록의 경우 수면 효율은 null로 설정
- 수면 기록 시간 검증:
- AET(일어난 시각)는 LOT(잠자리에 든 시각)보다 이전일 수 없음
- SE(수면 효율)는 1.0을 넘을 수 없음
- LOT(잠자리에 든 시각)는 18:00 이후여야 함
- 검증 실패 시 명확한 오류 메시지 제공
- 수면 기록 날짜 검증:
- 수면 기록은 오늘(현재 날짜)에 한해서만 생성/수정 가능
- 저장 시점의
TimeMachine시간과 요청의 date가 동일한지 검증 - 날짜 불일치 시 오류 발생 및 수면 기록 생성/수정 거부
- 수면 여부(DNS)에 따른 필수 입력 항목 검증:
- 수면 목표 관리 (
SleepGoal) (요구사항 1.2, 모델 2.2, 5.2) - rTIB(권장 수면 시간) 계산 및 처방 관리 (
RtibRecommendation) (요구사항 1.2, 모델 2.3, 5.2)- 배치 작업을 통한 rTIB 계산 및 처방
- 수면 기록 작성 시점의 rTIB 계산 및 처방 (요구사항 1.2 수정사항)
- 수면 목표 달성 여부 추적 (
SleepGoalAdherence) (요구사항 1.1, 모델 2.4, 5.4) - 주간 수면 요약 생성 (
WeeklySleepSummary) (요구사항 1.1, 모델 3.3, 5.3) - 주차별 수면 통계 계산 및 조회 (
WeeklySleepStatistics) (요구사항 1.1, 모델 3.4, 5.3)- 수면 효율, 수면의 질, 총 수면 시간, 수면제 복용 빈도, SOL, 낮잠 시간, 영향 요인, 목표 달성 통계
- 일차별(dayIndex) 데이터와 통계 요약 제공
- 다양한 범위의 데이터 조회 지원:
- 7일 단위 외에도 사용자의 전체 치료 주기에 걸친 데이터 조회
- 특정 일차 범위를 지정한 데이터 조회
- 월별, 분기별 등 다양한 시간 단위로 집계된 통계 데이터 제공
- 관리자 및 서비스 계정의 수면 데이터 접근 권한 관리 (요구사항 1.1.2)
- System Admin, IAM Admin, Service Account 등 역할별 접근 범위 정의
- 사용자 수면 데이터 조회, 통계 분석을 위한 API 제공
- 데이터 접근에 대한 감사 로그 기록
TimeMachine을 통한 시간 관련 로직 처리 (요구사항 3.6, 규칙 1.1)- 수면 영향 요인(긍정/부정) 조회 데이터 관리 (모델 2.5, 2.6)
- 수면 관련 알림 발송 요청 (
Notification도메인 의존) (요구사항 1.2, 모델 5.5) - 사용자 치료 활동 일시 정지 상태 확인 및 처리 (요구사항 1.1.1, 3.10)
- 치료 주기 일차(dayIndex) 기반 데이터 관리 (요구사항 1.1.1)
- 데이터 관리 및 개인정보 보호 (GDPR 준수) (요구사항 1.3, 3.12)
- 데이터 아카이빙: 비활성 사용자(마지막 활동 6개월 경과) 식별 및 1년 경과 시 데이터 콜드 스토리지 이전
- 데이터 복원: 아카이빙된 사용자가 서비스 재이용 시 데이터 자동 복원
- 데이터 삭제: 사용자 요청 또는 보관 기간(5년) 만료 시 데이터 영구 삭제
- 데이터 익명화: 사용자 요청 없을 시 통계/연구 목적으로 익명화하여 보관 가능
- 데이터 이동성: 사용자 요청 시 표준 형식(JSON/CSV)으로 데이터 추출 제공
- 관리 도구 지원: 데이터 보관 정책 관리 및 모니터링 기능
1.2 도메인 용어
- SleepLog: 일일 수면 기록 데이터
- isTemporary: 수면 기록이 임시 기록(웨어러블 장치나 AI 대화를 통해 부분적으로 수집)인지 여부를 나타내는 플래그
- SleepGoal: 사용자가 설정하거나 시스템이 추천한 목표 취침/기상 시간
- rTIB (Recommended Time In Bed): 알고리즘에 의해 계산된 권장 총 침대 체류 시간
- RtibRecommendation: rTIB 계산 결과 및 처방 기록
- SleepGoalAdherence: 설정된 수면 목표의 달성 여부 기록
- TST (Total Sleep Time): 총 실제 수면 시간
- SE (Sleep Efficiency): 수면 효율 (TST / TIB)
- SOL (Sleep Onset Latency): 잠들기까지 걸린 시간
- WASO (Wake After Sleep Onset): 수면 중 깬 시간의 총합
- TIB (Time In Bed): 침대에 누워있던 총 시간 (일어난 시각 - 잠자리에 든 시각)
- AET (Asleep End Time): 최종적으로 잠에서 깬 시각
- LOT (Lights Out Time): 잠자리에 들기 위해 불을 끈 시각 (취침 시도 시각)
- AST (Asleep Start Time): 실제 잠이 든 시각
- DNS (Did Not Sleep): 해당 날짜에 잠을 자지 않았음을 나타내는 플래그로, 값에 따라 필수 입력 항목 세트가 달라짐
- DNS=true: 전혀 못 잔 경우, 수면 시간 정보 대신 부정적 영향 요인 등만 수집
- DNS=false: 잠을 잔 경우, 모든 수면 관련 정보(LOT, AET, 수면의 질 등) 수집
- Sleep Factors: 수면에 긍정적 또는 부정적 영향을 미치는 요인들
- UserCycle: 사용자의 서비스 이용 주기 또는 특정 프로그램 참여 기간 (외부 컨텍스트)
- TimeMachine: 시스템의 공식 시간을 제공하는 서비스 (외부 컨텍스트)
- Notification: 사용자 알림 발송 서비스 (외부 컨텍스트)
- dayIndex: 치료 주기 일차, 사용자의 치료 진행 과정에서의 순차적 일수 (치료 일시 정지 기간 제외)
- TreatmentSuspension: 사용자의 치료 활동 일시 정지 상태
- WeeklySleepStatistics: 주차별 수면 통계 데이터 집합으로, 연속된 7일(주차) 동안의 수면 데이터를 다양한 측면에서 분석한 결과
- 주차(Week): 시작 일차(dayIndex)를 기준으로 연속된 7일 단위의 기간
- UserCycleStatus: 사용자 주기의 데이터 상태 (ACTIVE, INACTIVE, ARCHIVED)
2. 하위 컨텍스트
Sleep 도메인은 기능들이 밀접하게 연관되어 있어 별도의 하위 컨텍스트로 분리하지 않습니다.
3. 컨텍스트 경계
3.1 상위/의존 컨텍스트
- User Domain: 사용자 식별 및 기본 정보, 치료 주기 일차(dayIndex) 제공, 치료 활동 일시 정지 상태 관리 (Customer-Supplier 관계: Sleep이 User 정보 필요)
- UserCycle Domain (가정): 사용자의 특정 서비스 주기 정보 (Customer-Supplier 관계: Sleep이 UserCycle 정보 필요)
3.2 하위/제공 컨텍스트 (Sleep이 의존하는 컨텍스트)
- TimeMachine Domain: 정확한 시간 정보 및 시간대 처리 제공 (Supplier)
- Notification Domain: 알림 발송 기능 제공 (Supplier)
3.3 외부 시스템
- 없음 (단, TimeMachine, Notification 도메인이 외부 시스템과 연동될 수 있음)
4. 컨텍스트 매핑
4.1 User/UserCycle Domain과의 관계 (Customer-Supplier)
Sleep 컨텍스트는 사용자별 데이터를 관리하기 위해 User 및 UserCycle 컨텍스트로부터 식별자, 치료 일시 정지 상태 정보, 치료 주기 일차 정보를 제공받습니다.
4.2 TimeMachine Domain과의 관계 (Supplier)
Sleep 컨텍스트는 모든 시간 관련 처리를 TimeMachine에 의존하며, 시간 변경 이벤트 발생 시 관련 데이터를 처리합니다.
4.3 Notification Domain과의 관계 (Supplier)
Sleep 컨텍스트는 rTIB 처방, 목표 시간 알림 등 필요한 시점에 Notification 컨텍스트에 알림 발송을 요청합니다.
5. 도메인 이벤트
5.1 발행하는 이벤트
- SleepLogRecorded: 수면 기록 저장 완료 (모델 6.1)
- SleepLogDeleted: 수면 기록 삭제 완료 (TimeMachine 변경 등) (모델 6.1)
- SleepEfficiencyCalculated: 수면 효율이 계산되었음 (수면 기록 생성/수정 시)
- TemporarySleepLogRecorded: 임시 수면 기록 저장 완료
- TemporarySleepLogCompleted: 임시 수면 기록이 완전한 수면 기록으로 전환 완료
- DnsStatusChanged: 수면 여부(DNS) 상태가 변경됨
- SleepDataResetAfterDnsChange: DNS 상태 변경 후 관련 데이터가 초기화됨
- RtibCalculated: rTIB 계산 및 처방 완료 (모델 6.2)
- 배치 작업을 통한 계산 여부 또는 수면 기록 작성 시점의 계산 여부 포함
- RtibCalculationFailed: rTIB 계산 실패 (데이터 부족 등) (모델 6.2)
- RtibDataDeleted: rTIB 관련 데이터 삭제 완료 (TimeMachine 변경 등) (모델 6.2)
- SleepGoalSet: 수면 목표 설정/업데이트 완료 (모델 6.3)
- SleepGoalDeleted: 수면 목표 데이터 삭제 완료 (TimeMachine 변경 등) (모델 6.3)
- SleepGoalAdherenceCalculated: 수면 목표 달성 여부 계산 완료 (모델 6.4)
- SleepGoalAdherenceDeleted: 목표 달성 데이터 삭제 완료 (TimeMachine 변경 등) (모델 6.4)
- WeeklySleepMetricsCalculated: 주차별 수면 통계 계산 완료 (모델 6.1, 추가)
- WeeklySleepEfficiencyCalculated: 주차별 수면 효율 통계 계산 완료 (모델 6.1, 추가)
- WeeklySleepQualityCalculated: 주차별 수면의 질 통계 계산 완료 (모델 6.1, 추가)
- WeeklyTotalSleepTimeCalculated: 주차별 총 수면 시간 통계 계산 완료 (모델 6.1, 추가)
- WeeklySleepMedicationCalculated: 주차별 수면제 복용 통계 계산 완료 (모델 6.1, 추가)
- WeeklySleepOnsetLatencyCalculated: 주차별 SOL 통계 계산 완료 (모델 6.1, 추가)
- WeeklyNapTimeCalculated: 주차별 낮잠 시간 통계 계산 완료 (모델 6.1, 추가)
- WeeklySleepFactorsCalculated: 주차별 수면 영향 요인 통계 계산 완료 (모델 6.1, 추가)
- WeeklyGoalAdherenceCalculated: 주차별 목표 달성 통계 계산 완료 (모델 6.1, 추가)
- SleepTimeValidationFailed: 수면 기록의 시간 검증에 실패했음 (요구사항 1.1)
- DateValidationFailed: 수면 기록의 날짜 검증에 실패했음 (요구사항 3.9)
- FlexibleDataRangeQueried: 유연한 범위의 데이터 조회가 요청됨 (요구사항 1.1)
- AdminDataAccessRequested: 관리자 또는 서비스 계정의 데이터 접근이 요청됨 (요구사항 1.1.2)
- UserCycleMarkedInactiveEvent: 사용자 주기가 비활성 상태로 변경됨 (모델 6.5)
- UserCycleDataArchivedEvent: 사용자 데이터가 콜드 스토리지로 아카이빙됨 (모델 6.5)
- UserCycleDataRestoredEvent: 사용자 데이터가 콜드 스토리지에서 복원됨 (모델 6.5)
- UserDataDeletionRequestedEvent: 사용자 데이터 삭제가 요청됨 (모델 6.5)
- UserDataDeletedEvent: 사용자 데이터가 영구 삭제됨 (모델 6.5)
- UserDataAnonymizedEvent: 사용자 데이터가 익명화됨 (모델 6.5)
- UserDataExtractionRequestedEvent: 사용자 데이터 추출이 요청됨 (모델 6.5)
- UserDataExtractedEvent: 사용자 데이터가 추출 완료됨 (모델 6.5)
- DataAccessAuditedEvent: 관리자/서비스 계정 데이터 접근 감사 완료 (모델 6.5)
- DataPolicyUpdatedEvent: 데이터 보관/관리 정책 업데이트 완료 (모델 6.5)
5.2 구독하는 이벤트
- TimeMachineTimeChanged: TimeMachine에서 시간이 과거로 변경되었을 때 (관련 데이터 삭제 트리거)
- UserTreatmentSuspended: 사용자의 치료 활동이 일시 정지되었을 때 (수면 기록 생성/수정 제한)
- UserTreatmentResumed: 사용자의 치료 활동이 재개되었을 때 (수면 기록 생성/수정 가능)
- (선택적) UserCycleEnded: 사용자 주기가 종료되었을 때 (리포트 생성 또는 계산 중단 등에 활용 가능)
TimeMachine시간 변경 시 일관성 유지를 위해 미래 시점 데이터 자동 삭제 (요구사항 3.9, 규칙 1.2)- 치료 활동 일시 정지 상태인 사용자의 수면 기록 생성/수정 제한 (요구사항 1.1.1, 3.10)
- GDPR 등 데이터 보호 규정 준수 필요 (요구사항 2.2)
- 관리자 및 서비스 계정의 데이터 접근 권한 관리 (요구사항 1.1.2)
- 역할별 접근 범위 제한: System Admin(전체 수면 도메인 데이터), IAM Admin(관리 권한이 할당된 범위 내 사용자 데이터), Service Account(권한에 따른 특정 데이터)
- 모든 데이터 접근에 대한 상세 감사 로그 기록
- IAM 도메인에서 정의한 권한 체계 준수 및 최소 권한 원칙 적용
- 데이터 관리 및 개인정보 보호 정책 (요구사항 1.3, 2.1, 2.2, 2.3, 3.12)
- 데이터 보관: 5년 보관 후 자동 파기
- 데이터 아카이빙: 비활성 6개월 후 식별, 1년 후 콜드 스토리지 이전 (압축/암호화)
- 데이터 복원: 사용자 재접속 시 자동 복원 (5초 이내 완료 목표)
- 데이터 삭제/익명화: 사용자 요청 시 즉시 삭제, 미요청 시 익명화 보관 가능
- 데이터 이동성: 사용자 요청 시 표준 형식으로 추출/제공 (암호화)
- 보안: 저장/전송 데이터 암호화(AES-256+, TLS 1.2+), 접근 제어, 감사, 침해 대응 프로세스
- 가용성: 아카이빙/복원 시스템 고가용성 및 재해 복구 보장
6. 보안 정책
- 사용자의 수면 기록, 목표, 처방 등 민감 데이터는
private스키마에 저장하여 접근 제어 (모델 1, 규칙 6.1) - 과거 수면 기록 데이터는 불변(immutable)으로 처리하여 임의 수정 방지 (요구사항 3.8, 규칙 2.1)
TimeMachine시간 변경 시 일관성 유지를 위해 미래 시점 데이터 자동 삭제 (요구사항 3.9, 규칙 1.2)- 치료 활동 일시 정지 상태인 사용자의 수면 기록 생성/수정 제한 (요구사항 1.1.1, 3.10)
- GDPR 등 데이터 보호 규정 준수 필요 (요구사항 2.2)
- 관리자 및 서비스 계정의 데이터 접근 권한 관리 (요구사항 1.1.2)
- 역할별 접근 범위 제한: System Admin(전체 수면 도메인 데이터), IAM Admin(관리 권한이 할당된 범위 내 사용자 데이터), Service Account(권한에 따른 특정 데이터)
- 모든 데이터 접근에 대한 상세 감사 로그 기록
- IAM 도메인에서 정의한 권한 체계 준수 및 최소 권한 원칙 적용
7. 기술 스택
- NestJS
- TypeScript
- PostgreSQL (데이터 저장소, Prisma 사용)
- Prisma (ORM)
- (이벤트 시스템) GCP Pub/Sub 또는 유사 메시징 큐 (도메인 이벤트 발행/구독용, 가정)
8. 변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|---|---|---|
| 0.1.0 | 2025-04-15 | bok@weltcorp.com | 최초 작성 (requirements, domain-model, business-rules 기반) |
| 0.2.0 | 2025-04-29 | bok@weltcorp.com | 수면 기록 작성 시점의 rTIB 계산, 치료 일시 정지, dayIndex 관련 내용 추가 |
| 0.3.0 | 2025-04-30 | bok@weltcorp.com | 수면 여부(DNS)에 따른 필수 입력 항목 정의 추가 |
| 0.4.0 | 2025-05-03 | bok@weltcorp.com | 주차별 데이터 계산 및 조회 관련 책임, 용어, 이벤트 추가 |
| 0.5.0 | 2025-05-04 | bok@weltcorp.com | 임시 수면 기록 관리, DNS 상태 변경 시 데이터 초기화, 관련 이벤트 추가 |
| 0.6.0 | 2025-05-04 | bok@weltcorp.com | 수면 기록 시간 검증 규칙, 데이터 조회 범위 유연성, 관리자 및 서비스 계정 접근 권한 추가 |
| 0.7.0 | 2025-05-05 | bok@weltcorp.com | 수면 기록 생성/수정 시 날짜 검증 제약 관련 책임 및 이벤트 추가 |
| 0.8.0 | 2025-05-13 | bok@weltcorp.com | GDPR 준수 및 데이터 보관 정책 관련 책임, 용어, 이벤트, 보안 정책 추가 |