client에서 직접 supabase로 업데이트 요청을 하지 않고, route로 이양하기
update할 때, 권한 체크하기
action.tsx
export const updateTemplate = async (data) => {
'use server';
const url = '~~';
await fetch(url, {
method: 'PATCH',
body: data
}); // route로 요청보내기
revalidateTag('template'); // 데이터 refetch
};
SubmitButton.tsx
const SubmitButton = () => {
// ...
const submit = await () => {
// ...
const data = {};
await updateTemplate(data);
};
};
route.ts
const PATCH = (req) => {
// ...
await checkUserUpdatePermission();
await updateTemplateMeta();
await updateTemplatePosts();
};
업데이트 후, refetch한 serverState와 useState로 관리하던 clientState간의 동기화가 되지 않는 문제
현재 구조에서는 다음 플로우로 업데이트가 2번 일어났을 때, 예상했던 동작과 다르게 수행 됨.
(post를 추가) -> (첫 번째 업데이트) -> (refetch) -> (두 번째 업데이트)
post를 추가했을 때, clientState는 추가된 post의 id를 임시로 만들어서 관리를 한다.
업데이트를 수행했을 때, 임시 id는 제외하고 insert를 하게 되는데 이 post에 대해 새로운 id를 부여함.
그렇기에 refetch를 했을 때 가져오는 template의 post id와 clientState에서의 post id가 달라짐.
업데이트를 1번만 했으면, 크게 문제될 것은 아니지만 다시 업데이트를 했을 때 문제가 발생
아무것도 변경하지 않고, 두 번째 업데이트를 수행한다면
(예상 로직)
post에 대해서는 insert 없이, 기존 post에 대해서 update만 수행
(실제 로직)
이전 업데이트에서 추가되었던 post는 delete & insert 수행.
추가되었던 post에 대한 id를 서로 다르게 관리하고 있기 때문)
나는 더 간단한 방식인 1번 방식으로 진행했음.
2번 방식은 동기화 때문에 하기에는 너무 과하다고 생각함.
3번 방식은 로직이 복잡해질 것
// serverComponent
const Page = async() => {
// ...
return <InnerPage template={template} />
};
// clientComponent
const InnerPage = (template) => {
const [posts, setPosts] = useState(template.posts);
useEffect(() => {
setPosts(template.posts);
}, [template.posts]);
// ...
};
없음.