Description 이슈 배경
현재 채팅방 입장 시마다 소켓을 연결/구독하는 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) 수신 방식으로 변경.
convertAndSend → convertAndSendToUser (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
Reactions are currently unavailable
You can’t perform that action at this time.