문제 코드


useEffect(() => {
  (async () => {
    const chat = await findOrCreateChat(groupId, targetUserId);
    setCurrentChat(chat);
  })();

  const sub = subscribeRealtime();

  return () => sub.unsubscribe();
  // chats, currentChat 같은 상태를 deps에 넣어 계속 다시 실행됨
}, [groupId, targetUserId, chats, currentChat]);

문제 해결 코드

const didInitRef = useRef(false);

const safeSubscribe = useCallback(() => {
  const sub = subscribeRealtime();
  return () => sub.unsubscribe();
}, []);

useEffect(() => {
  if (didInitRef.current) return;
  didInitRef.current = true;

  (async () => {
    const chat = await findOrCreateChat(groupId, targetUserId);
    setCurrentChat(chat); 
  })();

  const cleanup = safeSubscribe();
  return cleanup;
}, [groupId, targetUserId, safeSubscribe]);