대화·분석 조회¶
대화의 쓰기와 읽기는 서비스 경계로 분리됩니다. Socket Backend가 실시간 세션 중 대화, 메시지, 감정·치매·우울·음성 바이오마커, 요약과 음성 메타데이터를 기록하고 App Backend는 공유 PostgreSQL에서 조회 모델을 조합합니다.
sequenceDiagram
participant C as 실시간 클라이언트
participant S as Socket Backend
participant DB as 공유 PostgreSQL
participant A as App Backend
participant D as 대시보드 클라이언트
C->>S: WebSocket 음성 대화
S->>DB: dialog·message·analysis·summary 쓰기
Note over S,A: Socket → App 직접 HTTP 호출 없음
D->>A: GET /v1/dialogs...
A->>DB: 워크스페이스 범위 읽기
DB-->>A: 저장된 대화·분석 결과
A-->>D: REST 조회 응답
물리 스키마와 파티션의 정본은 sohri-db입니다. App Backend의 엔티티는 읽기 계약을
구현하며 대화·분석 파이프라인 자체를 재실행하지 않습니다.
조회 기능¶
- 대화 목록: 최신순 페이지,
turnCount > 0만 포함 - 선택 필터:
externalUserId,scenarioId - 상세:
dialogId또는 외부 WebSocketsessionId - 기본 상세: 대화 요약, 키워드, 대표 감정, 대화 단위 바이오마커 요약
detail=true: 감정 세부 점수, 치매·우울 점수, 발화별 바이오마커 지표 추가- 사용자 그룹 통계: 1분 이상 완료 대화 건수와 구성원별 건수
완료 대화 통계는 started_at과 ended_at이 모두 있고 차이가 60초 이상인 세션만 셉니다.
날짜 범위는 KST 기준 양 끝을 포함합니다.
확정 발화만 분석 조회¶
분석 상세와 요약 입력은 dialog_message.speech_phase='CONFIRMED'를 화이트리스트로 읽습니다.
CANCELLED 발화와 그 하위 분석 결과는 응답에서 제외됩니다. 저장된 원래 turn 번호를 다시
매기지 않으므로 messageTurns에 1, 2, 4처럼 공백이 생길 수 있습니다.
음성 프록시는 감사·디버깅 경로이므로 message ID를 이미 아는 경우 CANCELLED 발화도 별도로
필터링하지 않습니다.
메시지 음성¶
상세 응답의 audio.url은 GCS 서명 URL이 아니라 다음 App Backend 프록시를 가리킵니다.
프록시는 인증·테넌트 확인과 감사 로그를 적용한 뒤 GCS 스트림을 전달합니다. Cache-Control:
private, no-store, Referrer-Policy: no-referrer, X-Content-Type-Options: nosniff를
설정하며 Range 요청은 현재 지원하지 않습니다. 브라우저 <audio src>는 Authorization
헤더를 붙이지 못하므로 fetch 후 Blob URL을 사용해야 합니다.
JWT 호출은 이 음성 경로에서 X-Workspace-Id가 필수입니다. API key 호출은 키 귀속
워크스페이스를 사용합니다. 대화 목록·상세의 JWT 헤더 동작 차이는
워크스페이스와 테넌시를 확인하세요.
필드 계약은 공유 데이터 계약, 경로 목록은 REST API 참조를 참고하세요.