TimeMachine 도메인 이벤트 스토밍
개요
본 문서는 TimeMachine 도메인의 이벤트 스토밍 워크샵 결과를 정리한 것입니다. TimeMachine 도메인은 불면증 디지털 치료제 서비스에서 시간을 가상으로 조작하여 테스트를 용이하게 하는 지원 도메인입니다. 사용자가 90일간의 프로그램을 진행하며 시간의 흐름에 따라 개인화된 치료 프로그램을 제공받는 시스템을 효과적으로 테스트하기 위해 필요합니다.
이 구현에서는 시간 변경의 기준으로 사용자의 치료 주기 일차(dayIndex)를 사용합니다.
바운디드 컨텍스트 참조
TimeMachine 도메인과 다른 도메인 간의 협력 관계는 독립적인 지원 도메인으로서 시간 조작 기능을 제공합니다. 시스템 복잡도를 낮추기 위해 Backend는 하나의 모놀리식 아키텍처로 우선 개발될 예정이지만, 도메인 경계는 논리적으로 명확히 구분하여 설계합니다. 이 문서에서는 주로 TimeMachine 도메인 내부의 이벤트와 명령에 집중합니다.
참고: 도메인 개념과 용어에 대한 자세한 내용은
domain-model.md문서를 참조하세요.
도메인 이벤트
도메인에서 발생하는 중요한 변화나 사실을 나타내는 이벤트들입니다.
1. 시간 관리 이벤트
1.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|---|---|
| VirtualTimeCreated | 사용자의 가상 시간이 최초 생성됨 | CreateVirtualTime |
| VirtualTimeQueried | 가상 시간이 조회됨 | GetCurrentTime |
| VirtualTimeChanged | 가상 시간이 변경됨 (dayIndex 변경 포함) | SetVirtualTimeByDayIndex, ResetVirtualTime |
| VirtualTimeDateChanged | 가상 시간의 날짜가 변경됨 (주로 dayIndex 변경 결과) | 날짜가 변경되는 시간 변경 |
| UserVirtualDayChanged | 특정 사용자의 가상 날짜가 변경됨 (TimeMachine으로 인한) | dayIndex 이동, 일시정지 기간 날짜 이동, 수동 시간 설정 |
| SystemDayChanged | 시스템 전체의 날짜가 변경됨 (실제 자정 도달 등) | 실제 시간의 자정 도달, 시스템 시간 조정 |
| VirtualTimeResetToReal | 가상 시간이 실제 시간으로 재설정됨 | ResetVirtualTime, DisableTimeMachine |
| MovedToDayIndex | 특정 치료 주기 일차(dayIndex)로 시간이 이동됨 | SetVirtualTimeByDayIndex |
| MovedToSuspensionDay | 특정 일시 정지 기간 내 날짜로 시간이 이동됨 | SetVirtualTimeBySuspensionDay |
| UserVirtualTimeChanged | 특정 사용자의 가상 시간이 변경됨 (VirtualTimeChanged로 통합 가능) | SetUserVirtualTimeByDayIndex, SetUserVirtualTimeBySuspensionDay |
| TimeMachineEnabled | 사용자의 TimeMachine 기능이 활성화됨 | EnableTimeMachine |
| TimeMachineDisabled | 사용자의 TimeMachine 기능이 비활성화됨 | DisableTimeMachine |
| ProdTimeMachineActivationAttempted | PROD 환경에서 TimeMachine 활성화 시도 감지됨 | EnableTimeMachine in PROD |
| TimeSettingAuthorizationFailed | 권한 없는 사용자의 시간 설정 시도 차단됨 | 권한 검증 실패 |
| InvalidDayIndexRequested | 유효하지 않은 dayIndex (예: 1 이하)로 시간 설정 시도 | SetVirtualTimeByDayIndex |
| InvalidSuspensionSequenceRequested | 유효하지 않은 일시 정지 기간 순서로 시간 설정 시도 | SetVirtualTimeBySuspensionDay |
| InvalidDayWithinSuspensionRequested | 일시 정지 기간 내 유효하지 않은 날짜로 시간 설정 시도 | SetVirtualTimeBySuspensionDay |
1.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|---|---|
| DayIndexSettingRequested | 사용자가 dayIndex 기반 시간 변경을 요청함 | dayIndex 변경 UI 조작 |
| SuspensionDaySettingRequested | 사용자가 일시 정지 기간 내 날짜 기반 시간 변경을 요청함 | 정지 기간 날짜 변경 UI 조작 |
| TimeResetRequested | 사용자가 실제 시간으로 재설정을 요청함 | 재설정 버튼 클릭 |
| TimeMachineToggleRequested | 사용자가 TimeMachine 기능 활성화/비활성화 토글을 요청함 | 토글 버튼 클릭 |
| VirtualTimeHistoryRequested | 사용자가 가상 시간 변경 이력 조회를 요청함 | 이력 조회 UI 접근 |
| UserVirtualTimeSelectionChanged | 테스터가 다른 사용자의 가상 시간 선택을 변경함 | 사용자 선택 UI 조작 |
| ProdTimeMachineAccessCodeEntered | PROD 환경에서 TimeMachine 접근을 위한 코드가 입력됨 | 비밀 코드 입력 |
2. 데이터 정합성 이벤트
2.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|---|---|
| FutureDataRolledBack | 과거 시점 (낮은 dayIndex)으로 이동 시 미래 데이터가 롤백됨 | 과거 dayIndex로의 시간 이동 |
| RollbackCompleted | 데이터 롤백 작업이 완료됨 | 롤백 처리 완료 |
| RollbackFailed | 데이터 롤백 작업이 실패함 | 롤백 처리 중 오류 발생 |
| FutureDataCleanedAfterDisable | TimeMachine 비활성화 후 미래 데이터가 정리됨 | DisableTimeMachine |
| DataDeletionRequested | 다른 도메인에 데이터 삭제 요청이 발행됨 (cutoff time 이후 데이터 삭제) | TimeMachine 비활성화, 과거로 시간 이동 |
| UserDataCleanupInitiated | 특정 사용자의 데이터 정리 작업이 시작됨 | 데이터 삭제 요청 처리 시작 |
| TimeBasedDataDeletionCompleted | 각 도메인에서 시간 기반 데이터 삭제가 완료됨 | 도메인별 데이터 삭제 완료 |
| RollbackHistoryRecorded | 롤백 이력이 기록됨 | 롤백 작업 완료 |
| SameUserDataRollbackInitiated | 특정 사용자의 데이터만 롤백 시작됨 | 사용자별 시간 변경 |
| RollbackTransactionInitiated | 데이터 일관성을 위한 롤백 트랜잭션 시작됨 | 롤백 작업 시작 |
| RollbackTransactionCompleted | 롤백 트랜잭션이 완료됨 | 롤백 트랜잭션 완료 |
2.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|---|---|
| LocalCacheCleared | 로컬 캐시가 초기화됨 | 시간 변경 이벤트 수신 |
| CacheInvalidationStarted | 캐시 무효화 작업이 시작됨 | 시간 변경 감지 |
| CacheInvalidationCompleted | 캐시 무효화 작업이 완료됨 | 캐시 무효화 완료 |
| TimeTravelLoadingStarted | 시간 이동 처리 중 로딩 UI 표시 시작 | dayIndex 변경 요청 |
| TimeTravelLoadingCompleted | 시간 이동 처리 완료 및 로딩 UI 종료 | 처리 완료 |
| DisableConfirmationRequested | TimeMachine 비활성화 전 사용자 확인 요청됨 | 비활성화 요청 |
| DisableDataDeletionWarningDisplayed | 비활성화 시 데이터 삭제 경고 표시됨 | 비활성화 확인 과정 |
| DataDeletionProgressUpdated | 데이터 삭제 진행 상태 업데이트됨 | 삭제 작업 진행 중 |
3. 이벤트 관리 이벤트
3.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|---|---|
| PublishTimeChangeEvent | 시간 변경 이벤트 발행 | TimeChangeEventPublished 이벤트 발생 |
| PublishUserVirtualDayChangeEvent | 사용자 가상 날짜 변경 이벤트 발행 (사용자별 일차별 로직 트리거용) | UserVirtualDayChanged 이벤트를 GCP Pub/Sub에 발행 |
| PublishSystemDayChangeEvent | 시스템 날짜 변경 이벤트 발행 (전역 일차별 로직 트리거용) | SystemDayChanged 이벤트를 GCP Pub/Sub에 발행 |
| RetryEventPublish | 이벤트 발행 재시도 | EventPublishRetried 이벤트 발생 |
| LogEventHistory | 이벤트 발행 로그 기록 | EventLogRecorded 이벤트 발생 |
| SubscribeToTimeEvents | 시간 변경 이벤트 구독 | 이벤트 구독 설정 |
| ProcessSubscribedEvent | 구독한 이벤트 처리 | EventPushedToEndpoint 이벤트 발생 |
| PublishStatusChangeEvent | 상태 변경 이벤트 발행 | TimeMachineStatusChangeEventPublished 이벤트 발생 |
| SendProdActivationAlert | PROD 활성화 알림 발송 | ProdActivationAlertSent 이벤트 발생 |
| GetEventHistory | 이벤트 발행 이력 조회 | 이벤트 이력 정보 제공 |
| FilterEventsByUser | 사용자별 이벤트 필터링 | 필터링된 이벤트 정보 제공 |
3.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|---|---|
| EventHistoryRequested | 이벤트 발행 이력 조회 요청됨 | 이력 조회 UI 접근 |
| EventRetryRequested | 실패한 이벤트 재시도 요청됨 | 재시도 버튼 클릭 |
| EventStatusUpdated | 이벤트 처리 상태 업데이트됨 | 상태 변경 |
| UserEventFilterApplied | 사용자별 이벤트 필터 적용됨 | 필터 UI 조작 |
정책(Policies)
시스템의 자동화된 비즈니스 규칙입니다.
시간 관리 정책
백엔드 정책
- 테스터 권한 검증 정책: 테스터 권한을 가진 사용자만 시간 변경 가능
- 사용자별 가상 시간 관리 정책: 사용자별로 독립적인 가상 시간 관리
- 특정
dayIndex로 이동 정책: 목표dayIndex에 해당하는 날짜를 사용자 주기 시작일 및 중단 이력을 고려하여 계산하고, 해당 날짜의 00:00(사용자 타임존)으로 설정 dayIndex유효성 정책:dayIndex는 2 이상이어야 함 (1일차 이전 설정 불가)- SetTimeBySuspensionDayPolicy (정지 기간 내 특정 날짜로 이동 정책): 사용자의
UserSuspensionHistory를 참조하여 요청된suspensionSequence에 해당하는 정지 기간과 그 안의dayWithinSuspension번째 날짜를 계산하고, 해당 날짜의 00:00(사용자 타임존)으로 설정. 입력 값(순서, 기간 내 날짜) 유효성 검증 포함. - 사용자 가상 날짜 변경 감지 정책: 사용자의 TimeMachine 조작으로 인한 가상 날짜 변경 시
UserVirtualDayChanged이벤트 발행하여 해당 사용자의 컨텐츠 해금, rTIB 계산 등 개별 로직 트리거 - 시스템 날짜 변경 감지 정책: 실제 시간의 자정 도달 또는 시스템 시간 조정으로 인한 날짜 변경 시
SystemDayChanged이벤트 발행하여 모든 사용자에게 영향을 미치는 전역 일차별 로직 트리거 - 환경별 접근 정책: 환경(개발, 테스트, 스테이징, PROD)에 따른 접근 제한
- 캐시 관리 정책: 가상 시간 캐싱을 통한 성능 최적화
프론트엔드 정책
- TimeMachine 기능 활성화/비활성화 정책: 사용자의 선택에 따른 기능 전환
- 오프라인 대응 정책: 네트워크 연결 상태에 따른 로컬 시간 사용
- 환경별 UI 표시 정책: 환경에 따른 TimeMachine 기능 노출 제한
- PROD 보안 메커니즘 정책: PROD 환경에서 특별한 권한을 가진 테스터에게만 기능 제공
데이터 정합성 정책
백엔드 정책
- 데이터 롤백 정책: 과거 시점 (낮은
dayIndex)으로 시간 이동 시 미래 데이터 롤백 - 롤백 데이터 관리 정책: 롤백된 데이터 영구 제거
- 사용자별 데이터 격리 정책: 다른 사용자의 데이터에 영향 없는 롤백
- 비활성화 데이터 정리 정책: TimeMachine 비활성화 시 사용자의 가상 시간을 해당 사용자의 Timezone 기준 현재 실제 날짜 00:00으로 재설정하고, 재설정된 시간 이후의 데이터는 영구 삭제
- 크로스 도메인 데이터 삭제 정책: TimeMachine 비활성화 또는 과거로 시간 이동 시
DataDeletionRequested이벤트를 발행하여 다른 도메인들이 cutoff time 이후 데이터 삭제 - 도메인별 삭제 완료 보고 정책: 각 도메인은 데이터 삭제 완료 후
TimeBasedDataDeletionCompleted이벤트로 결과 보고
프론트엔드 정책
- 캐시 무효화 정책: 시간 변경 시 로컬 캐시 초기화
- 사용자 알림 정책: 데이터 삭제 영향에 대한 사용자 알림 및 확인
이벤트 관리 정책
백엔드 정책
- 이벤트 발행 정책: 날짜 변경 시 GCP Pub/Sub 이벤트 발행 (dayIndex 정보 포함)
- 사용자 가상 날짜 변경 이벤트 발행 정책:
UserVirtualDayChanged이벤트 발행을 통해 해당 사용자의 개별 일차별 로직(컨텐츠 해금, rTIB 계산 등) 트리거 - 시스템 날짜 변경 이벤트 발행 정책:
SystemDayChanged이벤트 발행을 통해 모든 사용자에게 영향을 미치는 전역 일차별 로직 트리거 - 이벤트 재시도 정책: 발행 실패 시 재시도 메커니즘
- 이벤트 로깅 정책: 발행 및 구독 이력 기록
- PROD 알림 정책: PROD 환경에서 TimeMachine 활성화 시 관리자 알림
프론트엔드 정책
- 이벤트 상태 표시 정책: 이벤트 처리 상태 실시간 반영
- 사용자별 필터링 정책: 사용자별 이벤트 필터링 지원
보안 정책
백엔드 정책
- RBAC 정책: 역할 기반 접근 제어 구현
- 데이터 암호화 정책: 저장 데이터 암호화
- 통신 보안 정책: TLS 적용
- 감사 로깅 정책: 보안 관련 로그 기록 및 보호
프론트엔드 정책
- PROD 제한 정책: PROD 환경에서 일반 사용자에게 기능 노출 제한
- 접근 코드 정책: 특별한 제스처나 코드를 통한 접근 제한
명령(Commands)
도메인 이벤트를 발생시키는 사용자 의도나 시스템 동작입니다.
1. 시간 관리 명령
1.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|---|---|
| CreateVirtualTime | 사용자의 가상 시간 초기 생성 | VirtualTimeCreated 이벤트 발생 |
| GetCurrentTime | 현재 가상 시간 조회 | VirtualTimeQueried 이벤트 발생 |
| SetVirtualTimeByDayIndex | 가상 시간을 특정 치료 주기 일차(dayIndex)로 설정 | VirtualTimeChanged, MovedToDayIndex 이벤트 발생 (과거 이동 시 FutureDataRolledBack 트리거) |
| SetVirtualTimeBySuspensionDay | 가상 시간을 특정 일시 정지 기간 내 날짜로 설정 | VirtualTimeChanged, MovedToSuspensionDay 이벤트 발생 (과거 이동 시 FutureDataRolledBack 트리거) |
| ResetVirtualTime | 가상 시간을 실제 시간으로 재설정 | VirtualTimeResetToReal 이벤트 발생 |
| CheckDateChange | 시스템의 현재 시간에서 날짜 변경 여부 확인 | 시스템 날짜 변경 시 SystemDayChanged 이벤트 발생, 사용자 가상 날짜 변경 시 UserVirtualDayChanged 이벤트 발생 |
| GetTimeChangeHistory | 시간 변경 이력 조회 | 시간 변경 이력 제공 |
| GetUserVirtualTime | 특정 사용자의 가상 시간 조회 | 사용자별 가상 시간 정보 제공 |
| EnableTimeMachine | 사용자의 TimeMachine 기능 활성화 | TimeMachineEnabled 이벤트 발생 |
| DisableTimeMachine | 사용자의 TimeMachine 기능 비활성화 (사용자 Timezone 기준 실제 시간 00:00으로 재설정 및 데이터 롤백 트리거) | TimeMachineDisabled, VirtualTimeResetToReal, FutureDataRolledBack 이벤트 발생 |
| GetTimeMachineStatus | 사용자의 TimeMachine 기능 활성화 상태 조회 | 활성화 상태 정보 제공 |
| VerifyTesterPermission | 테스터 권한 검증 | 권한 검증 결과 제공 |
1.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|---|---|
| RequestDayIndexChange | dayIndex 기반 시간 변경 요청 | DayIndexSettingRequested 이벤트 발생 |
| RequestSuspensionDayChange | 일시 정지 기간 내 날짜 기반 시간 변경 요청 | SuspensionDaySettingRequested 이벤트 발생 |
| RequestTimeReset | 실제 시간으로 재설정 요청 | TimeResetRequested 이벤트 발생 |
| ToggleTimeMachine | TimeMachine 기능 토글 요청 | TimeMachineToggleRequested 이벤트 발생 |
| ViewTimeChangeHistory | 시간 변경 이력 조회 요청 | VirtualTimeHistoryRequested 이벤트 발생 |
| SelectUserForTimeMachine | 시간 관리할 사용자 선택 | UserVirtualTimeSelectionChanged 이벤트 발생 |
| EnterProdAccessCode | PROD 환경 접근 코드 입력 | ProdTimeMachineAccessCodeEntered 이벤트 발생 |
| DisplayTimeMachineDashboard | 여러 사용자의 가상 시간 상태 대시보드 표시 | 대시보드 UI 렌더링 |
2. 데이터 정합성 명령
2.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|---|---|
| RollbackFutureData | 미래 데이터 롤백 | FutureDataRolledBack 이벤트 발생 |
| PermanentlyDeleteRolledBackData | 롤백된 데이터 영구 삭제 | 영구 데이터 삭제 처리 |
| GetRollbackHistory | 롤백 이력 조회 | 롤백 이력 정보 제공 |
| CleanFutureDataAfterDisable | (사용되지 않음 - DisableTimeMachine 명령이 롤백 트리거) | |
| PublishDataDeletionRequest | 다른 도메인에 데이터 삭제 요청 발행 | DataDeletionRequested 이벤트 발생 |
| InitiateUserDataCleanup | 사용자 데이터 정리 작업 시작 | UserDataCleanupInitiated 이벤트 발생 |
| ReportDataDeletionCompletion | 도메인별 데이터 삭제 완료 보고 | TimeBasedDataDeletionCompleted 이벤트 발생 |
| InitiateUserDataRollback | 특정 사용자의 데이터 롤백 시작 | SameUserDataRollbackInitiated 이벤트 발생 |
| BeginRollbackTransaction | 롤백 트랜잭션 시작 | RollbackTransactionInitiated 이벤트 발생 |
| CommitRollbackTransaction | 롤백 트랜잭션 커밋 | RollbackTransactionCompleted 이벤트 발생 |
2.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|---|---|
| ClearLocalCache | 로컬 캐시 초기화 | LocalCacheCleared 이벤트 발생 |
| InvalidateCache | 캐시 무효화 | CacheInvalidationStarted 이벤트 발생 |
| ShowTimeTravelLoading | 시간 이동 로딩 UI 표시 | TimeTravelLoadingStarted 이벤트 발생 |
| ConfirmTimeMachineDisable | TimeMachine 비활성화 확인 | DisableConfirmationRequested 이벤트 발생 |
| ShowDataDeletionWarning | 데이터 삭제 경고 표시 | DisableDataDeletionWarningDisplayed 이벤트 발생 |
| UpdateDataDeletionProgress | 데이터 삭제 진행 상태 업데이트 | DataDeletionProgressUpdated 이벤트 발생 |
| ViewRollbackHistory | 롤백 이력 조회 | 롤백 이력 UI 표시 |
| ShowRollbackWarning | 시간만 과거로 이동해도 데이터 롤백됨을 경고 | 경고 메시지 표시 |
3. 이벤트 관리 명령
3.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|---|---|
| PublishTimeChangeEvent | 시간 변경 이벤트 발행 | TimeChangeEventPublished 이벤트 발생 |
| PublishUserVirtualDayChangeEvent | 사용자 가상 날짜 변경 이벤트 발행 (사용자별 일차별 로직 트리거용) | UserVirtualDayChanged 이벤트를 GCP Pub/Sub에 발행 |
| PublishSystemDayChangeEvent | 시스템 날짜 변경 이벤트 발행 (전역 일차별 로직 트리거용) | SystemDayChanged 이벤트를 GCP Pub/Sub에 발행 |
| RetryEventPublish | 이벤트 발행 재시도 | EventPublishRetried 이벤트 발생 |
| LogEventHistory | 이벤트 발행 로그 기록 | EventLogRecorded 이벤트 발생 |
| SubscribeToTimeEvents | 시간 변경 이벤트 구독 | 이벤트 구독 설정 |
| ProcessSubscribedEvent | 구독한 이벤트 처리 | EventPushedToEndpoint 이벤트 발생 |
| PublishStatusChangeEvent | 상태 변경 이벤트 발행 | TimeMachineStatusChangeEventPublished 이벤트 발생 |
| SendProdActivationAlert | PROD 활성화 알림 발송 | ProdActivationAlertSent 이벤트 발생 |
| GetEventHistory | 이벤트 발행 이력 조회 | 이벤트 이력 정보 제공 |
| FilterEventsByUser | 사용자별 이벤트 필터링 | 필터링된 이벤트 정보 제공 |
3.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|---|---|
| ViewEventHistory | 이벤트 발행 이력 보기 | EventHistoryRequested 이벤트 발생 |
| RequestEventRetry | 실패한 이벤트 재시도 요청 | EventRetryRequested 이벤트 발생 |
| FilterEventsByUser | 사용자별 이벤트 필터링 | UserEventFilterApplied 이벤트 발생 |
| UpdateEventStatus | 이벤트 상태 업데이트 | EventStatusUpdated 이벤트 발생 |
액터(Actors)
시스템과 상호작용하는 주체들입니다.
내부 액터
| 액터 | 설명 | 주요 명령 |
|---|---|---|
| 일반 사용자 | 모바일 앱 사용자 | TimeMachine 활성화/비활성화, 시간 조회 |
| 테스터 | 테스트 권한이 있는 사용자 | 가상 시간 설정, 사용자별 시간 변경 |
| 시스템 관리자 | TimeMachine 시스템 관리자 | 모니터링, 롤백 관리, 이벤트 관리 |
| 앱 | 모바일 애플리케이션 | 시간 조회, 캐시 관리 |
외부 액터
| 액터 | 설명 | 주요 명령 |
|---|---|---|
| GCP Pub/Sub | 메시징 서비스 | 이벤트 발행 및 구독 |
| Backend 서비스 | 다른 마이크로서비스 | 시간 조회, 이벤트 구독 |
| Web Chat 서비스 | 테스터용 인터페이스 | 시간 변경, 사용자 선택, 이력 조회 |
| Redis Cache | 캐시 서비스 | 시간 데이터 캐싱 |
집계(Aggregates)
연관된 엔티티와 값 객체들의 클러스터입니다.
VirtualTime 집계
- 루트: VirtualTime
- 엔티티: UserVirtualTime, TimeChangeRecord
- 값 객체: ChangeType, DayIndex, SuspensionSequence(선택적), DayWithinSuspension(선택적)
- 불변식:
- 하나의 사용자는 하나의 VirtualTime 상태만 가질 수 있음
- 시간 변경 이력은 불변으로 유지됨 (
TimeChangeRecord에 변경 유형 및 관련 정보 포함:dayIndex또는suspensionSequence/dayWithinSuspension등) - 시간 변경은 테스터 권한이 있는 사용자만 가능
dayIndex는 2 이상이어야 함- 설정된 시간은 계산된
dayIndex해당 날짜 또는 정지 기간 내 날짜의 00:00(사용자 타임존)임
DataRollback 집계
- 루트: RollbackManager
- 엔티티: RollbackRecord, RollbackTransaction
- 값 객체: RollbackAction, AffectedEntity
- 불변식:
- 롤백은 과거 시점으로 이동 시에만 발생
- 롤백된 데이터는 영구 삭제되며 복구 불가
- 롤백은 사용자별로 독립적으로 수행됨
- 롤백 과정에서 데이터 일관성이 유지되어야 함
EventPublish 집계
- 루트: EventManager
- 엔티티: TimeChangeEvent, EventLog
- 값 객체: EventStatus, EventMetadata
- 불변식:
- 날짜 변경 시 항상 이벤트가 발행됨
- 발행 실패한 이벤트는 재시도 메커니즘을 통해 처리됨
- 모든 이벤트 발행 이력은 로그로 기록됨
- 이벤트에는 사용자 식별 정보가 포함됨
TimeMachineActivation 집계
- 루트: ActivationManager
- 엔티티: TimeMachineActivationStatus, ActivationChangeRecord
- 값 객체: ActivationState, Environment
- 불변식:
- 기능 활성화/비활성화 상태는 사용자별로 관리됨
- PROD 환경에서는 특별 권한을 가진 사용자만 기능 활성화 가능
- 비활성화 시 사용자의 가상 시간은 해당 사용자의 Timezone 기준 현재 실제 날짜 00:00으로 재설정되며, 이후 데이터는 영구 삭제됨
- 상태 변경 이력은 영구 보관됨
핫스팟 및 해결책
1. 다중 사용자 시간 관리 확장성
문제: 대규모 사용자의 개별 가상 시간 관리 시 성능 저하 해결책:
- 사용자별 인덱싱 전략으로 DB 성능 향상
- Redis 캐싱을 통한 조회 성능 최적화
- 단일 Backend 내에서 효율적인 가상 시간 관리 구현
2. 데이터 롤백 일관성
문제: 과거 시점으로 이동 시 관련 데이터의 일관된 롤백 보장 해결책:
- 트랜잭션 기반 롤백 메커니즘 구현
- 롤백 작업의 원자성 보장
- 사용자별 독립적 롤백 처리로 영향 범위 제한
3. 이벤트 발행 신뢰성
문제: GCP Pub/Sub 이벤트 발행 실패 시 데이터 불일치 가능성 해결책:
- 재시도 메커니즘 구현
- 이벤트 발행 상태 추적 및 모니터링
- 실패 시 알림 및 수동 개입 지원
4. 환경별 접근 제어
문제: PROD 환경에서 TimeMachine 기능의 안전한 제한 해결책:
- 환경별 접근 정책 차등 적용
- 특별 권한 및 이중 인증 메커니즘
- PROD 환경 활성화 시 관리자 알림 자동화
- 단일 Backend 내에서 모든 환경에 대한 일관된 접근 제어 정책 적용
5. 오프라인 시간 조회
문제: 네트워크 연결 불안정 시 시간 조회 기능 유지 해결책:
- 로컬 시간 대체 메커니즘 구현
- 네트워크 상태에 따른 전략 패턴 적용
- 기능 비활성화 상태에서의 완전 오프라인 지원
6. 대용량 데이터 롤백 성능
문제: 대량 데이터의 효율적인 롤백 처리 해결책:
- 비동기 롤백 처리 구현
- 롤백 작업 분할 및 배치 처리
- 진행 상태 모니터링 및 UI 표시
7. dayIndex 및 정지 기간 계산 복잡성
문제: dayIndex 계산 시 사용자의 주기 시작일 및 모든 중단/재개 이력을 정확히 반영해야 하고, 정지 기간 내 특정 날짜 계산 시에도 복잡한 UserSuspensionHistory 조회 및 날짜 계산 로직이 필요하여 외부 도메인(UserCycle) 의존성 발생 및 로직 복잡성 증가
해결책:
@shared/utils에dayIndex및 정지 기간 날짜 계산 로직을 포함한 견고한 시간 유틸리티 함수 구현 및 테스트- UserCycle 도메인과의 명확한 인터페이스 정의 및 안정적인 데이터 조회 보장
- 계산 로직에 대한 단위 테스트 및 통합 테스트 강화
- 계산 결과를 캐싱하여 성능 최적화 고려 (단, 중단 이력 변경 시 캐시 무효화 필요)
변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|---|---|---|
| 1.0.0 | 2025-04-01 | bok@weltcorp.com | 최초 작성 |
| 1.1.0 | 2025-05-06 | bok@weltcorp.com | dayIndex 기반 시간 변경 반영 (이벤트, 정책, 명령, 집계, 핫스팟 등 수정) |
| 1.1.1 | 2025-05-07 | bok@weltcorp.com | '일시 정지 기간 중 날짜 이동' 기능 관련 이벤트, 정책, 명령, 집계, 핫스팟 정보 추가 |
| 1.2.0 | 2025-06-02 | bok@weltcorp.com | DayChanged 이벤트를 SystemDayChanged(시스템 레벨)와 UserVirtualDayChanged(사용자 레벨)로 분리하여 설계 개선 |
| 1.3.0 | 2025-07-24 | bok@weltcorp.com | 크로스 도메인 데이터 삭제 이벤트 추가 (DataDeletionRequested, UserDataCleanupInitiated, TimeBasedDataDeletionCompleted) |