Skip to content

채팅 답변 생성 및 취소 API 개발 #113

@ckdals4600

Description

@ckdals4600

이슈 배경

  • 사용자의 채팅 요청을 받아 AI 서버로 전달하고, 생성된 답변을 WebSocket을 통해 실시간으로 사용자에게 스트리밍하는 AI 채팅 서비스 개발
  • 답변 생성 중 사용자가 취소 요청 시 즉시 생성 중단 가능

이슈 내용

1. 시스템 아키텍처 및 흐름

  • 구조: Frontend ↔ (WebSocket) ↔ Spring Server ↔ (HTTP API) ↔ AI Server
  • 동작 흐름:
    1. 요청: 프론트엔드가 POST /chats/{chat_id}로 사용자 메시지 전송.
    2. 전달: Spring 서버가 이를 받아 비동기로 AI 서버에 답변 생성 요청.
    3. 스트리밍: AI 서버의 응답을 수신하는 즉시 WebSocket을 통해 프론트엔드로 푸시.
      4-1. 취소: POST /chats/{chat_id}/cancel 요청 시 진행 중인 스트림과 AI 요청을 즉시 중단.
      4-2. 완료/저장: 답변 생성이 완료되면 전체 메시지를 DB에 저장.

2. API 명세 (Trigger)

A. 답변 생성 요청 (Trigger)

  • Endpoint: WS /ws/chats/send/{chat_id}
  • Request Body:
    {
      "message": "사용자 질문 내용"
    }
  • Response: 202 Accepted (처리가 시작되었음을 알림, 실제 내용은 WS로 전달)

B. 답변 생성 취소

  • Endpoint: WS /ws/chats/cancel/{chat_id}
  • Description: 현재 진행 중인 해당 채팅방의 답변 생성 작업을 즉시 중단함.
  • Response: 200 OK

3. 개발 범위

  • ChatController: 메시지 전송 요청 처리 및 취소 요청 핸들링.
  • WebSocketConfig: 웹소켓 연결 설정.
  • ChatService: AI 서버 연동, 스트림 처리, 세션 관리.
  • ChatStreamManager:
    • AI 서버 연동 (WebClient).
    • 활성 작업 관리 (Map<Long, Disposable>).
    • WebSocket 메시지 전송 (SimpMessagingTemplate 등).

4. 주요 기능 구현

A. WebSocket 통신 환경 구축

  • WebSocketConfig 설정 및 엔드포인트(/ws/chat) 개설.
  • STOMP 또는 TextWebSocketHandler를 사용하여 세션 관리 구현.

B. AI 서버 연동 및 비동기 스트리밍

  • WebClient 또는 비동기 HttpClient를 사용하여 AI 서버와 통신.
  • AI 서버로부터 들어오는 스트림 데이터를 실시간으로 WebSocket 세션에 전송(flux 처리 등).

C. 답변 생성 취소 로직

  • 요구사항: 답변 생성 도중 사용자가 중단을 요청하면 백엔드에서 AI 서버로의 요청을 즉시 끊어야 함.
  • 구현 방안:
    • /cancel 요청이 오면 Map에서 해당 chat_id의 작업을 조회.
    • 작업이 존재하면 dispose()/cancel()을 호출하여 AI 서버와의 연결을 끊고 WebSocket 전송 중단.
    • Map에서 해당 Entry 제거.

참고 자료

No response

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions