diff --git a/Aug/article/Deep-Dive: Cching-and-Revalidating.md b/Aug/article/Deep-Dive: Cching-and-Revalidating.md new file mode 100644 index 0000000..5d512e4 --- /dev/null +++ b/Aug/article/Deep-Dive: Cching-and-Revalidating.md @@ -0,0 +1,451 @@ +# [Deep Dive: Caching and Revalidating ](https://github.com/vercel/next.js/discussions/54075) + +### ๐๏ธ ๋ฒ์ญ ๋ ์ง: 2024.08.11 + +### ๐ง ๋ฒ์ญํ ํฌ๋ฃจ: ๋ฒ๊ฑด๋(์ ํํ) + +--- + +๋ค์์ Next.js App Router์์ ์บ์ฑ๊ณผ ์ฌ๊ฒ์ฆ(revalidating)๊ณผ ๊ด๋ จํ์ฌ ์๋กญ๊ฒ ๋์ ๋ ํด๋ฆฌ์คํฑ(heuristics)์ ๋ํ ๋ด์ฉ์ ๋๋ค. ์บ์ฑ์ด ์ด๋ป๊ฒ ์๋ํ๋๋ก ์ค๊ณ๋์๋์ง์ ๋ํด ๋ชจ๋๊ฐ ๋์ผํ ์ดํด๋ฅผ ํ ์ ์๋๋ก ์ด ์ฃผ์ ์ ๋ํด ์ฌ๋ ์๋ ๋ ผ์๋ฅผ ์งํํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. + +์ด ๋ ผ์๋ ์ต๊ทผ์ ๊ณต๊ฐ๋ [์บ์ฑ ๊ด๋ จ ๋ฌธ์](https://nextjs.org/docs/app/building-your-application/caching)์ ๋ณด์์ ์ผ๋ก ์์ฉํฉ๋๋ค. ์ด๋ ์ปค๋ฎค๋ํฐ์ ์ผ๋ถ ๊ตฌ์ฑ์๋ค์ด ํด๋ผ์ด์ธํธ ์ธก ๋ผ์ฐํฐ ์บ์(client-side router cache)์ ๋ํด ํผ๋์ ๊ฒช๊ฑฐ๋, ์ฝ๊ฐ ๋ค๋ฅธ ๋์์ ์ํ๋ ๋ฌธ์ ์ ๋ํ ํ์ ์์ ์ผ๋ก, ์ด ๊ธ์ ํตํด ์บ์ฑ์ด ์ด๋ป๊ฒ ์ค๊ณ๋์๋์ง์ ๋ํ ๋ฐฐ๊ฒฝ์ ์ค๋ช ํ๊ณ [์ปค๋ฎค๋ํฐ์์ ๋ ผ์](https://github.com/vercel/next.js/issues/42991#issuecomment-1673691751)๋ฅผ ์ด๊ธฐ ์ํ ๊ธฐํ๋ฅผ ์ ๊ณตํ๊ณ ์ ํฉ๋๋ค. + +**๋ต๋ณ์ ์์ฑํ์๊ธฐ ์ ์ ์ด ๊ธ ์ ์ฒด๋ฅผ ์ฝ์ด๋ณด์๊ธธ ๋ถํ๋๋ฆฝ๋๋ค. ์ด ๋ฌธ๋งฅ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.** + +--- + +## - ๋ฐ์ดํฐ ๋ณ์ด(Mutations) + +App Router๋ ๊ฑฐ์ 1๋ ์ ์ ์ฒ์ ๋ฐํ๋์์ต๋๋ค. ๋น์์๋ ๋ฐ์ดํฐ ๋ณ์ด๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ณํ์ธ์ง์ ๋ํด ์์ง ๊ณต์ ํ์ง ์์์ต๋๋ค. ๊ทธ๋๋ Server Actions๊ฐ ์ง์๋์ง ์์๊ณ , `router.refresh()`๊ฐ ์์๋๋ก ๋ผ์ฐํธ ์บ์๋ฅผ ์ง์ฐ์ง ์์์ต๋๋ค. + +์ด๋ก ์ธํด ์ฝ๊ฐ์ ํผ๋์ด ์์์์ ์ดํดํ๋ฉฐ, ์ด์ ๋ํด ๋ช ํํ ํ๊ณ ์ ํฉ๋๋ค. + +๊ทธ ์ดํ๋ก ์ฐ๋ฆฌ๋ [Server Actions](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations)๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์ด๊ฒ์ด ์์ ํ๋๋ฉด ๋๋ถ๋ถ์ ๋ณ์ด๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ๊ธฐ๋๋ฉ๋๋ค. ๋ํ, `router.refresh()`๊ฐ ์์๋๋ก ์๋ํ๋๋ก ๊ฐ์ ํ์ต๋๋ค. + +์๋์์๋ ๊ฐ ์์์ ๋ํ ์ค๋ช ๊ณผ ๊ทธ๊ฒ๋ค์ด ์ด๋ป๊ฒ ํจ๊ป ์๋ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋๊ตฌ์์ ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ๋์(๋๋ก๋ ์๋ฌต์ ์ผ๋ก ์ฌ์ฉ๋)์ ์ด๋ป๊ฒ ์ฌํํ ์ ์๋์ง์ ๋ํ ์น์ ์ ์ฐพ์ ์ ์์ต๋๋ค. + +์ด ์น์ ์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋์ด ์์ต๋๋ค: + +- ๋ด๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํธ๋ฆฌ๊ฑฐํ๋ ๋ณ์ด, ์๋ฅผ ๋ค์ด ํผ ์ ์ถ ๋ฑ. +- ๋๋ฃ์ ๊ฐ์ ๋ค๋ฅธ ์ฌ๋๋ค์ด ํธ๋ฆฌ๊ฑฐํ๋ ๋ณ์ด, ์๋ฅผ ๋ค์ด CMS์์ ์ ํ์ ์ถ๊ฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ. + +## - ๋ด๊ฐ ํธ๋ฆฌ๊ฑฐํ๋ ๋ณ์ด + +### ๋ฌดํจํ(Invalidation) + +**Server Actions (revalidatePath / revalidateTag)** + +- ์ธ์ ์ ์ฉํ๊ฐ + + - ์๋ฒ๊ฐ ํ์ํ ์ฌ์ฉ์ ์ํธ์์ฉ + + - ์์: ํผ(form) ์ ์ถ + + - ์ ํ ์ถ๊ฐ + - ์ฌ์ฉ์ ์ธ์ ์ ์ผ๋ถ๋ก ์ ํ์ ์ถ๊ฐํ ํ, revalidateTag ๋๋ revalidatePath๋ฅผ ํธ์ถํ์ฌ ํ์ด์ง๊ฐ ๋ค์ ๋ ๋๋ง๋๋๋ก ํฉ๋๋ค. ์ด๋ ์ฅ๋ฐ๊ตฌ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ฒ ์ปดํฌ๋ํธ๋ก ๋ ๋๋ง๋๊ธฐ ๋๋ฌธ์ ์ต์ ์ํ๋ก ์ ์ง๋ ์ ์์ต๋๋ค(useSWR / react-query์ mutate()์ ์ ์ฌํ ๋์). + + - ๋ก๊ทธ์ธ / ๋ก๊ทธ์์ + ํผ์ ํตํด ์ฌ์ฉ์ ์ด๋ฆ/๋น๋ฐ๋ฒํธ(๋๋ ๋ค๋ฅธ ์ธ์ฆ ํ๋ฆ)๋ฅผ ์ ์ถํ๊ณ , ์๋ฒ ์ก์ ์ ์ํด ์ฒ๋ฆฌ๋ฉ๋๋ค. ์ฟ ํค๋ฅผ ์ค์ ํ ํ, revalidatePath ๋๋ revalidateTag๋ฅผ ํธ์ถํ์ฌ ๋ผ์ฐํฐ ์บ์๊ฐ ์ญ์ ๋๊ณ , ์๋ก ์ค์ ๋ ์ฟ ํค๋ก ์ ๋ ๋๋ง์ด ์ด๋ฃจ์ด์ง๋๋ก ํฉ๋๋ค. + + - ์์: ํ์ด์ง ๋ด ํ์ดํ์ดํค๋(์ค์๊ฐ ๊ฒ์) / ๊ฒ์ ๊ฒฐ๊ณผ ์์ + - ์๋ฅผ ๋ค์ด [nextjs.org/docs](https://nextjs.org/docs)์์ ๊ฒ์ํ ๋ ๋ณผ ์ ์๋ ๊ฒ(ํ์ฌ๋ Algolia์ ์ํด ์ง์๋์ง๋ง, ์ด๋ฅผ ์ง์ ์์ฑํ ์ฝ๋๋ก ์ง์ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค). + + - ์์: ๊ถํ์ ๊ธฐ๋ฐํ ํดํ + - Facebook, Instagram, GitHub์์ ๋ณผ ์ ์๋ ์์๋ก, ํดํ์ด ํด๋ฆญ ์ ์๋ฒ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํด ๋ก๋๋ฉ๋๋ค. + +- ์๋ ์๋ฆฌ + +1. `"use server"`๋ ์ปดํ์ผ ์ ํจ์์ ๋ง์ปค๋ฅผ ์ถ๊ฐํ๊ณ , ํด๋น ํจ์๋ฅผ ๋ณ๋์ ๋ชจ๋๋ก ์ด๋์ํต๋๋ค. ๋ชจ๋ Server Actions๋ ๊ฐ๊ฐ ๊ณ ์ ํ ID๋ฅผ ๊ฐ์ง๋ฏ๋ก, ๊ฐ๋ณ์ ์ผ๋ก ์ฐธ์กฐ๋ ์ ์์ต๋๋ค. (์ด ์ค๋ช ์ ๋งค์ฐ ๋จ์ํ๋ ๋ฒ์ ์ด๋ฉฐ, ์ค์ ๋ก๋ ๋ ๋ณต์กํฉ๋๋ค.) + +2. ํจ์๋ฅผ ํธ์ถํ๋ฉด, ํ์ฌ URL๋ก Server Action ID๋ฅผ ํฌํจํ POST ์์ฒญ์ ๋ณด๋ด๋ฉฐ, ์ด๋ฅผ ํตํด Next.js๊ฐ ์ฌ๋ฐ๋ฅธ ๊ธฐ๋ณธ ํจ์๋ฅผ ํธ์ถํ ์ ์๊ฒ ๋ฉ๋๋ค. + +- ํจ์ ํธ์ถ ์์ + `