본문으로 건너뛰기

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)​

데이터 저장 규칙​

  1. 모든 메시지는 최소 30일간 보관
  2. 상호작용 원본은 90일, 집계 데이터는 영구 보관
  3. 사용자당 활성 메시지는 최대 1000개

메시지 전달 규칙​

  1. 우선순위가 높은 메시지부터 전달
  2. 만료된 메시지는 자동으로 상태 변경
  3. 동일 사용자의 중복 메시지 방지

분석 데이터 제공 규칙​

  1. 실시간 쿼리는 100ms 이내 응답
  2. 일별 집계는 매일 자정에 자동 실행
  3. 개인정보는 익명화하여 제공

보안 고려사항​

데이터 보호​

  • 모든 통신은 HTTPS 필수
  • 민감한 사용자 데이터는 암호화 저장
  • 로그에는 개인정보 제외

접근 제어​

  • JWT 토큰 기반 인증
  • 사용자는 자신의 데이터만 접근 가능
  • Treatment Flow는 분석용 집계 데이터만 접근

확장 고려사항​

데이터 증가 대응​

  1. 테이블 파티셔닝 (월별)
  2. 오래된 데이터 아카이빙
  3. 읽기 전용 복제본 활용

트래픽 증가 대응​

  1. 수평 확장 (로드 밸런싱)
  2. 캐시 레이어 강화
  3. 비동기 처리 확대

핵심 원칙​

Agent Board는 신뢰할 수 있는 메시지 전달과 정확한 상호작용 추적을 보장합니다.

  • 모든 메시지는 반드시 전달되어야 함
  • 모든 상호작용은 정확히 기록되어야 함
  • Treatment Flow의 분석 요구에 즉시 응답해야 함
  • Mobile 사용자의 비동기적 접속 패턴을 완벽히 지원해야 함

이러한 설계는 Agent Board를 다음과 같이 만듭니다:

  • 신뢰성: 메시지 유실 없음, 상호작용 누락 없음
  • 분석 가능: 풍부한 데이터로 치료 효과 측정 가능
  • 확장 가능: 사용자와 데이터 증가에 대응 가능
  • 독립성: 다른 도메인의 변경에 영향받지 않음

변경 이력​

버전날짜작성자변경 내용
0.1.02025-06-27bok@weltcorp.com최초 작성