본문으로 건너뛰기

TimeMachine 바운디드 컨텍스트

1. 컨텍스트 정의​

TimeMachine 도메인은 시스템 내에서 가상 시간 관리를 담당하는 지원 도메인으로, 특히 테스트 환경에서 시간에 민감한 기능을 검증하기 위한 도구를 제공합니다.

1.1 주요 책임​

  • 사용자별 가상 시간 관리 (Virtual Time Management - UTC 타임스탬프, Timezone ID)
  • 치료 주기 일차(dayIndex) 기반 시간 설정 및 계산
  • 시스템 날짜 변경 감지 및 DayChanged 이벤트 발행 (컨텐츠 해금, rTIB 계산 등 일차별 로직 트리거)
  • 시간 변경 이력 관리 (Time Change History)
  • 데이터 롤백 관리 (Data Rollback Management)
  • 테스트 데이터 격리 (Test Data Isolation) - 참고: 현재 설계에서는 직접적인 데이터 격리보다 메타데이터/컨텍스트 기반 접근을 고려
  • 시간 변경 이벤트 발행 (Time Change Event Publishing)
  • TimeMachine 기능 활성화/비활성화 관리
  • 시간 기반 데이터 정합성 유지 (Time-based Data Consistency)

1.2 도메인 용어​

  • Virtual Time: 테스트를 위해 사용되는 가상의 시간 정보 (UTC 타임스탬프 + Timezone ID)
  • dayIndex: 사용자의 치료 주기 내에서의 상대적인 일차 (1부터 시작, 서비스 이용 중단 기간 제외)
  • Time Change Record: 시간 변경 기록 (변경 전/후 timestamp, dayIndex 등 포함)
  • Rollback Record: 데이터 롤백 기록
  • Time Change Event: 시간 변경(주로 날짜 변경) 시 발행되는 이벤트 (dayIndex 정보 포함)
  • DayChanged Event: 시스템의 날짜가 변경될 때 (자정 도달 또는 시간 조작) 발행되는 이벤트로, 다른 도메인의 일차별 로직 트리거용
  • TimeMachine Enabled State: 특정 사용자에 대해 TimeMachine 기능이 활성화되었는지 여부

2. 하위 컨텍스트​

2.1 가상 시간 컨텍스트 (Virtual Time Context)​

사용자별 가상 시간 관리와 시간 변경을 담당합니다.

책임​

  • 사용자별 가상 시간 생성 및 관리 (UTC 타임스탬프, Timezone ID)
  • 가상 시간 조회/설정/변경 (dayIndex 기반)
  • dayIndex 및 사용자 주기 정보(시작일, 중단 이력) 기반 목표 날짜 계산
  • 시간 변경 이력 관리
  • TimeMachine 기능 활성화/비활성화 관리

정책 및 규칙​

  1. 시간 표현 정책

    • 서버 내부 저장 및 클라이언트 응답 모두 13자리 Unix 타임스탬프(밀리초) 형식 사용
    • 시간대(timezone)는 항상 UTC 기준 및 사용자별 명시적 ID로 관리
  2. 시간 여행 (dayIndex 기반) 정책

    • 테스트 환경에서만 활성화 가능 (운영 환경 제한적 허용)
    • 시간 변경은 dayIndex (>=2)를 기준으로 수행
    • 목표 dayIndex에 해당하는 날짜 계산 시 사용자 주기 시작일 및 중단 이력 고려
    • 설정되는 시간은 계산된 날짜의 00:00 (사용자 타임존 기준)
    • 모든 시간 변경은 이력으로 기록

2.2 데이터 롤백 컨텍스트 (Data Rollback Context)​

시간 변경에 따른 데이터 정합성 유지를 담당합니다.

책임​

  • 과거 시점 (낮은 dayIndex)으로 이동 시 미래 데이터 롤백 트리거
  • 롤백 이력 관리
  • 사용자별 데이터 롤백 처리
  • TimeMachine 비활성화 시 데이터 정리

정책 및 규칙​

  1. 롤백 정책

    • 과거 시점(newTimeMs)으로 이동 시 해당 시점 이후(> newTimeMs 이고 <= previousTimeMs) 데이터 롤백
    • 롤백된 데이터 영구 삭제
    • 사용자별 데이터 격리로 다른 사용자 영향 없음
  2. 데이터 정합성 정책

    • 특정 시점의 데이터는 해당 시점의 비즈니스 규칙 적용
    • 데이터 롤백 시 트랜잭션으로 일관성 유지
    • 캐시 무효화로 클라이언트 데이터 정합성 보장

2.3 TimeMachine 활성화 시 데이터 관리 컨텍스트 (TimeMachine Enabled Data Management Context)​

TimeMachine 기능 활성화 시 생성되는 데이터의 격리와 관리를 담당합니다.

책임​

  • TimeMachine 활성화 상태 관리
  • TimeMachine 활성화 시 생성 데이터 격리
  • TimeMachine 활성화 시 데이터 생성 지원 (필요시)
  • TimeMachine 비활성화 시 데이터 처리

정책 및 규칙​

  1. 활성화 시 데이터 관리 정책

    • TimeMachine 활성화 시 생성된 데이터 식별을 위한 메타데이터 또는 컨텍스트 활용
    • 스키마 분리 또는 요청 컨텍스트를 통한 데이터 격리
    • 사용자별 데이터 격리
  2. 비활성화 정책

    • TimeMachine 비활성화 시 사용자의 가상 시간은 해당 사용자의 Timezone 기준 현재 실제 날짜의 00:00으로 재설정됨
    • 재설정된 시간 이후의 사용자 데이터는 영구 삭제됨
    • 비활성화 이력 기록

2.4 이벤트 관리 컨텍스트 (Event Management Context)​

시간 변경 이벤트의 발행과 구독을 관리합니다.

책임​

  • 시간 변경 이벤트 발행 (날짜 변경 시)
  • 시스템 날짜 변경 감지 및 DayChanged 이벤트 발행 (자정 도달, 시간 조작으로 인한 날짜 변경)
  • 이벤트 발행 이력 관리
  • 이벤트 구독 처리
  • 이벤트 재시도 관리

정책 및 규칙​

  1. 이벤트 발행 정책

    • 가상 시간의 날짜 변경 시 GCP Pub/Sub으로 이벤트 발행
    • 시스템의 날짜 변경 시 (자정 도달 또는 시간 조작) DayChanged 이벤트를 GCP Pub/Sub으로 발행하여 다른 도메인의 일차별 로직 트리거
    • 이벤트에 이전/이후 시간(UTC 타임스탬프), 이전/이후 dayIndex, 및 메타데이터 포함
    • 발행 실패 시 재시도 메커니즘 적용
  2. 이벤트 로깅 정책

    • 모든 이벤트 발행 이력 기록
    • 이벤트 상태 추적
    • 운영 환경 이벤트는 특별 모니터링

3. 컨텍스트 경계​

3.1 상위 컨텍스트​

  • User Domain: 사용자 정보 관리 (특히 Timezone ID)
  • UserCycle Domain (가칭): 사용자의 주기 시작일, 중단/재개 이력 관리
  • Audit Domain: 감사 로그 관리

3.2 하위 컨텍스트​

없음. TimeMachine은 말단 지원 도메인입니다.

3.3 외부 시스템​

  • GCP Pub/Sub: 이벤트 메시징
  • Redis Cache: 시간 정보 캐싱
  • Backend Services: 서비스에서 시간 정보 소비
  • Web Chat: 테스터용 인터페이스 (dayIndex 기반 시간 변경)
  • Mobile App: 시간 정보 소비자

4. 컨텍스트 매핑​

(Mermaid 다이어그램은 높은 수준 유지, 세부 파라미터 변경 생략 가능)

4.1 User Domain과의 관계 (Customer-Supplier)​

4.2 UserCycle Domain과의 관계 (Customer-Supplier)​

4.3 Backend Services와의 관계 (Conformist)​

4.4 Audit Domain과의 관계 (Published Language)​

4.5 Mobile App과의 관계 (Anti-corruption Layer)​

5. 도메인 이벤트​

5.1 발행하는 이벤트​

  • VirtualTimeCreated: 가상 시간이 생성됨
  • VirtualTimeChanged: 가상 시간이 변경됨 (페이로드에 이전/이후 ZonedDateTime, 이전/이후 dayIndex 포함)
  • VirtualTimeDateChanged: 가상 시간의 날짜가 변경됨 (위 이벤트로 통합 또는 별도 유지 시 dayIndex 포함)
  • DayChanged: 시스템의 날짜가 변경됨 (자정 도달 또는 시간 조작으로 인한 날짜 변경, 다른 도메인의 일차별 로직 트리거용)
  • VirtualTimeResetToReal: 가상 시간이 실제 시간으로 재설정됨
  • MovedToDayX: (제거됨)
  • MovedToWeekX: (제거됨)
  • UserVirtualTimeChanged: (VirtualTimeChanged로 통합 가능성 높음)
  • TimeMachineEnabled: TimeMachine 기능이 활성화됨
  • TimeMachineDisabled: TimeMachine 기능이 비활성화됨
  • FutureDataRolledBack: 미래 데이터가 롤백됨 (트리거된 시간 변경 정보 포함)
  • RollbackCompleted: 데이터 롤백 작업이 완료됨
  • FutureDataCleanedAfterDisable: TimeMachine 비활성화 후 미래 데이터가 정리됨
  • TimeChangeEventPublished: (VirtualTimeDateChanged 또는 VirtualTimeChanged로 통합)
  • ProdActivationAlertSent: 운영 환경 활성화 알림이 발송됨

5.2 구독하는 이벤트​

  • UserCreated: 새로운 사용자 생성 (사용자의 가상 시간 초기화)
  • UserDeactivated: 사용자 비활성화 (관련 가상 시간 데이터 처리)
  • UserCycleStarted: 사용자 주기 시작 (TimeMachine 관련 초기화)
  • UserCycleSuspended / Resumed: 사용자 주기 중단/재개 (dayIndex 계산에 영향)

6. 보안 정책​

  • 테스터 권한 기반 접근 제어
  • 운영 환경에서 TimeMachine 기능 제한적 접근
  • 사용자별 가상 시간 데이터 격리
  • 테스트 데이터 접근 제한
  • 시간 변경 이력 위변조 방지
  • 실패한 시간 변경 시도 로깅
  • 운영 환경 TimeMachine 활성화 알림
  • 타임스탬프 데이터 암호화

7. 기술 스택​

  • NestJS
  • TypeScript
  • PostgreSQL (가상 시간 정보, 롤백 이력)
  • Redis (시간 정보 캐싱)
  • GCP Pub/Sub (이벤트 메시징)
  • Docker (컨테이너화)
  • Cloud Run (컨테이너 배포 및 운영)

8. 변경 이력​

버전날짜작성자변경 내용
0.1.02025-03-12bok@weltcorp.com최초 작성
0.2.02025-05-06bok@weltcorp.comdayIndex 기반 시간 변경 반영 (용어, 책임, 컨텍스트, 이벤트 등 수정)
0.3.02025-06-02bok@weltcorp.com시스템 날짜 변경 감지 및 DayChanged 이벤트 발행 관련 내용 추가