Agent Board Bounded Context
⚠️ agentz-studio 플랫폼 통합 (2025-12-24)
이 도메인은 dha-sleep-api에 유지되며, agentz-studio와 병행 운영됩니다.
┌─────────────────────────────────────────────────────────────────┐
│ agentz-studio dha-sleep-api │
│ │
│ Chat UI (실시간 대화) Agent Board (비동기) │
│ ↓ ↑ │
│ Agent Team → LLM Treatment Flow │
│ ↓ ↓ │
│ SSE Stream → App Board Message → App │
│ │
│ [실시간 대화 채널] [비동기 메시지 채널] │
└─────────────────────────────────────────────────────────────────┘채널 분리 원칙:
- agentz-studio Chat: 실시간 대화, Agent 직접 응답, SSE 스트리밍
- Agent Board: 비동기 메시지, 치료 과제, 푸시 알림, 상호작용 추적
dha-sleep-api에 유지되는 기능 (전체 유지):
- Message Persistence & Delivery: 메시지 영구 저장 및 전달
- Interaction Tracking: 사용자 상호작용 추적 및 분석
- Real-time Connection: SSE 연결 관리
- Treatment Flow 연동: 치료 콘텐츠 수신 및 표시
agentz-studio 연동 범위:
- Config Sync: Pattern/Rule 정의를 agentz-studio에서 받아 런타임에 적용
- Metrics 집계: 상호작용 통계를 agentz-studio Analytics Dashboard로 전송 (집계 데이터만)
dha-sleep-api 전담 (변경 없음):
- CTA 메시지 생성 및 발송 (Treatment Flow → Agent Board)
- 사용자 상호작용 추적 및 저장
- 모든 런타임 실행 로직
관련 문서:
개요
Agent Board는 불면증 치료 서비스의 Message Delivery & Tracking Layer로서, Agent Treatment Flow로부터 완성된 Board 데이터를 받아 적절한 클라이언트에게 실시간으로 전달하고, 사용자의 모든 상호작용을 저장하여 치료 효과 분석을 지원하는 도메인입니다.
중요한 책임 분리:
- Agent Board는 템플릿 렌더링이나 메시지 생성을 수행하지 않습니다
- Agent Treatment Flow가 모든 템플릿 렌더링과 메시지 생성을 담당합니다
- Agent Board는 이미 완성된 Board 데이터(제목, 내용, 액션 등)를 받아 저장하고 전달만 합니다
- 이 도메인은 메시지의 비즈니스 의미를 해석하지 않지만, 모든 데이터를 영구적으로 저장하여 Mobile 사용자의 비동기적 접속과 Treatment Flow의 분석 요구에 대응합니다
Backend (NestJS) 핵심 책임
1. Message Persistence & Delivery
- Agent Treatment Flow로부터 받은 모든 메시지를 PostgreSQL에 영구 저장
- Mobile 사용자 접속 시 미전달/미확인 메시지를 우선순위에 따라 전달
- 메시지 생명주기 관리 (PENDING → DELIVERED → VIEWED → INTERACTED → ARCHIVED)
- TTL 기반 자동 만료 및 아카이빙
2. Interaction Tracking & Analytics
- 모든 사용자 상호작용(view, click, dismiss 등)을 타임스탬프와 함께 저장
- 일별/주별 상호작용 통계 자동 집계
- Treatment Flow의 실시간 분석 요청에 대한 빠른 응답 (< 100ms)
- 사용자별 과제 수행도 및 참여율 데이터 제공
3. Real-time Connection Management
- SSE(Server-Sent Events) 연결 관리
- 사용자별, 플랫폼별 연결 상태 추적
- 하트비트를 통한 연결 상태 모니터링
- 재연결 시 놓친 메시지 및 상태 동기화
4. Data Integrity & Performance
- 트랜잭션을 통한 데이터 정합성 보장
- 효율적인 쿼리를 위한 인덱스 전략
- Redis 캐싱을 통한 성능 최적화
- 중복 이벤트 방지 메커니즘
5. Security & Scalability
- JWT 기반 인증 및 권한 검증
- 사용자별 Rate Limiting
- 수평 확장 지원 (Sticky Session)
- 메트릭 수집 및 모니터링
Mobile Client 핵심 책임
1. Message Display & Caching
- Backend로부터 받은 메시지를 displayRules에 따라 표시
- 오프라인 지원을 위한 로컬 메시지 캐싱
- 레이아웃별 렌더링 (fullscreen, card, modal 등)
- 만료된 메시지 자동 정리
2. Precise Interaction Capture
- 정확한 타임스탬프와 함께 모든 사용자 액션 기록
- 메시지 노출 시간, 스크롤 깊이, 클릭 위치 추적
- 세션 컨텍스트 정보 수집 (platform, appVersion 등)
- 오프라인 시 로컬 SQLite에 저장
3. Efficient Data Synchronization
- 배치 처리를 통한 효율적인 이벤트 전송
- 실패 시 지수 백오프 재시도
- 온라인 복귀 시 자동 동기화
- 중복 이벤트 방지
도메인 경계
Backend가 포함하는 것
- 메시지 영구 저장소 (PostgreSQL)
- 상호작용 이력 저장소
- 일별 통계 집계 서비스
- SSE 연결 관리 서비스
- 분석 API 서비스
- 캐싱 레이어 (Redis)
Backend가 포함하지 않는 것
- 템플릿 관리 및 렌더링 (→ Agent Treatment Flow)
- 메시지 내용 생성 (→ Agent Treatment Flow)
- 치료 로직 및 개인화 (→ Agent Treatment Flow)
- Board 추천 로직 (→ Agent Treatment Flow)
- 사용자 인증 토큰 발급 (→ Auth 도메인)
- 실제 UI 렌더링 (→ Mobile Client)
- 비즈니스 규칙 해석 (→ Agent Treatment Flow)
주요 개념 (Backend)
BoardMessage (Entity)
- 정의: 영구 저장되는 메시지
- 속성: ID, userId, content, displayRules, status, timestamps
- 책임: 메시지 생명주기 추적, 상태 관리
BoardInteraction (Entity)
- 정의: 사용자 상호작용 기록
- 속성: messageId, userId, type, timestamp, sessionContext
- 책임: 정확한 상호작용 이력 보존
BoardInteractionSummary (Aggregate)
- 정의: 일별 집계된 상호작용 통계
- 속성: userId, date, 타입별 통계, 평균 응답 시간
- 책임: 효율적인 분석 데이터 제공
SSEConnection (Value Object)
- 정의: 활성 클라이언트 연결
- 속성: connectionId, userId, state, lastHeartbeat
- 책임: 실시간 메시지 전달 채널 관리
의존 관계
Inbound Dependencies (이 도메인을 사용하는 도메인)
- Agent Treatment Flow:
- 메시지 전달 요청
- 상호작용 데이터 조회
- 사용자 참여도 분석
Outbound Dependencies (이 도메인이 사용하는 도메인)
- Auth 도메인: JWT 토큰 검증
External Dependencies
- PostgreSQL: 메시지 및 상호작용 영구 저장
- Redis: 연결 상태 및 캐시 관리
- HTTP/SSE: 실시간 통신
Backend 인터페이스
제공하는 인터페이스
1. Board Management Service
interface BoardManagementService {
// Treatment Flow로부터 완성된 Board 데이터 수신 및 저장
createUserBoard(command: CreateUserBoardCommand): Promise<BoardMessage>;
// 사용자의 활성 Board 조회
getActiveBoards(userId: string): Promise<BoardMessage[]>;
// Board 상태 업데이트
updateBoardStatus(boardId: string, status: MessageStatus): Promise<void>;
// 만료된 Board 아카이빙
archiveExpiredBoards(): Promise<number>;
}
interface CreateUserBoardCommand {
userId: string;
userCycleId: string;
boardData: {
boardType: AgentBoardType;
priority: AgentBoardPriority;
status: AgentBoardStatus;
title: string; // 이미 렌더링된 제목
content: string; // 이미 렌더링된 내용
actions?: ActionButton[]; // 이미 정의된 액션들
displayStartTime: Date;
displayEndTime: Date;
displayOrder: number;
metadata?: any;
};
}
2. Interaction Analytics Service
interface InteractionAnalyticsService {
// 상호작용 저장
saveInteraction(interaction: CreateInteractionDto): Promise<void>;
// 배치 상호작용 처리
processBatch(batch: InteractionBatchDto): Promise<void>;
// 사용자 참여도 분석
getUserEngagement(userId: string, period: DateRange): Promise<EngagementMetrics>;
// 메시지 타입별 반응률
getResponseRateByType(userId: string, messageType: string): Promise<ResponseRate>;
// 일별 통계 생성
generateDailySummary(date: Date): Promise<void>;
}
3. Real-time Delivery Service
interface RealtimeDeliveryService {
// SSE 연결 등록
registerConnection(userId: string, connectionInfo: ConnectionInfo): Promise<void>;
// 실시간 메시지 전송
sendToUser(userId: string, message: BoardMessage): Promise<void>;
// 연결 상태 조회
getConnectionStatus(userId: string): Promise<ConnectionStatus>;
// 놓친 메시지 동기화
syncMissedMessages(userId: string, lastMessageId: string): Promise<BoardMessage[]>;
}
사용하는 인터페이스
Auth Service (from Auth Domain)
interface AuthService {
// JWT 토큰 검증
verifyToken(token: string): Promise<TokenPayload>;
// 사용자 권한 확인
hasPermission(userId: string, permission: string): Promise<boolean>;
}
도메인 이벤트
발행하는 이벤트
MessageCreated: 새 메시지가 저장됨MessageDelivered: 메시지가 클라이언트에 전달됨MessageViewed: 사용자가 메시지를 확인함InteractionRecorded: 상호작용이 기록됨DailySummaryGenerated: 일별 통계가 생성됨MessageArchived: 메시지가 아카이빙됨
구독하는 이벤트
없음 - Agent Board는 이벤트를 구독하지 않습니다. 모든 작업은 직접 API 호출을 통해 시작됩니다.
비즈니스 규칙 (Backend)
데이터 저장 규칙
- 모든 메시지는 최소 30일간 보관
- 상호작용 원본은 90일, 집계 데이터는 영구 보관
- 사용자당 활성 메시지는 최대 1000개
메시지 전달 규칙
- 우선순위가 높은 메시지부터 전달
- 만료된 메시지는 자동으로 상태 변경
- 동일 사용자의 중복 메시지 방지
분석 데이터 제공 규칙
- 실시간 쿼리는 100ms 이내 응답
- 일별 집계는 매일 자정에 자동 실행
- 개인정보는 익명화하여 제공
보안 고려사항
데이터 보호
- 모든 통신은 HTTPS 필수
- 민감한 사용자 데이터는 암호화 저장
- 로그에는 개인정보 제외
접근 제어
- JWT 토큰 기반 인증
- 사용자는 자신의 데이터만 접근 가능
- Treatment Flow는 분석용 집계 데이터만 접근
확장 고려사항
데이터 증가 대응
- 테이블 파티셔닝 (월별)
- 오래된 데이터 아카이빙
- 읽기 전용 복제본 활용
트래픽 증가 대응
- 수평 확장 (로드 밸런싱)
- 캐시 레이어 강화
- 비동기 처리 확대
핵심 원칙
Agent Board는 신뢰할 수 있는 메시지 전달과 정확한 상호작용 추적을 보장합니다.
- 모든 메시지는 반드시 전달되어야 함
- 모든 상호작용은 정확히 기록되어야 함
- Treatment Flow의 분석 요구에 즉시 응답해야 함
- Mobile 사용자의 비동기적 접속 패턴을 완벽히 지원해야 함
이러한 설계는 Agent Board를 다음과 같이 만듭니다:
- 신뢰성: 메시지 유실 없음, 상호작용 누락 없음
- 분석 가능: 풍부한 데이터로 치료 효과 측정 가능
- 확장 가능: 사용자와 데이터 증가에 대응 가능
- 독립성: 다른 도메인의 변경에 영향받지 않음
변경 이력
| 버전 | 날짜 | 작성자 | 변경 내용 |
|---|---|---|---|
| 0.1.0 | 2025-06-27 | bok@weltcorp.com | 최초 작성 |