빅 이슈가 있었다. 게시물 수정 후 바로 상세 페이지로 가도록 했는데, 문제는 상세 페이지에서 정보를 보여주는 컴포넌트가 서버 컴포넌트였기 때문에, 수정된 내용이 바로 적용되지 않았던 것. 강력 새로고침을 해야만 바뀐 부분이 비로소 보였다.
때문에 여러가지 방법을 찾아보고 생각을 해보았다.
// GroupEditForm.tsx
const updateMutation = useMutation({
mutationFn: async (newGroupPost: TNewGroupPost) => {
await updateGroupPost(newGroupPost);
},
onSuccess: async () => {
router.push(`/grouppost/read/${id}`);
router.refresh();
},
});
찾아보았을 때 제일 먼저 나온 방법은 router.refresh() 를 사용하는 방법이었다. 같은 문제에서 이렇게 해결한 사람이 많다고 해서 적용을 시도해보았고, 해결이 되지 않았다. 튜터님께 질문을 드렸는데 튜터님도 이해가 잘 안 되신다고 하셔서(?) 일단 다른 방법을 찾아보기로 했다.
// page.tsx
export const revalidate = 0;
function GroupReadPage({ params }: Props) {
return (
<Page>
<GroupDetail params={params} />
</Page>
);
}
export default GroupReadPage;
그 다음은 강제로 revalidate를 0으로 지정하여 무조건 해당 페이지에 들어올 때마다 새로운 데이터를 가지고 오는 방식을 사용해보았다. 이렇게 하니 수정 시 바로 갱신은 잘 되었으나, 꼭 수정을 하지 않더라도 매번 새로 가져오기 때문에 좋은 방법이 아니므로 다른 방법을 생각해보았다.
그렇게 계속 방법을 찾아보던 중 튜터님께서 한 가지 방법을 알려주셨는데, 바로 form 내 action을 사용하여 revalidatePath를 해주는 방법이었다.
우선 form 태그 내의 action이 들어갈 수 있다는 걸 배웠고, action에 기존 업데이트 로직 함수를 넣어주었다.
그 다음 revalidatePath에 대해 배웠다. 해당 함수는 인자로 넣어준 경로를 서버에서 강제로 다시 가져오는 기능을 가지고 있었다. 그러나 클라이언트 컴포넌트에서는 작동하지 않아, 새로운 파일을 만들어 해당 파일에서 revalidatePath 기능을 가진 함수를 만들고, 업데이트 onSuccess 시 해당 함수를 가져와 호출해주는 방식을 사용했다.
// revalidate.ts
"use server";
import { revalidatePath } from "next/cache";
export async function groupPostRevalidate(id: string) {
revalidatePath(`/grouppost/read/${id}`);
}
// GroupEditForm.tsx
const updateMutation = useMutation({
mutationFn: async (newGroupPost: TNewGroupPost) => {
await updateGroupPost(newGroupPost);
},
onSuccess: async () => {
groupPostRevalidate(id);
router.push(`/grouppost/read/${id}`);
},
});
이렇게 진행하니 수정 시에만 성공적으로 갱신을 할 수 있었다. 새로운 개념을 알게 되어서 좋았다.
한가지 의문점은, 꼭 action을 쓰지 않아도 revalidatePath는 잘 동작하는데, action을 사용한 이유에 대해서는 익일 질문을 드려야겠다.
오후를 통으로 수정 시 바로 갱신 기능에 써버려서 생각보다 많이 진행을 못해 아쉬운 날이었다. 하지만 그 시간이 결코 무의미하지 않았고 성장했다고 생각하기 때문에 긍정적으로 생각하려고 한다. 또한 내가 프로젝트에서 맡은 부분이 기능적으로는 거의 다 끝났기에 결코 느리지는 않다고 생각한다. 그럴 내가 아니긴 하지만 안일하게 생각 말고 프로젝트에 도움이 될 수 있는 부분은 최대한으로 도움이 되자.
그러실 솔님이 아니죠~!!!