본문으로 건너뛰기

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 이벤트 발행 관련 내용 추가