본 문서는 Agent Board 도메인의 이벤트 스토밍 워크샵 결과를 정리한 것입니다. Agent Board는 Message Delivery & Tracking Layer로서 Agent Treatment Flow로부터 완성된 Board 데이터를 받아 적절한 클라이언트에게 실시간으로 전달하고, 사용자의 모든 상호작용을 저장하여 치료 효과 분석을 지원하는 도메인입니다. Agent Board는 템플릿 렌더링이나 메시지 생성을 수행하지 않으며, 순수하게 Board의 저장, 표시, 상호작용 추적에만 집중합니다.
도메인 이벤트
도메인에서 발생하는 메시지 저장, 전달, 상호작용 추적 관련 이벤트들입니다.
1. 메시지 저장 및 전달 이벤트
1.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| MessageReceived | Treatment Flow로부터 메시지 수신 | API 호출 |
| MessagePersisted | 메시지가 PostgreSQL에 저장됨 | DB 저장 완료 |
| MessageQueued | 메시지가 전달 대기 큐에 추가됨 | 메시지 저장 |
| MessageDelivered | 메시지가 클라이언트에 전달됨 | SSE 전송 |
| MessageViewed | 사용자가 메시지를 확인함 | 클라이언트 이벤트 |
| MessageInteracted | 사용자가 메시지와 상호작용함 | 클라이언트 이벤트 |
| MessageExpired | 메시지 TTL 만료 | 타이머 |
| MessageArchived | 메시지가 아카이빙됨 | 30일 경과 |
| SSEConnected | SSE 연결 성공 | 연결 시도 |
| SSEDisconnected | SSE 연결 끊김 | 네트워크 오류 |
| HeartbeatReceived | 하트비트 응답 수신 | 클라이언트 응답 |
1.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| MessageRendering | 메시지 렌더링 시작 | 메시지 수신 |
| MessageRendered | 메시지 렌더링 완료 | DOM/View 마운트 |
| MessageVisible | 메시지가 뷰포트에 진입 | Intersection Observer |
| MessageHidden | 메시지가 뷰포트를 벗어남 | Intersection Observer |
| AnimationStarted | 애니메이션 시작 | 렌더링/제거 |
| AnimationCompleted | 애니메이션 완료 | 애니메이션 종료 |
| MessageExpiredOnClient | 클라이언트에서 TTL 만료 | 타이머 |
| MessageRemoved | 메시지가 DOM에서 제거됨 | remove() 호출 |
2. 상호작용 저장 및 추적 이벤트
2.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| InteractionBatchReceived | 상호작용 배치 수신 | 클라이언트 전송 |
| InteractionPersisted | 상호작용이 PostgreSQL에 저장됨 | DB 저장 완료 |
| DailySummaryGenerated | 일별 상호작용 통계 생성됨 | 자정 스케줄러 |
| AnalyticsQueryExecuted | Treatment Flow가 분석 데이터 조회 | API 호출 |
| InteractionForwarded | Treatment Flow에 전달 완료 | API 호출 |
| CacheUpdated | Redis 캐시 업데이트됨 | 데이터 변경 |
| OldInteractionsArchived | 90일 지난 상호작용 아카이빙 | 스케줄러 |
2.2 프론트엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| UserTapped | 사용자 탭/클릭 | 터치/클릭 이벤트 |
| UserSwiped | 사용자 스와이프 | 스와이프 제스처 |
| ActionTriggered | 액션 버튼 클릭 | 버튼 터치 |
| DismissTriggered | 닫기 버튼 클릭 | 닫기 터치 |
| ViewTimeStarted | 노출 시간 측정 시작 | 메시지 50% 이상 보임 |
| ViewTimeEnded | 노출 시간 측정 종료 | 메시지 50% 미만 보임 |
| ViewThresholdReached | 3초 노출 달성 | 타이머 |
| InteractionQueued | 상호작용 큐에 추가 | 이벤트 발생 |
| BatchSent | 배치 전송 완료 | 네트워크 전송 |
| OfflineQueued | 오프라인 큐에 저장 | 네트워크 없음 |
3. 연결 관리 이벤트
3.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| ConnectionRegistered | 새 연결이 Redis에 등록됨 | SSE 연결 |
| ConnectionStatusUpdated | 연결 상태 변경됨 | 상태 변화 |
| StaleConnectionsCleaned | 오래된 연결 정리됨 | 타이머 |
| MissedMessagesSynced | 놓친 메시지 동기화됨 | 재연결 |
4. 데이터 관리 이벤트
4.1 백엔드 이벤트
| 이벤트 | 설명 | 트리거 |
|---|
| DatabaseQueryExecuted | DB 쿼리 실행됨 | 데이터 조회 |
| IndexOptimized | DB 인덱스 최적화됨 | 정기 작업 |
| DataIntegrityVerified | 데이터 정합성 검증 완료 | 정기 검사 |
| BackupCompleted | 데이터 백업 완료 | 스케줄러 |
정책(Policies)
시스템의 자동화된 메시지 관리 및 데이터 저장 규칙입니다.
메시지 저장 및 전달 정책
백엔드 정책
- Treatment Flow로부터 받은 모든 메시지는 PostgreSQL에 영구 저장
- 사용자 접속 시 미전달/미확인 메시지를 우선순위에 따라 전달
- 메시지 상태 추적: PENDING → DELIVERED → VIEWED → INTERACTED → ARCHIVED
- TTL 만료 또는 30일 경과 시 자동 아카이빙
- 연결이 끊어진 경우 메시지를 큐에 저장 (사용자당 최대 1000개)
- 재연결 시 큐의 메시지를 순서대로 전송
프론트엔드 정책
- displayRules.layout에 따라 적절한 렌더러 선택
- 알 수 없는 레이아웃은 DefaultRenderer 사용
- 렌더링 실패 시 FallbackRenderer로 텍스트만 표시
- TTL 만료 시 자동으로 메시지 제거
- displayRules.priority 값으로 표시 순서 결정
- 오프라인 상태에서도 캐시된 메시지 표시 (최근 7일)
상호작용 저장 및 추적 정책
백엔드 정책
- 모든 사용자 상호작용을 PostgreSQL에 영구 저장
- 일별로 상호작용 통계 자동 집계 (매일 자정)
- 원본 데이터는 90일 보관, 집계 데이터는 영구 보관
- Treatment Flow의 실시간 분석 요청에 100ms 이내 응답
- 중복 상호작용 이벤트 자동 제거
프론트엔드 정책
- 모든 터치 이벤트를 즉시 캡처
- 3초 이상 50% 이상 노출되어야 'viewed' 기록
- 상호작용은 배치로 모아서 전송 (최대 10개 또는 5초)
- 오프라인 시 로컬 저장 후 온라인 전환 시 전송
실시간 통신 정책
백엔드 정책
- 사용자당 플랫폼별로 하나의 SSE 연결만 허용
- 30초마다 하트비트로 연결 확인
- 60초 동안 하트비트 없으면 연결 종료
- 연결 상태는 Redis에서 관리
프론트엔드 정책
- SSE 연결 실패 시 지수 백오프로 재연결
- 최대 재연결 시도: 10회
- 백그라운드 전환 시 연결 유지 (플랫폼 제약 내에서)
데이터 관리 정책
백엔드 정책
- 자주 조회되는 데이터는 Redis에 캐싱
- 캐시 만료 시간: 활성 메시지 5분, 집계 데이터 1시간
- DB 인덱스 전략: userId + status, userId + createdAt, messageId + type
- 트랜잭션으로 데이터 정합성 보장
성능 최적화 정책
백엔드 정책
- 쿼리 응답 시간 목표: 조회 < 100ms, 저장 < 50ms
- 배치 처리를 통한 DB 부하 분산
- 읽기 전용 복제본 활용 (분석 쿼리)
프론트엔드 정책
- 60 FPS 유지를 위해 requestAnimationFrame 사용
- 화면 밖 메시지는 DOM에서 제거
- 동일한 레이아웃의 렌더러는 재사용
- 메모리 사용량 200MB 초과 시 오래된 메시지 정리
명령(Commands)
도메인 이벤트를 발생시키는 메시지 관리 및 데이터 저장 동작입니다.
1. Board 관리 명령
1.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| CreateUserBoard | 완성된 Board 데이터 저장 | BoardPersisted 이벤트 발생 |
| GetActiveBoards | 활성 Board 조회 | DatabaseQueryExecuted 이벤트 발생 |
| UpdateBoardStatus | Board 상태 업데이트 | 상태별 이벤트 발생 |
| ArchiveExpiredBoards | 만료 Board 아카이빙 | BoardArchived 이벤트 발생 |
| EstablishSSE | SSE 연결 수립 | SSEConnected 이벤트 발생 |
| DeliverBoard | Board 전달 | BoardDelivered 이벤트 발생 |
| SyncMissedBoards | 놓친 Board 동기화 | MissedBoardsSynced 이벤트 발생 |
1.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|
| RenderMessage | 메시지 렌더링 실행 | MessageRendering 이벤트 발생 |
| RemoveMessage | 메시지 제거 | MessageRemoved 이벤트 발생 |
| StartAnimation | 애니메이션 시작 | AnimationStarted 이벤트 발생 |
| UpdateLayout | 레이아웃 업데이트 | LayoutChanged 이벤트 발생 |
| ShowFallback | Fallback UI 표시 | FallbackRendered 이벤트 발생 |
| CacheMessage | 메시지 로컬 캐싱 | MessageCached 이벤트 발생 |
2. 상호작용 관리 명령
2.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| SaveInteraction | 상호작용 저장 | InteractionPersisted 이벤트 발생 |
| ProcessBatch | 배치 처리 | InteractionBatchReceived 이벤트 발생 |
| GenerateDailySummary | 일별 통계 생성 | DailySummaryGenerated 이벤트 발생 |
| GetUserEngagement | 참여도 조회 | AnalyticsQueryExecuted 이벤트 발생 |
| ArchiveOldInteractions | 오래된 데이터 아카이빙 | OldInteractionsArchived 이벤트 발생 |
2.2 프론트엔드 명령
| 명령 | 설명 | 영향 |
|---|
| CaptureInteraction | 상호작용 캡처 | 상호작용 타입별 이벤트 발생 |
| StartViewTracking | 노출 시간 측정 시작 | ViewTimeStarted 이벤트 발생 |
| QueueInteraction | 상호작용 큐에 추가 | InteractionQueued 이벤트 발생 |
| SendBatch | 배치 전송 | BatchSent 이벤트 발생 |
| SaveOffline | 오프라인 저장 | OfflineQueued 이벤트 발생 |
3. 연결 관리 명령
3.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| RegisterConnection | 연결 등록 | ConnectionRegistered 이벤트 발생 |
| UpdateHeartbeat | 하트비트 업데이트 | HeartbeatReceived 이벤트 발생 |
| CloseConnection | 연결 종료 | SSEDisconnected 이벤트 발생 |
| CleanupStaleConnections | 오래된 연결 정리 | StaleConnectionsCleaned 이벤트 발생 |
4. 데이터 관리 명령
4.1 백엔드 명령
| 명령 | 설명 | 영향 |
|---|
| UpdateCache | 캐시 업데이트 | CacheUpdated 이벤트 발생 |
| OptimizeIndexes | 인덱스 최적화 | IndexOptimized 이벤트 발생 |
| VerifyDataIntegrity | 데이터 정합성 검증 | DataIntegrityVerified 이벤트 발생 |
| BackupData | 데이터 백업 | BackupCompleted 이벤트 발생 |
액터(Actors)
시스템과 상호작용하는 주체들입니다.
사용자
- 표시된 메시지를 보고 상호작용
- 탭, 스와이프, 액션 실행 등의 동작 수행
Agent Treatment Flow
- 표시할 메시지와 displayRules 전달
- 상호작용 데이터 및 분석 결과 조회
- 사용자 참여도 기반 치료 과제 생성
시스템 스케줄러
- 일별 상호작용 통계 집계
- 만료 메시지 아카이빙
- 오래된 데이터 정리
- 데이터 백업 실행
플랫폼 (iOS/Android)
- 네이티브 제스처 이벤트 제공
- 메모리 경고 알림
- 백그라운드/포그라운드 전환 알림
애그리게잇(Aggregates)
도메인의 핵심 개념들입니다.
BoardMessage
- 메시지 ID
- 사용자 ID
- 메시지 타입
- 콘텐츠
- displayRules
- actions
- metadata
- 상태 (PENDING, DELIVERED, VIEWED, INTERACTED, ARCHIVED)
- 우선순위
- 생성/만료/전달 시간
BoardInteraction
- 상호작용 ID
- 메시지 ID
- 사용자 ID
- 상호작용 타입
- 타임스탬프
- 세션 정보
- 플랫폼 정보
BoardInteractionSummary
- 사용자 ID
- 날짜
- 일별 집계 (전달/조회/클릭/무시 건수)
- 타입별 집계
- 평균 응답 시간
SSEConnection
- 연결 ID
- 사용자 ID
- 연결 상태
- 마지막 하트비트
- 클라이언트 정보
MessageQueue
- 사용자 ID
- 대기 중인 메시지
- 큐 크기
- 업데이트 시간
읽기 모델(Read Models)
조회 최적화를 위한 데이터 구조입니다.
Active Messages View
- 사용자별 활성 메시지 목록
- 우선순위 기반 정렬
- 캐시 레이어 지원
User Engagement View
- 사용자별 참여도 메트릭
- 기간별 상호작용 통계
- 메시지 타입별 반응률
Daily Analytics View
- 일별 집계 데이터
- 사용자별 활동 패턴
- 시간대별 분포
Connection Status View
- 활성 연결 상태
- 플랫폼별 분포
- 연결 품질 메트릭
변경 이력