본문으로 건너뛰기

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가 동일한지 검증
      • 날짜 불일치 시 오류 발생 및 수면 기록 생성/수정 거부
  • 수면 목표 관리 (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.02025-04-15bok@weltcorp.com최초 작성 (requirements, domain-model, business-rules 기반)
0.2.02025-04-29bok@weltcorp.com수면 기록 작성 시점의 rTIB 계산, 치료 일시 정지, dayIndex 관련 내용 추가
0.3.02025-04-30bok@weltcorp.com수면 여부(DNS)에 따른 필수 입력 항목 정의 추가
0.4.02025-05-03bok@weltcorp.com주차별 데이터 계산 및 조회 관련 책임, 용어, 이벤트 추가
0.5.02025-05-04bok@weltcorp.com임시 수면 기록 관리, DNS 상태 변경 시 데이터 초기화, 관련 이벤트 추가
0.6.02025-05-04bok@weltcorp.com수면 기록 시간 검증 규칙, 데이터 조회 범위 유연성, 관리자 및 서비스 계정 접근 권한 추가
0.7.02025-05-05bok@weltcorp.com수면 기록 생성/수정 시 날짜 검증 제약 관련 책임 및 이벤트 추가
0.8.02025-05-13bok@weltcorp.comGDPR 준수 및 데이터 보관 정책 관련 책임, 용어, 이벤트, 보안 정책 추가