- 모든 내부 처리는 UUID 형식 통일 - JWT 토큰의 user_id 사용 명시 - PostgreSQL UUID 타입 캐스팅 추가 - Frontend API 호출 예시 추가
3.8 KiB
3.8 KiB
rb8001 카톡 스타일 대화 히스토리 구현 계획
작성일: 2025-09-01
대상: rb8001 (프로덕션 로빙)
참조: rb10508_micro 구현 코드
수정: PostgreSQL 전용 히스토리 구현으로 변경
현재 상태 분석
- rb10508_micro: /api/config 엔드포인트 구현됨 (endpoints.py:407)
- rb8001:
- database.py: ConversationLog 모델 있음 (line 52)
- get_recent_conversations() 함수 있음 (line 81)
- get_paginated_conversations() 함수 없음 (추가 필요)
- main.py: @app.get() 직접 사용, router 분리 없음
UUID 및 인증 체계
- 내부 처리: 모든 user_id는 UUID 형식으로 통일
- JWT 토큰: X-User-Id 헤더로 UUID 전달
- Slack 사용자: slack_user_mapping 테이블로 UUID 매핑
- Frontend: JWT에서 user_id(UUID) 추출하여 API 호출
수정 필요 파일
백엔드 (rb8001)
app/core/config.py- 환경변수 추가 (MESSAGE_BATCH_SIZE=30, MAX_MESSAGES_IN_DOM=200)app/state/database.py- get_paginated_conversations() 함수 추가- PostgreSQL conversation_logs 테이블에서만 조회
- ChromaDB 사용하지 않음 (히스토리는 DB만)
main.py- @app.get() 직접 추가 (/api/config, /api/messages).env파일 - 환경변수 설정 (docker-compose.yml 아님)
프론트엔드 (frontend-customer)
src/services/robeing-api.ts- getConfig(), getMessages() 함수 추가src/components/chat-interface.tsx- 무한 스크롤, 날짜 구분선 구현
API 스펙
// GET /api/config
{ message_batch_size: 30, max_messages_in_dom: 200 }
// GET /api/messages?before={timestamp}&limit=30
{
messages: [...], // PostgreSQL conversation_logs에서 조회
has_more: true
}
PostgreSQL 쿼리 예시
-- user_id는 항상 UUID 형식
SELECT id, message, response, timestamp, user_id
FROM conversation_logs
WHERE user_id = $1::uuid -- UUID 타입 캐스팅
AND robeing_id = 'rb8001'
AND timestamp < $2
ORDER BY timestamp DESC
LIMIT 30;
API 호출 예시
// Frontend에서 JWT의 user_id 사용
const token = localStorage.getItem('token');
const decoded = jwt_decode(token);
const userId = decoded.user_id; // UUID 형식
// API 호출
await fetch(`/api/messages?user_id=${userId}&before=${timestamp}`);
데이터베이스 스키마
-- conversation_logs 테이블 (실제)
CREATE TABLE conversation_logs (
id INTEGER PRIMARY KEY (auto-increment),
robeing_id VARCHAR,
channel_id VARCHAR,
message VARCHAR,
response VARCHAR,
intent VARCHAR,
confidence DOUBLE PRECISION,
timestamp TIMESTAMP,
user_id UUID (FK → users),
slack_user_id VARCHAR(100),
thread_ts VARCHAR(128),
channel_type VARCHAR(32)
);
주의사항
API 경로
# main.py에 직접 추가 (rb8001은 router 분리 없음)
@app.get("/api/config")
@app.get("/api/messages")
rb10508_micro 참조 코드
# rb10508_micro/app/config.py:101-103
MESSAGE_BATCH_SIZE: int = int(os.getenv("MESSAGE_BATCH_SIZE", 30))
SCROLL_THRESHOLD: int = int(os.getenv("SCROLL_THRESHOLD", 100))
MAX_MESSAGES_IN_DOM: int = int(os.getenv("MAX_MESSAGES_IN_DOM", 200))
구현 순서
- 백엔드 API 추가 (1시간)
- config.py 환경변수 추가
- database.py에 get_paginated_conversations() 구현 (PostgreSQL 전용, UUID 처리)
- main.py에 엔드포인트 직접 추가 (JWT 인증 확인)
- 현재 대화는 save_conversation()으로 PostgreSQL에 저장 (UUID로 저장)
- 프론트엔드 통합 (1시간)
- robeing-api.ts 함수 추가
- chat-interface.tsx 무한 스크롤 구현
- 테스트 및 배포 (30분)
- curl localhost:8001/api/config 테스트
- 51124 서버 docker compose down && up -d --build