Skip to content

fix(stomp): 재연결 때 놓친 일정·채팅 복구와 재연결 백오프 적용 - #247

Open
KangShinGyu98 wants to merge 16 commits into
devfrom
fix/stomp-sync-recovery
Open

KangShinGyu98 wants to merge 16 commits into
devfrom
fix/stomp-sync-recovery

Conversation

@KangShinGyu98

@KangShinGyu98 KangShinGyu98 commented Oct 26, 2026 •

Copy link
Copy Markdown
Collaborator

노션

변경 내용

  • 재연결: 수동 루프를 없애고 stompjs 지수 백오프(시작 1~2초, 상한 5초)에 맡김. 세션 확인은 beforeConnect에서 하고, 백엔드 장애(503)로는 로그아웃하지 않음. 배너는 끊긴 지 45초 뒤에 띄우고, 네트워크가 돌아오면 바로 재연결
  • 방 데이터: 방 토픽을 구독할 때마다(첫 연결·재연결·/home 복귀) 일정·북마크·안읽음 수를 다시 받고, 재조회가 실패해도 보이던 목록은 유지. 끊긴 동안 권한을 잃은 방은 재연결 뒤 퇴장
  • 일정 드래그: 끊긴 동안과 놓친 변경을 다시 받는 동안 드래그를 막음. 전체 재조회를 하나로 모아 늦은 응답이 새 일정을 덮지 않게 하고, 같은 일차 이동은 드래그한 항목 id로 저장
  • 채팅: sequence 커서로 실시간 메시지를 이어 붙이고, 빈 번호·재연결·재진입 때 afterSequence로 끝까지 따라잡음. 첫 기록 로딩 중 받은 채팅을 유지하고, 재연결로 붙은 메시지 앞에 구분선을 두고 스크롤

변경 이유

  • STOMP가 끊긴 동안(절전·네트워크·/home 이동) 놓친 변경을 복구하지 않아, 옛 일정 기준 드래그로 잘못된 순서가 저장되고 채팅이 사라지거나 15개를 넘으면 누락됨
  • 웹소켓만 실패하고 세션 API는 200이면 재연결이 지연 없이 무한 반복돼 백엔드 장애를 키움

테스트

  • npm run lint
  • npm test
  • npm run build
  • 화면 확인: pc-chrome
  • 그 외 수동 검증:
    • DevTools로 /ws/* 차단 → 재연결 간격 1.58 → 2.92 → 5.05초
    • 로컬 크롬 같은 계정 두 탭(Claude 조작): 백엔드 재시작 중 세션 503·로그아웃 없음 / 끊긴 탭만 드래그 잠금 / 재연결·/home 복귀 때 일정 조회 1번으로 다른 탭 변경 반영 / 끊긴 동안 받은 채팅을 재연결 직후 표시 / 첫 기록 응답을 늦춰도 그 사이 받은 채팅 유지 / 연달아 보낸 채팅이 보낸 순서대로 표시
    • PC + 모바일로 일정 동시 수정 테스트

🤖 Generated with Claude Code

KangShinGyu98 and others added 16 commits October 25, 2026 18:11
- 백엔드 도달 실패·5xx·429는 503, 인증 실패가 확정된 경우만 401
- refresh 직후 재확인이 장애로 실패해도 새 쿠키 전달
- proxy의 세션 판정은 그대로 유지

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- reconnectDelay·EXPONENTIAL·maxReconnectDelay(5초)로 재시도 간격 위임
- 재연결 직전 세션 확인을 beforeConnect로 옮기고 401이면 재연결 중단 후 로그아웃
- 연결 문제 배너는 끊긴 지 45초가 지나면 표시하고 연결되면 해제
- 다시 시도는 연결 시도 중이 아닐 때만 바로 재연결

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 브라우저 online 이벤트에서 다시 시도와 같은 경로로 즉시 재연결

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 구독 오류(ERROR)를 받으면 방 접근을 HTTP로 확인해 거부면 퇴장 처리
- 구독 오류로 연결이 닫히면 5초 뒤 다시 연결해 1초 간격 반복 방지

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- refetchOnMount: false 제거, staleTime: Infinity는 유지해 무효화된 경우에만 조회

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 취소된 일정 조회는 캐시에 쓰지 않고, 미리보기를 기다린 뒤 한 번에 쓰기
- 본인 일차 변경·여행 날짜 변경·ROOM_SCHEDULES_RESYNCED는 room-schedules 조회를 거쳐 재조회
- 일차 목록을 고치는 동안 전체 재조회가 진행 중이면 다시 시작
- 재조회로 순서가 바뀐 일차는 이웃이 바뀐 구간 경로만 무효화

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 첫 구독·재연결·/home 복귀·방 전환 때 일정·북마크·안읽음 배지를 무효화
- 개인 큐를 구독할 때 놓친 입장 요청 목록을 무효화
- 화면에 있는 조회만 바로 다시 받고, 준비물·가계부·채팅 목록은 대상에서 제외

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 모바일 일정·경로 카드·북마크 폴더·폴더 상세·북마크에서 추가 모달은 처음 불러오기에 실패했을 때만 오류 화면
- 경로 카드는 재조회 실패 뒤에도 받아 둔 일정으로 장소 목록을 계속 읽음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 무효화된 멤버 목록에는 이벤트를 패치하지 않아 다음 마운트 때 재조회 유지
- 멤버 목록을 받은 적이 없으면 한 명짜리 목록을 만들지 않음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 데스크톱 같은 일차·다른 일차, 모바일, 일차 이동 모두 드래그 시작 때 순서와 놓을 때 순서를 비교
- 같은 일차 이동은 드롭 시점 목록 대신 드래그한 항목 id로 요청

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 데스크톱·모바일·일차 이동 손잡이는 기존 비활성 표시를 쓰고 목록은 그대로 보임
- 드래그 중에 끊기면 놓아도 저장하지 않고 알림

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- STOMP client·연결 상태를 보낼 때 ref로 읽어 markMessagesRead가 연결마다 새로 만들어지지 않게 함
- 이 함수에 기대는 채팅 최초 기록 조회가 재연결 때마다 다시 시작되던 원인을 없앰

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 기록 조회·최신으로 이동·아래 페이지·따라잡기 중 받은 메시지를 모았다가 결과 반영 뒤 같은 규칙으로 처리(로딩 중 받은 일반 채팅 유실 수정)
- 커서+1만 목록 끝에 붙이고, 번호가 비면 afterSequence로 200개씩 끝까지 받음
- 재연결·다른 방에서 돌아올 때 놓친 메시지를 따라잡고, 재연결로 새로 붙은 메시지 앞에 구분선을 두고 그 자리로 스크롤
- 중간 창에서는 새 메시지를 붙이지 않고 같은 id만 갱신, AI 요청은 대기 상태로 되돌리지 않음
- 빈 방은 afterSequence=0 대신 최신 페이지를 받고, 400·403·404는 다시 보내지 않음(네트워크·5xx는 1·2·4초 간격 재시도)
- 최초 기록 조회가 재연결로 멈추지 않게 하고, 끝내 실패했으면 재연결 때 다시 받음
- 목록을 sequence 순으로 정렬하고, 최신으로 이동은 목록을 비우지 않고 한 번에 교체
- 메시지·읽음 위치 조회 API가 HttpError를 던지게 함

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 서버는 저장 충돌을 재시도한 순서로 sequence를 매겨, 번호 순 정렬이면 1~4가 3·4·1·2로 보였음
- 목록은 작성 시각 순으로 되돌리고, sequence 순서는 빈 번호 판단에만 사용
- 최초 기록·최신으로 이동 결과도 작성 시각 순으로 정렬

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 드래그 시작과 놓을 때의 순서 비교, "일정이 바뀌어서 옮기지 않았어요" 알림 제거(데스크톱·모바일·일차 이동)
- 같은 일차 이동은 계속 드래그한 항목 id로 요청
- 연결이 끊긴 동안과 다시 받는 동안의 드래그 잠금은 유지

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vercel

vercel Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
frontend-server Ready Ready Preview Oct 26, 2026 4:54am UTC

Request Review

@sonarqubecloud

Copy link
Copy Markdown

This branch was successfully deployed

1 active deployment
Preview — ccade969 Deployed Oct 26, 2026 by vercel[bot]
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