DOCS/journey/troubleshooting/250826_happybell80_frontend_rb8001_채팅연결_계획.md
Claude-51124 22557e7132 docs: 오래된 트러블슈팅 아카이브 및 구조 정리
- 7-8월 초기 구축 문서 12개를 _archive/troubleshooting/2025_07-08_initial_setup/로 이동
- book/300_architecture/390_human_in_the_loop_intent_learning.md를 journey/research/intent_classification/로 이동 (개발 여정 문서)
- 빈 폴더 제거 (journey/assets/*)
2025-11-17 14:06:05 +09:00

6.7 KiB

Frontend-rb8001 채팅 연결 문제 해결 계획

작성일: 2025-08-26

작성자: happybell80

상태: 구현 완료

관련 서비스: frontend-customer, robeing-gateway, rb8001

최종 업데이트: 2025-08-26 18:30


1. 문제 상황

1.1 현재 시스템 플로우

Frontend(React) → Gateway(8100) → rb8001(8001)
     ↓                ↓                ↓
 /api/chat       /api/message      404 Error

1.2 핵심 문제

  • Frontend: /api/chat 엔드포인트로 요청 전송
  • Gateway: /api/chat/api/message로 프록시 (정상 구현됨)
  • rb8001: /api/message 엔드포인트 없음 (404 반환)
  • rb10508_micro: /api/message 엔드포인트 있음 (정상 작동)

1.3 서버 확인 결과

51123 서버 (Gateway)

  • Gateway 라우팅: /stats만 rb8001로 프록시 중
  • 사용자 매핑: happybell80 → rb8001 정상 매핑
  • 문제점: robeing_id가 "undefined"로 전달됨

51124 서버 (rb8001)

  • rb8001은 Docker 컨테이너로 실행 중 (컨테이너명: rb8001)
  • 이미지: rb8001-rb8001, host 네트워크 모드 사용
  • 포트 8001 정상 리스닝 (14시간째 healthy 상태)
  • /api/message, /api/chat 엔드포인트 없음
  • 사용 가능: /complete, /api/slack/events

2. 해결 방안 분석

방안 A: rb8001에 /api/message 엔드포인트 추가 (선택)

장점:

  • rb10508_micro와 일관성 유지
  • Gateway 수정 불필요
  • 다른 사용자/서비스 영향 없음

단점:

  • rb8001 코드 수정 필요

방안 B: Gateway에서 rb8001용 특별 처리

장점:

  • rb8001 수정 불필요

단점:

  • Gateway 복잡도 증가
  • 로빙별 분기 처리 필요
  • 유지보수 어려움

방안 C: Frontend에서 로빙별 다른 엔드포인트 호출

장점:

  • 백엔드 수정 최소화

단점:

  • Frontend 복잡도 증가
  • 로빙 정보 사전 필요
  • 확장성 떨어짐

3. 구현 계획 (방안 A)

3.1 rb8001/main.py 수정 내용

# 1. Import 추가 (파일 상단)
from pydantic import BaseModel
from typing import Optional, Dict

# 2. MessageRequest 모델 정의
class MessageRequest(BaseModel):
    text: str
    user_id: Optional[str] = None
    context: Optional[Dict] = {}
    channel_id: Optional[str] = None

# 3. /api/message 엔드포인트 추가
@app.post("/api/message")
async def message_endpoint(request: MessageRequest):
    """
    Gateway/Frontend 메시지 처리 엔드포인트
    rb10508_micro와 호환되는 인터페이스 제공
    """
    try:
        # 기존 _call_internal_llm 활용
        result = await router._call_internal_llm(
            message=request.text,
            user_id=request.user_id or "web_user",
            task_type="chat",
            context=request.context,
            channel="web"  # ⚠️ Slack DM과 동일 (개선: 250828_conversation_log_channel_구분_개선.md)
        )
        
        # Frontend가 기대하는 응답 형식
        return {
            "response": result.get("content", ""),
            "robeing_id": settings.ROBEING_ID,
            "timestamp": datetime.now().isoformat(),
            "success": result.get("success", False)
        }
        
    except Exception as e:
        logger.error(f"Message endpoint error: {e}")
        raise HTTPException(status_code=500, detail=str(e))

3.2 추가 고려사항

대화 저장 로직

# ChromaDB와 PostgreSQL에 대화 저장
await router._save_conversation(
    message=request.text,
    response=result.get("content", ""),
    user_id=request.user_id,
    channel="web"
)

사용자 레벨/스탯 조회

# DB에서 실제 로빙 스탯 조회
stats = await router.get_robeing_stats()
response["level"] = stats.get("level", 1)

4. 작업 단계

4.1 구현 순서

  1. 코드 작성 (10분)

    • MessageRequest 모델 정의
    • /api/message 엔드포인트 구현
    • 응답 형식 맞춤
  2. 로컬 테스트 (5분)

    # 직접 엔드포인트 테스트
    curl -X POST http://localhost:8001/api/message \
      -H "Content-Type: application/json" \
      -d '{"text":"안녕하세요","user_id":"test"}'
    
  3. 통합 테스트 (5분)

    # Gateway 경유 테스트
    curl -X POST http://localhost:8100/api/chat \
      -H "Authorization: Bearer [TOKEN]" \
      -d '{"text":"안녕하세요"}'
    
  4. 배포 (자동)

    • Git commit & push
    • Gitea Actions가 자동으로 처리
      • 51124 서버 SSH 접속
      • git pull
      • docker compose down/up --build
      • health check

4.2 검증 방법

  1. Frontend 로그인 (happybell80)
  2. 채팅 입력
  3. 응답 확인
  4. rb8001 로그 확인: tail -f rb8001.log

5. 예상 결과

5.1 정상 플로우

Frontend → POST /api/chat {"text":"안녕"}
    ↓
Gateway(8100) → happybell80 → rb8001 매핑
    ↓
rb8001(8001) → /api/message 처리
    ↓
응답: {"response":"안녕하세요! 무엇을 도와드릴까요?"}

5.2 모니터링 포인트

  • Gateway 로그: 라우팅 성공
  • rb8001 로그: 메시지 처리
  • ChromaDB: 대화 저장
  • PostgreSQL: conversation_log 기록

6. 리스크 및 대응

6.1 잠재 이슈

  1. 타입 불일치: MessageRequest 필드 검증
  2. 인증 문제: JWT 토큰 처리
  3. 성능: 동시 요청 처리

6.2 롤백 계획

  • rb8001 코드 git revert & push
  • Gitea Actions가 자동 재배포

7. 향후 개선사항

  1. 통일된 API 스펙 정의

    • OpenAPI/Swagger 문서화
    • 모든 로빙 서비스 표준화
  2. 헬스체크 강화

    • 각 엔드포인트 가용성 체크
    • 자동 장애 감지
  3. 로깅 개선

    • 요청/응답 상세 로깅
    • 성능 메트릭 수집
  4. 테스트 자동화

    • E2E 테스트 스크립트
    • CI/CD 파이프라인 통합

8. 참고 문서

  • 250826_frontend_rb8001_chat_endpoint_missing.md
  • 250820_happybell80_사용자별로빙동적할당구현.md
  • 250809_happybell80_robing-gateway구현.md

9. 구현 결과 (2025-08-26 16:30)

9.1 완료 사항

Gateway 라우팅: /api/chat → rb8001 응답 성공 Frontend 채팅: 메시지 송수신 정상 작동 자동 배포: Gitea Actions 자동 배포 완료 응답 생성: "안녕하세요, 사용자님. 저는 로빙입니다" 정상 응답

9.2 해결된 이슈 (2025-08-26 18:30)

robeing_id undefined: Frontend 코드 수정 완료 (git pull로 적용됨) stats API: rb8001 스탯 정상 조회 중

9.3 별도 문서로 이관된 이슈

대화 저장: PostgreSQL UUID 타입 에러 → 상세 내용은 250826_rb8001_conversation_storage_failure.md 참조


작성 완료: 2025-08-26 14:00 구현 완료: 2025-08-26 16:30