Skip to content

좌석 선택 화면 새로고침 시 진행 단계 초기화로 선택 좌석이 반납되는 문제 해결 #428

Description

@kyu4583

배경

  • 서버는 좌석 선택 중 SSE가 끊기면 RECONNECTING_SELECTING으로 표시해 정원 자리와 in-booking 세션(매수·선택 좌석·구독 섹션)을 유지함.
  • 재연결하면 SELECTING_SEAT로 복원하고 저장된 섹션을 자동 재구독하며, 사용자가 고른 좌석 목록을 복원 메시지로 전송함(booking.controller.ts:143-157, booking-seats.service.ts:272-275).
  • 새로고침 복구에 필요한 서버 쪽 장치는 이미 갖춰져 있음.

문제

  • 진행 단계와 매수가 컴포넌트 상태임(front/src/pages/ReservationPage/index.tsx:35-37). 새로고침하면 캡차 단계부터 다시 시작하고 매수도 기본값으로 돌아감.
  • 사용자가 매수를 다시 확정하면 POST /booking/countflushAndSetBookingAmount를 호출하는데(booking.service.ts:368), 매수가 바뀌었는지와 무관하게 선택 좌석을 전부 반납함. 서버가 보관하던 좌석이 이 시점에 사라짐. 실질적으로 새로고침이 좌석 선택 초기화가 됨.
  • 좌석 SSE는 SectionAndSeat에서만 열리므로(SectionAndSeat.tsx:75), 캡차·매수 화면에 머무는 동안에는 좌석 복원 메시지를 받을 화면 자체가 없음.
  • reconnecting GC 타임아웃이 5초(SEATS_SSE_RETRY_TIMEOUT)라, 캡차를 5초 안에 통과하지 못하면 세션이 회수되어 좌석 화면으로 돌아가지 못하고 예매 흐름에서 이탈함.

해결 방향

  • 진행 중인 예매 세션이면 캡차·매수 단계를 건너뛰고 좌석 선택 단계로 복원함
  • 매수와 선택 좌석을 서버 상태에서 받아 화면에 되살림
  • POST /booking/count가 매수가 실제로 바뀔 때만 좌석을 반납하도록 조건을 좁힘
  • 새로고침 직후 좌석 SSE 재연결이 캡차 통과를 기다리지 않도록 연결 시점을 앞당기거나, 재연결 유예 5초가 현실적인지 재검토함

특이사항

  • 대기실 새로고침(대기실 새로고침 시 순번 유실로 화면이 깨지는 문제 해결 #427)과 증상은 비슷하나 원인이 다름. #427은 서버에 있는 순번을 재조회하지 않는 것이고, 이 이슈는 서버 복원 기능이 갖춰져 있는데 프론트 단계 상태가 휘발되어 그 복원을 무효화하는 것임.
  • 매수 재확정 시 좌석을 반납하는 동작 자체는 의도된 것임. 조건 없이 실행되는 부분만 좁히면 됨.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions