개인공부/라이브러리
SWR의 Global mutate와 Bound mutate, optimisticData
minseokiim
2024. 9. 2. 18:48
SWR의 mutate 함수는 캐시된 데이터를 갱신하는 데 사용
1. Global mutate
import { useSWRConfig } from 'swr';
function MyComponent() {
const { mutate } = useSWRConfig();
const updateGlobalData = async () => {
await mutate('/api/posts');
};
return <button onClick={updateGlobalData}>Update Global Data</button>;
}
-> useSWRConfig 훅을 통해 접근
특정 키(/api/posts)에 해당하는 데이터를 전역적으로 갱신
2. Bound mutate
import useSWR from 'swr';
function MyComponent({ postId }) {
const { data, mutate } = useSWR(`/api/posts/${postId}`);
const updateBoundData = async () => {
await mutate({ ...data, newData: 'updated value' }, {
optimisticData: { ...data, newData: 'optimistic value' },
rollbackOnError: true,
revalidate: false,
});
};
return <button onClick={updateBoundData}>Update Bound Data</button>;
}
-> useSWR 훅 내부에서 반환된 mutate 함수를 사용하여, 해당 훅과 바인딩된 데이터만을 갱신
같은 키를 사용하는 다른 컴포넌트에 영향을 미치지 않고, 해당 컴포넌트에서만 데이터를 갱신
+ Optimistic Data
: SWR에서 제공하는 기능으로, 낙관적인 UI 업데이트를 구현할 때 사용
용자가 요청을 보내기 전에 미리 UI를 업데이트하고, 서버 응답이 실패하면 롤백할 수 있게 해줌.
return mutate(addComment(post.id, comment.comment), {
optimisticData: newPosts, // 요청이 완료되기 전에 미리 업데이트 할 데이터
요청이 성공하면 이 데이터가 실제 데이터로 교체됨.
populateCache: false, //요청이 성공한 후에 캐시를 업데이트할지 여부, optimisticData 써줄거니까 false
revalidate: false, // 데이터를 갱신한 후에 서버에 데이터를 다시 요청할지 여부
rollbackOnError: true, //요청 실패시 임시로 변경된 데이터 롤백 여부
});
* 리팩토링
1. Global mutate에서 Bound mutate로 변경
: optimisticData와 함께 사용하면, 해당 컴포넌트에서만 낙관적인 업데이트를 적용
Global mutate는 전역으로 영향을 미치므로, 특정 컴포넌트에서만 필요한 낙관적 업데이트를 적용 불가
2. Bound mutate에서 Global mutate로 변경
: bound mutate를 통해 업데이트(put 요청) 했는데,
해당 컴포넌트에서는 잘 반영되지만, 전체를 가져오는 컴포넌트에서는 업데이트가 되지 않은 경우가 생겨 global Mutate를 사용.
Global mutate는 특정 키에 해당하는 데이터를 사용하는 모든 컴포넌트의 캐시를 갱신하므로, 동일 데이터를 참조하는 곳에서 일관된 상태 유지함!