인프런 커뮤니티 질문&답변

우동이님의 프로필 이미지
우동이

작성한 질문수

Slack 클론 코딩[실시간 채팅 with React]

DM 채팅하기

DM 채팅하기 질문드립니다.

작성

·

179

0

강의장면에서 크롬창 2개켜서 포커스를 해야만 실시간 채팅이 반영된다고 말씀해주셨는데요.

제가 컴퓨터 1대를 더 준비해서 컴퓨터2대로 통신을 해봤는데 이미 포커싱이 된 상태에서는 실시간으로 채팅이 올라오지 않더라구요. 포커싱을 한번 해제했다가 돌아와야 반영됬습니다. (하지만 Socket.io는 바로 data를 받아옵니다)

onMessage에서는 실시간으로 data를 받아와 mutateChat()함수도 실행되는데 chatData가 바꼇음에도 불구하고 리렌더링이 진행되지 않았습니다. 아마 immutable하게 바꾸지 않아서 그런것 같은데.... 

아래 코드에서 mutateChat()을 통해 chatData를 변경하면 리렌더링이 일어나야하는데 리렌더링이 일어나지 않아서 실시간으로 반영이 안되는 것 같습니다. 혹시 이 부분은 제가 잘못한게 있는 것인지 아니면 의도한 것인지 궁금합니다.

const onMessage = useCallback(
    (data: IDM) => {
      if (data.SenderId === Number(id) && myData.id !== Number(id)) {
        mutateChat((chatData) => {
          chatData?.[0].unshift(data);
          console.log(chatData);
         // 여기서 chatData가 변경됬음에도 불구하고 리렌더링이 일어나지 않습니다.
          return chatData;
        }, false).then(() => {
          if (scrollbarRef.current) {
            if (
              scrollbarRef.current.getScrollHeight() <
              scrollbarRef.current.getClientHeight() + scrollbarRef.current.getScrollTop() + 150
            ) {
              //console.log('scrollToBottom!', scrollbarRef.current?.getValues());
              setTimeout(() => {
                scrollbarRef.current?.scrollToBottom();
              }, 50);
            }
          }
        });
      }
    },
    [chatData, scrollbarRef],
  );

답변 1

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

console.log(chatData)를 해보시고

mutateChat 이후에 콘솔로그가 찍히는지 한 번 확인해보세요.

저도 이와 비슷하게 해결되지 않는 문제가 있습니다.

채팅방에서 채팅을 보냈는데, 본인이 보낸 채팅조차도 바로바로 올라오고 있지 않습니다.

mutateChat((chatData) => {
          chatData?.[0].unshift(data);
          console.log(chatData);
         // 여기서 chatData가 변경됬음에도 불구하고 리렌더링이 일어나지 않습니다.
          return chatData;
        }, false)

console을 찍어보면 chatData가 분명 변경은 되었지만, 리렌더링이 되고 있지 않습니다.

false를 제거하거나 revalidate를 기다려서 서버에서 직접 fetch할 때만 컴포넌트가 리렌더링 됩니다.

고민해본 결과 unshift가 불변성을 지키지 않는 메서드라서 그런가 싶은데, 이는 문제가 없는지 궁금합니다.

추가로, makeSection에 console을 달아본 결과, local mutate를 시켰을때 makeSection이 작동하지 않는 것을 봤습니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

불변성 때문일 수도 있습니다만 제 코드는 동작하는 것으로 봐서 mutate가 아니라 데이터를 가져오는 부분이 문제일 수도 있습니다.

왜 그런것인지는 잘 모르겠으나, 저의 경우에는 mutate에서 immer를 사용해서 해보니 잘 되었습니다. 

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

네네 그러면 불변성 문제가 맞았네요 ㅠㅠ

우동이님의 프로필 이미지
우동이

작성한 질문수

질문하기