Next.js

    Next.js์˜ Pre-Rendering(SSR vs SSG) ๊ณผ Hydrate

    Next.js์˜ Pre-Rendering(SSR vs SSG) ๊ณผ Hydrate

    Pre-Render ์™€ Hydrate Next.js ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ pre-renders ๋œ๋‹ค. ์ด ๋ง์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ํŽ˜์ด์ง€๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ํŽ˜์ด์ง€ ์š”์ฒญ์„ ๋ฐ›์„ ๋•Œ ์„œ๋ฒ„์—์„œ ๊ทธ ์š”์ฒญ๋ฐ›์€ ํŽ˜์ด์ง€๊ฐ€ ๋ฐ”๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ HTML ์ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋กœ๋“œ๋  ๋•Œ, ์ด ํŽ˜์ด์ง€์— ํ•„์š”ํ•œ JSํŒŒ์ผ์ด ์‹คํ–‰๋˜์–ด ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ interactive ํ•ด์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์ด ๊ณผ์ •์„ Hydrate๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰, Hydrate๋Š” Server Side ๋‹จ์—์„œ ๋ Œ๋”๋ง ๋œ ์ •์  ํŽ˜์ด์ง€์™€ ๋ฒˆ๋“ค๋ง๋œ JSํŒŒ์ผ์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ธ ๋’ค, ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ HTML ์ฝ”๋“œ์™€ React์ธ JS์ฝ”๋“œ๋ฅผ ์„œ๋กœ ๋งค์นญ ์‹œํ‚ค๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ pre-render ๋œ HTML ์ด ..

    Next.js redirects ์™€ rewrites | API KEY ์ˆจ๊ธฐ๊ธฐ

    /** @type {import('next').NextConfig} */ const API_KEY = process.env.API_KEY; const nextConfig = { reactStrictMode: true, swcMinify: true, async redirects() { // ์œ ์ €๊ฐ€ ์•Œ ์ˆ˜ ์žˆ์Œ. ๊ฒฝ๋กœ๊ฐ€ ๋ฐ”๊นฅ์— ๋“œ๋Ÿฌ๋‚จ. return [ { source: "/old-blog/:path*", destination: "/new-sexy/:path*", // ์™ธ๋ถ€๋กœ๋„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ๊ฐ€๋Šฅ, * ๋ถ™์ด๋ฉด ๋’ค์˜ ๊ฒฝ๋กœ ๋ชจ๋‘ ์œ ์ง€๋˜๋ฉด์„œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ permanent: false, // status code => false: 307(์ž„์‹œ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ), true: 308(์˜๊ตฌ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ) }, ]; }, async r..