Skip to content

Conversation

@ckdals4600
Copy link
Contributor

@ckdals4600 ckdals4600 commented Jan 7, 2026

관련 이슈

PR 설명

  • 기존 채팅방 단위(Topic)의 소켓 연결 방식을 로그인 기반 전역 연결(Global Connection) 방식으로 변경하고, User Queue를 도입하여 끊김 없는 AI 응답 환경을 구축함.
  • 또한 실제 AI 서버 연동 전, 전체 데이터 흐름을 검증하기 위해 Mock AI Client를 구현하여 적용함.

작업 내용

1. 아키텍처 및 연결 구조 (WebSocket)

  • 단일 엔드포인트 적용: 방별 소켓 연결이 아닌 ws://{domain}/ws/chat 단일 경로로 모든 유저 접속 처리.
  • 유저별 메시지 라우팅:
    • 구독 경로: /user/queue/chat
    • 동작 원리: 스프링 STOMP의 UserDestinationMessageHandler를 활용, 세션 ID 기반으로 개별 큐 메시지 분기 처리.

2. 구조적 리팩토링 및 파일 삭제

"관심사의 분리" 및 "구현 방식 변경"에 따른 코드 정리.

  • SubscriptionManager 삭제:
    • 사유: WebClient Flux 스트리밍 방식에서 CompletableFuture 단건 응답 방식으로 변경됨에 따라 관리 객체 불필요.
    • 대체: TaskManager를 신규 구현하여 비동기 작업 생명주기 및 취소(cancel) 관리.
  • RagChatService (Logic):
    • 메시지 전송 로직 제거, 순수 비즈니스 로직(AI 생성 요청)만 수행.
    • 트랜잭션 전파 속성 제어(Propagation.NOT_SUPPORTED)로 DB 커넥션 점유 방지.

3. Mock AI 구현 (Test Environment)

  • Interface 정의: AnswerClient 인터페이스를 통해 AI 요청 규격 추상화.
  • Mock Client 구현:
    • MockAnswerClient@Primary로 등록하여 실제 AI 서버 없이 동작 테스트 가능하도록 설정.
    • 더미 데이터(임시 답변, 추론 단계, 링크 ID 등)를 반환하여 프론트엔드 연동 테스트 지원.
  • DTO 정의:
    • RagAnswerReq: 질문, 히스토리, 모드(Detailed/Concise) 포함.
    • RagAnswerRes: 답변, 근거(ReasoningStep), 관련 링크 ID 포함.

4. 보안 및 인증 (Security)

  • JWT 인증 핸들러: StompHandler에서 CONNECT 시점에만 토큰 검증 수행.
  • Principal 주입: 검증 성공 시 소켓 세션에 유저 정보 바인딩 (User Destination 필수 조건).

Request/Response 예시

Destination: /user/queue/chat

  • Case A: 답변 생성 성공 (success: true)
{
  "success": true,
  "chatId": 101,
  "messageId": 505,
  "content": "임시 답변",
  "step": ["임시 답변 스탭"],
  "links": [
    {
      "id": 3,
      "title": "관련 링크 제목...",
      "url": "https://..."
    },
     {
      "id": 4,
      "title": "관련 링크 제목...",
      "url": "https://..."
    }
  ]
}
  • Case B: 답변 생성 실패/취소 (success: false)
{
  "success": false,
  "chatId": 101,
  "messageId": null,
  "content": "유저 질문 원본",
  "step": null,
  "links": null
}

@github-actions
Copy link

github-actions bot commented Jan 7, 2026

📊 코드 커버리지 리포트

Overall Project 89.96% -0.79% 🍏
Files changed 92.96% 🍏

File Coverage
MessageCommandService.java 100% 🍏
MessageService.java 100% 🍏
ChatQueryService.java 100% 🍏
ChatService.java 100% 🍏
MessageQueryService.java 100% 🍏
RagChatService.java 100% 🍏
TaskManager.java 100% 🍏
MockAnswerClient.java 100% 🍏
ChatFacade.java 100% 🍏
LinkQueryService.java 98.89% 🍏
ChatController.java 78.57% 🍏
Mode.java 37.78% -62.22% 🍏

@ckdals4600 ckdals4600 requested review from Goder-0 and minibr January 7, 2026 06:03
@ckdals4600 ckdals4600 self-assigned this Jan 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

2 participants