반응형
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

짧은코딩

mutate 본문

인프런, 유데미/Slack 클론 코딩

mutate

5_hyun 2022. 7. 21. 01:35
반응형

mutate

mutate는 서버에 요청 안보내고 데이터를 수정하는 것이다. 즉 서버 요청을 하지 않고 클라이언트 쪽에서 데이터를 조작할 수 있다. 그러다가 결국 마지막엔 서버에 데이터가 이렇게 바뀐게 맞나 점검을 하는데 이것이 mutate의 두번째 인자이고 shouldRevalidate라고 한다. 따라서 이 두번째 인자에 false를 넣어야 서버에 요청을 보내지 않는다. 

 

-예시

인스타에 좋아요를 누르면 하트의 색이 변하는데 이것은 서버에 가기 전에 하트의 색을 바꾸는 것이라 mutate를 사용했다. 이렇게 하면 사용자 입장에서는 빠르게 적용이 되는 것 처럼 느껴져서 좋다. 하지만 만약 서버에 전송이 실패하면 다시 좋아요를 취소시킨다. 이런 것을 OPTIMISIC UI라고 부른다. 낙관적인 UI라고 부른다. 

 

사용법

1번째 방법

  const { data, error, mutate } = useSWR('http://localhost:3095/api/users', fetcher);

이렇게 useSWR에 넣어두면 컴포넌트가 로딩될 때마다 한번은 요청이 간다.

 

2번째 방법

import useSWR, { mutate } from 'swr';

const Workspace: FC<React.PropsWithChildren<{}>> = ({ children }) => {
  const onLogout = useCallback(() => {
    axios
      .post('http://localhost:3095/api/users/logout', null, {
        // 이걸해야 백과 프론트 쿠키 공유 가능
        withCredentials: true,
      })
      .then(() => {
        // 로그아웃이 성공하면 data엔 내 정보가 있다가 false로 바뀜
        mutate('http://localhost:3095/api/users', false, false);
      });
  }, []);

이렇게 하면 로딩될 때 마다 요청 가는 것도 아낄 수 있다. 하지만 1번째 방법을 더 많이 쓰기 때문에 굳이 이렇게 사용할 필요는 없다.

 

문제점(dedupingInterval로 해결)

  const { data, error, mutate } = useSWR('http://localhost:3095/api/users', fetcher);

이 코드를 여러 컴포넌트에 사용하는데 이 코드를 많이 쓰면 요청이 많이 가지 않을까?

 

  const { data, error, mutate } = useSWR('http://localhost:3095/api/users', fether, {
    dedupingInterval: 2000,
  });

이렇게 dedupingInterval을 사용하면 아무리 많은 요청을 보내도 저 시간 동안은 딱 한번만 요청이 보내진다. 첫번째 요청만 보내지고 다른 요청들은 캐시 데이터를 사용한다.

반응형

'인프런, 유데미 > Slack 클론 코딩' 카테고리의 다른 글

공통된 레이아웃을 사용할 때  (0) 2022.07.21
gravatar와 npm 설치시 @types의 유무  (0) 2022.07.21
로그인 페이지 실행 로직  (0) 2022.07.20
CORS와 해결방법  (0) 2022.07.20
Link와 swr  (0) 2022.07.20
Comments