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 기능 활성화/비활성화 관리
정책 및 규칙
-
시간 표현 정책
- 서버 내부 저장 및 클라이언트 응답 모두 13자리 Unix 타임스탬프(밀리초) 형식 사용
- 시간대(timezone)는 항상 UTC 기준 및 사용자별 명시적 ID로 관리
-
시간 여행 (
dayIndex기반) 정책- 테스트 환경에서만 활성화 가능 (운영 환경 제한적 허용)
- 시간 변경은
dayIndex(>=2)를 기준으로 수행 - 목표
dayIndex에 해당하는 날짜 계산 시 사용자 주기 시작일 및 중단 이력 고려 - 설정되는 시간은 계산된 날짜의 00:00 (사용자 타임존 기준)
- 모든 시간 변경은 이력으로 기록
2.2 데이터 롤백 컨텍스트 (Data Rollback Context)
시간 변경에 따른 데이터 정합성 유지를 담당합니다.
책임
- 과거 시점 (낮은
dayIndex)으로 이동 시 미래 데이터 롤백 트리거 - 롤백 이력 관리
- 사용자별 데이터 롤백 처리
- TimeMachine 비활성화 시 데이터 정리
정책 및 규칙
-
롤백 정책
- 과거 시점(
newTimeMs)으로 이동 시 해당 시점 이후(> newTimeMs이고<= previousTimeMs) 데이터 롤백 - 롤백된 데이터 영구 삭제
- 사용자별 데이터 격리로 다른 사용자 영향 없음
- 과거 시점(
-
데이터 정합성 정책
- 특정 시점의 데이터는 해당 시점의 비즈니스 규칙 적용
- 데이터 롤백 시 트랜잭션으로 일관성 유지
- 캐시 무효화로 클라이언트 데이터 정합성 보장
2.3 TimeMachine 활성화 시 데이터 관리 컨텍스트 (TimeMachine Enabled Data Management Context)
TimeMachine 기능 활성화 시 생성되는 데이터의 격리와 관리를 담당합니다.
책임
- TimeMachine 활성화 상태 관리
- TimeMachine 활성화 시 생성 데이터 격리
- TimeMachine 활성화 시 데이터 생성 지원 (필요시)
- TimeMachine 비활성화 시 데이터 처리
정책 및 규칙
-
활성화 시 데이터 관리 정책
- TimeMachine 활성화 시 생성된 데이터 식별을 위한 메타데이터 또는 컨텍스트 활용
- 스키마 분리 또는 요청 컨텍스트를 통한 데이터 격리
- 사용자별 데이터 격리
-
비활성화 정책
- TimeMachine 비활성화 시 사용자의 가상 시간은 해당 사용자의 Timezone 기준 현재 실제 날짜의 00:00으로 재설정됨
- 재설정된 시간 이후의 사용자 데이터는 영구 삭제됨
- 비활성화 이력 기록
2.4 이벤트 관리 컨텍스트 (Event Management Context)
시간 변경 이벤트의 발행과 구독을 관리합니다.
책임
- 시간 변경 이벤트 발행 (날짜 변경 시)
- 시스템 날짜 변경 감지 및
DayChanged이벤트 발행 (자정 도달, 시간 조작으로 인한 날짜 변경) - 이벤트 발행 이력 관리
- 이벤트 구독 처리
- 이벤트 재시도 관리
정책 및 규칙
-
이벤트 발행 정책
- 가상 시간의 날짜 변경 시 GCP Pub/Sub으로 이벤트 발행
- 시스템의 날짜 변경 시 (자정 도달 또는 시간 조작)
DayChanged이벤트를 GCP Pub/Sub으로 발행하여 다른 도메인의 일차별 로직 트리거 - 이벤트에 이전/이후 시간(UTC 타임스탬프), 이전/이후
dayIndex, 및 메타데이터 포함 - 발행 실패 시 재시도 메커니즘 적용
-
이벤트 로깅 정책
- 모든 이벤트 발행 이력 기록
- 이벤트 상태 추적
- 운영 환경 이벤트는 특별 모니터링
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.0 | 2025-03-12 | bok@weltcorp.com | 최초 작성 |
| 0.2.0 | 2025-05-06 | bok@weltcorp.com | dayIndex 기반 시간 변경 반영 (용어, 책임, 컨텍스트, 이벤트 등 수정) |
| 0.3.0 | 2025-06-02 | bok@weltcorp.com | 시스템 날짜 변경 감지 및 DayChanged 이벤트 발행 관련 내용 추가 |