Skip to content

fix: 크루 전환 시 사용자 메시지 유실 방지 (사전 저장 분리) - #247

Open
byoungholee0821 wants to merge 1 commit into
beyondworks:mainfrom
byoungholee0821:pr/03-prevent-message-loss
Open

fix: 크루 전환 시 사용자 메시지 유실 방지 (사전 저장 분리)#247
byoungholee0821 wants to merge 1 commit into
beyondworks:mainfrom
byoungholee0821:pr/03-prevent-message-loss

Conversation

@byoungholee0821

Copy link
Copy Markdown

📌 문제점 및 배경

질문을 전송한 후 크루 답변이 생성되는 동안(수초~수분 소요), 사용자가 다른 크루로 전환하거나 페이지를 새로고침하면 작성했던 질문 메시지가 화면과 디스크에서 완전히 유실되는 현상이 발생했습니다.

근본 원인

  • 기존 appendTurn사용자 지시문과 크루 답변을 한 번에 쌍(Pair)으로 묶어서 디스크에 저장했습니다.
  • 답변을 기다리는 동안에는 프론트엔드의 메모리(React State)에만 질문이 올려져 있었으나, 크루 이동 시 슬러그 변경으로 컴포넌트가 재마운트되며 React State가 null로 초기화되어 질문이 영구 소실되었습니다.

🛠️ 해결 방안 (3단계 영속화 구조)

  1. 1단계 (appendUserMsg - 지시 사전 저장)

    • API POST 요청 수신 즉시 고유 ID(mid)와 pending: true 상태로 사용자 메시지를 먼저 디스크에 원자적(Atomic)으로 기록합니다.
    • 답변 대기 중 크루를 이동하거나 새로고침하더라도 디스크에서 pending: true 지시문을 복원합니다.
  2. 2단계-성공 (completePendingTurn - 답변 완료)

    • LLM 답변 생성이 성공하면 mid를 찾아 pending 상태를 해제하고 크루 답변을 추가합니다.
  3. 3단계-실패 (failPendingTurn - 에러/중단)

    • 예산 초과, 네트워크 에러, 중단 버튼 클릭 시 pending 메시지에 failed 사유를 기록하여 사용자가 돌아왔을 때 재전송(Resend) 버튼으로 즉시 재시도할 수 있도록 지원합니다.

🔍 핵심 변경 파일

  • src/thread.mjs: appendUserMsg, completePendingTurn, failPendingTurn 3단계 영속화 함수 추가
  • app/api/companies/[ws]/chat/route.js: POST 핸들러 3단계 구조로 변경
  • app/c/[ws]/crew/[slug]/page.jsx: pending 메시지 대기 UI 표시 (ArgoSpinner + t('chat.pending')) 및 실패 시 재전송 UI
  • app/i18n.jsx: chat.pending ko/en 다국어 번역 키 추가

✅ 검증

  • node --check 정합성 검사 통과
  • 비동기 뮤텍스 락(withLock)으로 동시성 디스크 쓰기 안전 보장

- thread: appendUserMsg, completePendingTurn, failPendingTurn 3단계 영속화 함수 구현
- chat route: POST 핸들러를 지시 사전 저장 -> 답변 생성 -> 완료/실패 3단계 구조로 변경
- page: pending 메시지 opacity 조절 및 ArgoSpinner + 답변 대기 중 표시
- i18n: chat.pending ko/en 번역 키 추가
- docs: 크루 전환 유실 이슈 분석 및 구현 결과 문서 추가 (006, 007)
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.

1 participant