Skip to content

WebSocket 전역 연결 전환 및 User Queue 기반 AI 응답 구조 개선 #171

@ckdals4600

Description

@ckdals4600

이슈 배경

  • 현재 채팅방 입장 시마다 소켓을 연결/구독하는 Room 기반(Topic) 방식은 AI 채팅 서비스의 특성상 다음과 같은 한계가 있음.

    • 리소스 낭비: 모든 채팅 구독으로 인한 불필요한 소켓 연결 발생.
    • 연결 끊김: 사용자가 다른 방으로 이동하면 AI 답변 생성이 중단되거나 응답을 유실함.
    • UX 제한: 답변 생성 중 멀티태스킹이 불가능함.
  • 이에 따라 로그인 시점 전역 연결(Global Connection) 방식으로 전환하고, User Queue를 활용하여 백그라운드에서도 끊김 없이 AI 응답을 수신할 수 있도록 구조를 개편하고자 함.

  • 또한, 구현 복잡도를 낮추기 위해 AI 응답 방식을 Streaming에서 Full Response 방식으로 변경함.

이슈 내용

2. 주요 변경 사항 (Changes)

A. 아키텍처 변경

  • 구독 모델: Room 중심(Topic) → User 중심(Queue)
    • AS-IS: /topic/chat/{chatId} (방별 구독)
    • TO-BE: /user/queue/ai-reply (사용자 개인 큐 단일 구독)
  • AI 응답 방식: Streaming → Full Response
    • 복잡한 Flux 스트리밍 로직 제거.
    • 완성된 답변을 단건(Mono)으로 수신하여 처리.

B. 데이터 흐름 (Workflow)

  • [Front]: 로그인 직후 소켓 연결 및 /user/queue/ai-reply 구독.
  • [Back]: AI 서버 요청 후 전체 응답 대기 (Blocking/Async).
  • [Back]: 응답 수신 시 convertAndSendToUser를 통해 특정 유저에게 전송.
  • [Front]: 수신된 메시지의 chatId와 현재 방 ID 비교 후 렌더링 또는 알림 처리.

3. 작업 상세 (Tasks)

Backend

  • WebSocketConfig 수정
    • enableSimpleBroker/queue 추가.
    • setUserDestinationPrefix("/user") 설정 확인.
  • MessageService 리팩토링
    • WebClient 스트리밍(Flux, SubscriptionManager) 로직 전면 제거.
    • AI 서버 요청을 단건(Mono) 수신 방식으로 변경.
    • convertAndSendconvertAndSendToUser (Principal 활용) 메서드 교체.
  • DTO 수정
    • 소켓 응답 DTO에 프론트엔드 라우팅용 chatId 필드 필수 포함.

Frontend

  • 소켓 생명주기 변경
  • 방 입장/퇴장 시의 subscribe/disconnect 로직 제거.
  • 로그인 성공 시점 connect 및 전역 구독 구현.
  • 메시지 핸들링 로직 구현
    • /user/queue/ai-reply 수신 리스너 구현.
    • Payload 내 chatId 확인 후 UI 업데이트 분기 처리.
    • 로딩 처리 방식 변경: Streaming(append) → Text Replacement.

4. 기대 효과 (Expected Outcome)

  • 사용자가 채팅방을 이동하더라도 AI 답변이 유실되지 않음.
  • 스트리밍 로직 제거로 인한 백엔드/프론트엔드 코드 복잡도 대폭 감소.
  • 타임아웃 등 네트워크 이슈에 대한 안정성 확보.

참고 자료

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