next.js๋ฅผ ์ฌ์ฉํ๋๋ฐ ์์ ํฌ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ๋คํธ์ํน ์์ ์๋ชจ๊ฐ ํฌ๋๋ผ๊ตฌ์.
์ต์ ํ๋ฅผ ์ํด์ ๊ธฐ๋ณธ ์ค์ ์ ์์ ํด์ผํฉ๋๋ค.
// next.config.js
...
images: {
// ๋ฆฌ๋ชจํธ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ
domains: ['your-cdn-image-domain'],
// ํ๋ฃจ๋์ ์บ์ ์ ์ฅ
minimumCacheTTL: 86400,
}
...
https://nextjs.org/docs/pages/api-reference/components/image#minimumcachettl
minimumCacheTTL
์ ์ค์ ๊ฐ์ผ๋ก ํ๊ฑฐ๋, ํค๋์ Cache-control
์ค ๋ ํฐ ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ํค๋์ cache๋ฅผ ์ค์ ํ ๊ธฐ์ต์ด ์์ต๋๋ค.
์ญ์๋ ์ค์ ํ์ง ์์๋ค์. ๐
๋ฐฉ๊ธ ์์ ํ next.config.js
์ ์ถ๊ฐํฉ๋๋ค.
// next.config.js
...
headers: async () => {
return [
{
headers: [
{
key: 'Cache-Control',
value: 'private, no-cache, no-store, max-age=0, must-revalidate',
},
],
source: '/:path*',
},
{
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=86400, immutable',
},
],
source: '/:path(.+\\.(?:ico|png|svg|jpg|jpeg|gif|webp|json|mp3|mp4|ttf|ttc|otf|woff|woff2)$)',
},
{
headers: [
{
key: 'Cache-Control',
value: 'private, no-cache, no-store, max-age=0, must-revalidate',
},
],
source: '/_next/data/:path*',
},
{
headers: [
{
key: 'Cache-Control',
value: 'private, no-cache, no-store, max-age=0, must-revalidate',
},
],
source: '/_next/:path(.+\\.(?:json)$)',
},
];
},
...
์ด์ ์ด๋ฏธ์ง๋ฅผ ํฌํจํ ํฐํธ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ด ์บ์ ์ฒ๋ฆฌ๋๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค.
์ ๋ฐ์ดํธ ํ ์บ์์ ์ค๋ณต๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น..?
-> ๊ธฐ๋ณธ์ ์ผ๋ก next์์๋ my_image.cd0657b0.png ์ ๊ฐ์ดContent Hash
๊ฐ ์ ์ฉ๋์ด ๋ฐฐํฌ ๋ ๋ง๋ค ๋ค๋ฅธ ์ด๋ฆ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์บ์ฑ์ฒ๋ฆฌ๊ฐ ๋์ง ์์๊ฒ์ด๋ฉฐ, ํด๋ผ์ด์ธํธ๋ ํญ์ ์ต์ ๋ฒ์ ์ ์์ค๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.