
임시 방편으로 setTimeout을 사용하였다
채팅방에서 뒤로 갔다가 다시 들어오면 생기는 "WebSocket is closed before the connection is established" 오류인데
이전 구독을 해제 하기위해 WebSocket이 비동기로 닫히는 시간이 필요해서 이다.
수정 전 코드

팀장 님의 의견으로 구조 자체를 바꾸기로 하였다.
“Supabase Realtime은 서버에서 변경 사항이 생겼을 때만 클라이언트로 데이터를 밀어주는 역할만 해주면 될 것 같고, TanStack Query는 클라이언트의 캐시와 UI 상태를 관리하는 쪽이 적절하다”
이 말은 즉
각자 맞는 역할로 분리하는 것이다. 각각의 기능의 본질을 알지 못하여 역할을 혼동하여 막 코드를 작성한 탓이다..
roomId 바뀔 때마다 useEffect에서:setTimeout)onMessageInsert 호출 → 로컬 상태를 수동으로 갱신

| Before | After |
|---|---|
Supabase Realtime이 메시지를 수신한 후 직접 setState()를 호출하여 UI에 렌더링 | Supabase Realtime은 오직 invalidateQueries()만 수행 |
ChatMessages에서 메시지 상태(useState)를 별도로 관리 | useMessages() (React Query)로 상태 일원화 |
변경 후 코드

각 기능에는 알맞는 역할 이 있다. 다른 모양에 다른 퍼즐을 끼우면 그 당시에는 괜찮을 지 몰라도 연쇄적인 문제가 발생한다.
해당 기능들을 알아야 구조를 잡을때 좋은 아키텍쳐가 나온다.
겉할기 식으로 알고 있으니 생기는 문제들이다.
왜 라는 생각을 끊임 없이 해야한다. 적당히 매몰되지 않고서 본질, 즉 메타를 인지를 잘하느냐 에 따라 능률, 성능, 속도가 향상 될 수 있다고 느꼈다.