๐Ÿฅ•Next.js ์ •์  ๋ฐฐํฌ์˜ ์ถ•๋ณต์ด ๋์ด... ์—†๋„ค... ๐Ÿ’€โ˜ ๏ธ๐Ÿฅ• (์ •์  ๋ฐฐํฌ์‹œ ์˜ค๋ฅ˜ ์ •๋ฆฌ)

ํ˜…ยท2024๋…„ 10์›” 3์ผ

S3+Cloud Front๋กœ ๋ฐฐํฌํ•˜๋ฉด์„œ ๋ฐœ์ƒํ–ˆ๋˜ ์ถ”๊ฐ€ ์˜ค๋ฅ˜๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌ๋ฅผ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
์ •๋ฆฌ๋ฅผ ํ•˜๊ธฐ ์ „์— Next.js๋กœ ์ •์  ๋ฐฐํฌ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฑด ์ •๋ง ์ƒ๊ฐ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ํ•˜๊ณ  ๊ฒฐ์ •ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ •์  ๋ฐฐํฌ๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉด์„œ Next.js์˜ ์ด์ ์„ ์ œ๋Œ€๋กœ ์ด์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ๋“ค๋„ ๋„ˆ๋ฌด ๋งŽ์ง€๋งŒ, ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋งŽ์€ ์˜ค๋ฅ˜๋“ค์„ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ •์  ๋ฐฐํฌ์—์„œ๋Š” ์ด์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ๊ณ , ๊ทธ ๊ธฐ๋Šฅ๋“ค์„ ๊ตฌํ˜„ํ•ด๋†“์€ ์ฝ”๋“œ์—์„œ ๋‹ค ์ˆ˜์ •ํ•ด์•ผ ํ•˜๊ณ ... ๋ฌผ๋ก  ๊ฐ€์žฅ ์ด์ƒ์ ์ธ ๋ฐฐํฌ ๋ฐฉ๋ฒ•์€ Vercel๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด๊ธด ํ•œ๋ฐ... ๐Ÿ˜ญ Vercel์˜ ๊ฒฝ์šฐ ์ œํ•œ๋˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์•˜๋‹ค. ์œ ๋ฃŒ ํ”Œ๋žœ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ธดํ•˜์ง€๋งŒ... 1๋…„ ์ด์ƒ ์œ ์ง€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒ€์›๋“ค์—๊ฒŒ ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ์–ด ์„ ๋œป ๊ฒฐ์ •ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. AWS Amplify๋กœ ๋ฐฐํฌํ•˜๋ฉด SSR์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ ๋Š” ํ•˜๋Š”๋ฐ ๋น„์ถ”ํ•˜๋Š” ๊ฒŒ์‹œ๊ธ€์„ ์ •๋ง ๋งŽ์ด๋ดค๋‹ค. ์†๋„๊ฐ€ ์ง„์งœ ๋А๋ฆฌ๋‹ค๊ณ  ํ•œ๋‹ค. ์‚ฌ์šฉ์„ฑ์„ ์ƒ๊ฐํ•˜๋ฉด ์†๋„์ ์ธ ๋ถ€๋ถ„์€ ์ •๋ง ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„์‰ฝ์ง€๋งŒ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” S3๋กœ ์ •์  ๋ฐฐํฌ๋ฅผ ํ•ด์•ผํ•˜์ง€ ์•Š์„๊นŒ...

dynamic route 404

๋™์  ๋ผ์šฐํŒ…์œผ๋กœ๋œ ํŽ˜์ด์ง€๋ฅผ ๋ฐฐํฌํ–ˆ์„ ๋•Œ 404 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๊ฑด ๋ Œ๋”๋ง ๋ฐฉ์‹์— ๋Œ€ํ•œ ์ œ๋Œ€๋กœ ๋œ ๊ณต๋ถ€ ์—†์ด Next.js๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋ผ์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜์ด๋‹ค.

/posts/[id].jsx์™€ ๊ฐ™์€ ๋™์  ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์ •์  ๋ฐฐํฌ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด [id]์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์ด ๋ฌด์—‡์ด ๋ ์ง€ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ •์  HTML๋กœ ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋  ์ˆ˜ ์—†๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค.

  1. ๋™์  ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  URL query๋กœ ํ•ด๊ฒฐ
  2. generateStaticParams์„ ์‚ฌ์šฉ ๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ํฌ์ŠคํŠธ ID๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ •์ ์œผ๋กœ ์ƒ์„ฑํ•  ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•ด ํ•ด๋‹น ID์— ๋Œ€ํ•œ ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ์ƒ์„ฑ
export async function generateStaticParams() {
  const postIds = await getAllPostIds(); // ๋ชจ๋“  ํฌ์ŠคํŠธ ID๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

  return postIds.map((id) => ({
    id, // { id: '1' }, { id: '2' } ํ˜•ํƒœ๋กœ ๋ฆฌํ„ด
  }));
}

2๋ฒˆ์œผ๋กœ ํ•ด๊ฒฐํ•  ๊ฒฝ์šฐ, ๋™์  ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธด ํ•˜์ง€๋งŒ, ๋ชจ๋“  postId๋ฅผ ๋ฐ›๋Š” API๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋‹ค. ๋™์  ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ณณ์ด ํ•œ ๊ณณ ์ด์—ˆ๋‹ค๋ฉด, ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์—์„œ ๋™์  ๋ผ์šฐํŒ…์œผ๋กœ ๊ตฌํ˜„ํ•ด๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์— API๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ถ€๋‹ด๋„ ์žˆ๊ณ ... ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ์ •์ ์œผ๋กœ ์ƒ์„ฑํ•˜๋ฉด ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ์˜ ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ์ปค์งˆ ๊ฒƒ ๊ฐ™์•„ ์ข‹์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒŒ ํ”„๋ก ํŠธ์˜ ์˜๊ฒฌ์ด์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ 1๋ฒˆ์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ๋กœ ํ•˜๊ณ  ๋™์  ๋ผ์šฐํŒ…์„ ๋ชจ๋‘ query๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค. ๋™์ ์ธ ๊ฐ’์ด ์ œํ•œ์ ์ด๊ณ  ํ”„๋ก ํŠธ๊ฐ€ ๋ชจ๋“  ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋™์  ๋ผ์šฐํŒ…์œผ๋กœ ๋‘๊ณ  2๋ฒˆ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•ด์ฃผ์—ˆ๋‹ค.

build ์‹œ static files์„ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ์—๋Ÿฌ

buildํ•œ ํŒŒ์ผ๋“ค๋กœ ๋ฐฐํฌ๋ฅผ ํ•ด์ฃผ์—ˆ์„ ๋•Œ ๋นˆ ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜๊ณ  font/css/js์ด ๋ชจ๋‘ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๋‹ˆ ์•„๋ž˜์™€ ๊ฐ™์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋‹ค.

๋‹ค๋ฅธ ๋ ˆํผ๋Ÿฐ์Šค์—์„œ๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๊ฒฐํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ์‹œ๋„ํ•ด๋ดค์œผ๋‚˜ ์—ฌ์ „ํžˆ ์ผ๋ถ€ ํŽ˜์ด์ง€์—์„œ๋Š” ์ •์  ํŒŒ์ผ์„ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. ํ•ด๋‹น ๋ฌธ์ œ๊ฐ€ ์ ˆ๋Œ€๊ฒฝ๋กœ/์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ์ธํ•œ ๋ฌธ์ œ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์›์ธ์„ ๊ธˆ๋ฐฉ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•ด๋ณด๋ฉด /community๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ณ , /community/detail์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— "."์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ œ๋Œ€๋กœ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด๋‹ค. ๋นŒ๋“œ ํ›„์— ๋ชจ๋“  ํŽ˜์ด์ง€์˜ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๋Š” ๊ฑด ๋„ˆ๋ฌด... ๋ง์ด ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด ํ•ด๋‹น ๊ฒฝ๋กœ๋ฅผ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์‹œ๋„ํ•ด๋ดค์ง€๋งŒ, ์ œ๋Œ€๋กœ ๋™์ž‘๋˜์ง€ ์•Š์•˜๋‹ค.

๋†€๋ž๊ฒŒ๋„ ๊ณต์‹ ๋ฌธ์„œ์— ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋Š”๋ฐ, assetPrefix ๊ณต์‹ ๋ฌธ์„œ์— ๋“ค์–ด๊ฐ€๋ฉด ๋ฐ”๋กœ ํ•ด๊ฒฐ์ฑ…์ด ๋‚˜์˜จ๋‹ค. (์‚ฝ์งˆํ–ˆ๋‹ค๋Š” ๋œป)

๋‹ค์Œ๊ณผ ๊ฐ™์ด next.config.js์— ์œ„ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋ชจ๋“  ํŽ˜์ด์ง€์—์„œ ๋ฌธ์ œ์—†์ด ์ •์  ํŒŒ์ผ์„ ์ž˜ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

Image ์—‘๋ฐ•

๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๊ฐ€ ๋˜๊ธด ํ–ˆ์œผ๋‚˜... ์—ฌ์ „ํžˆ ํฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ๋ชจ๋“  Image๊ฐ€ ์—‘๋ฐ•์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋„ ์—ด์‹ฌํžˆ ์ฐพ์•„๋ณด๊ธด ํ–ˆ์œผ๋‚˜ ํฐ ์†Œ๋“์€ ๋ชป ์–ป์—ˆ๋‹ค.
NextJS images are not shown using "export" script
์œ„ ๋‚ด์šฉ๊ณผ ๋™์ผํ•œ ์ƒํ™ฉ์ด์—ˆ์œผ๋‚˜... ๋‹ต๋ณ€์ด ์‹œ์›์ฐฎ์•˜๋‹ค. ๋‹ค๋ฅธ ๊ฒŒ์‹œ๊ธ€์„ ์ฐพ์•„๋ณด๋ ค๊ณ  ํ–ˆ์œผ๋‚˜... ์šฐ๋ฆฌ ์ƒํ™ฉ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค. ๐Ÿ˜ญ

ํ•ด๋‹น ๋‚ด์šฉ์€ ํ•ด๊ฒฐ์ด ๋˜๊ธด ํ–ˆ์œผ๋‚˜... ์™œ ํ•ด๊ฒฐ๋๋Š”์ง€๋Š” ๋ชจ๋ฅด๋Š” ์ƒํ™ฉ์ด๋‹ค. ์ผ๋‹จ ํ•ด๊ฒฐํ•œ ๋ฐฉ๋ฒ•๋“ค ์ค‘ ๊ฐ€๋Šฅ์„ฑ ์žˆ๋Š” ๊ฑธ๋กœ๋งŒ ์ •๋ฆฌ๋ฅผ ํ•˜๋ฉด...

  1. Image ๊ฒฝ๋กœ ์ˆ˜์ •
    next.js์—์„œ๋Š” asset ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ์ž๋™์œผ๋กœ public ํด๋”๋กœ๋ถ€ํ„ฐ ๊ฒฝ๋กœ๋ฅผ ์žก๊ธฐ ๋•Œ๋ฌธ์— public ํด๋”๋ถ€ํ„ฐ์˜ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ src๋กœ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค๋ผ๋Š” ๋‚ด์šฉ์ด ์žˆ์—ˆ๋‹ค.

src ์— ๊ฒฝ๋กœ ์„ค์ •ํ•  ๋•Œ๋Š” public ์„ / ๋กœ ํ‘œํ˜„

<Image src="/images/ldh.jpg" width={570} height={381}/>

import๋กœ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ๋Š” public ์„ ๋„ฃ์–ด์ฃผ์–ด์•ผํ•จ

import ldh from "/public/images/ldh.jpg"
* ์ƒ๋žต *
<Image src={ldh} width={570} height={381}/>

์ด ๋ฐฉ๋ฒ•์ด ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์€ ์ด์œ ๋Š” ํ•ด๋‹น ๋ฐฉ์‹์ด ๋งž์„๊นŒ?๋ผ๋Š” ํ™•์‹ ์ด ์—†๋Š”๋ฐ ๋ชจ๋“  ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•ด์ค„ ์ˆ˜๋Š” ์—†์„ ๊ฒƒ ๊ฐ™์•„์„œ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋งŒ ๊ฒฝ๋กœ๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ๊ณ  ๋ฐฐํฌ๋ฅผ ํ–ˆ๋Š”๋ฐ ๋ชจ๋“  ์ด๋ฏธ์ง€๊ฐ€ ์ œ๋Œ€๋กœ ํ‘œ์‹œ๊ฐ€ ๋˜์—ˆ๋‹ค. ํ•ด๋‹น ๋ถ€๋ถ„๋งŒ ์ˆ˜์ •๋œ ๋‹ค์Œ ์ด๋ฏธ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ธด ํ–ˆ์œผ๋‚˜ ๋ชจ๋“  ์ด๋ฏธ์ง€๊ฐ€ ์ œ๋Œ€๋กœ ํ‘œ์‹œ๋˜์—ˆ๋‹ค๋Š” ์ ์—์„œ ์ด์ „์— ๋ฐฐํฌํ•œ ๋‚ด์šฉ์ด ๋Šฆ๊ฒŒ ์ ์šฉ๋œ ๊ฒŒ ์•„๋‹๊นŒ...

  1. next.config.js์— Image domains ์ถ”๊ฐ€
images: {
    domains: ['https://cdn.mydomain.com'],
    unoptimized: true,
},

๋‹ค๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐ๋˜๋Š” ๊ฒŒ ๋‚ด๋ถ€์—์„œ ์ œ๊ณต๋˜๋Š” ์ด๋ฏธ์ง€(์ฆ‰, public ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋‚˜, Next.js API๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜๋Š” ์ด๋ฏธ์ง€)๋Š” ์ •์ƒ์ ์œผ๋กœ ๋กœ๋“œ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์—ฐํžˆ ์•„๋‹ˆ๊ฒ ์ง€... ์‹ถ์€๋ฐ ์ด๊ฑฐ ๋ง๊ณ ๋Š” ๋ฐ”๋€ ๊ฒŒ ์—†์–ด์„œ ๋„์ €ํžˆ ๋ชจ๋ฅด๊ฒ ๋‹ค.


์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„ ์ •๋‹ต์„ ์•Œ๊ฒŒ๋˜๋ฉด ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

URL ์ž…๋ ฅ์œผ๋กœ ํŽ˜์ด์ง€ ์ด๋™ ๋ถˆ๊ฐ€ (.html ํ™•์žฅ์ž)

๋ฐฐํฌ๋ฅผ ์–ด์งธ์ €์งธ ์„ฑ๊ณตํ–ˆ์œผ๋‚˜ ์ด์ƒํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋˜ ๋ฐœ์ƒํ–ˆ๋‹ค. navbar๋กœ๋Š” ํŽ˜์ด์ง€๊ฐ€ ์ž˜ ์ด๋™ํ•˜๋Š”๋ฐ URL๋กœ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ ค๋ฉด 404 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด์— ๋Œ€ํ•ด์„œ๋„ ๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณด๋‹ˆ ์›์ธ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. /community ๋ผ๋Š” ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•ด /community.html์œผ๋กœ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์‚ฌ์šฉ์„ฑ์—์„œ ์ •๋ง ๋ถˆํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์€ ๋ฌด์กฐ๊ฑด ํ•ด๊ฒฐ์„ ํ–ˆ์–ด์•ผ ํ–ˆ๋Š”๋ฐ ์ฐพ์•„๋ณด๋ฉด ๋˜๊ฒŒ ์–ด๋ ต๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. ์ •๋ง... ํ˜„ํƒ€๊ฐ€ ์™”์ง€๋งŒ, ๋‹คํ–‰ํžˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋„ next.config.js์— ์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

module.exports = {
  trailingSlash: true,
}

trailingSlash์€ URL ๊ฒฝ๋กœ์˜ ๋์— ์Šฌ๋ž˜์‹œ(/)๋ฅผ ๊ฐ•์ œ๋กœ ์ถ”๊ฐ€ํ•˜๋„๋ก ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ์ฆ‰ ํ•ด๋‹น ์†์„ฑ์„ true๋กœ ๋ณ€๊ฒฝํ•ด ์‚ฌ์šฉ์ž๊ฐ€ /index๋ผ๊ณ  ์ž…๋ ฅํ•˜๋ฉด, ์ด๋ฅผ /index/๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , /index/๋Š” /index.html ํŽ˜์ด์ง€๋กœ ์—ฐ๊ฒฐ๋˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๋Š” /index๋กœ๋„ index.html์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์•ž์œผ๋กœ๋„ ๋ฐฐํฌ ์–ต๊นŒ๊ฐ€ ์ง„์งœ ๋งŽ์ง€ ์•Š์„๊นŒ... ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋” ์–ต๊นŒ๋ฅผ ๋‹นํ•˜๊ณ  ๋ชจ๋“  ์˜ค๋ฅ˜๋“ค์„ ์ˆ˜์ •ํ•  ๋ฐ”์— ๊ทธ๋ƒฅ ๋น ๋ฅด๊ฒŒ ์ •์  ๋ฐฐํฌ๋ฅผ ํฌ๊ธฐํ• ๊นŒ... ์‹ถ๊ธฐ๋„ ํ–ˆ์ง€๋งŒ ๋„ˆ๋ฌด ๋Œ์ด๊ธธ ์ˆ˜ ์—†์„ ์ •๋„๋กœ ๋งŽ์ด ๋ฐ”๊ฟ”๋†”์„œ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ๋„ ๊ทธ๋ฆฌ ์ข‹์€ ์„ ํƒ์€ ์•„๋‹ ๊ฒƒ ๊ฐ™๋‹ค...ใ…Žใ…Žใ…Žใ…Žใ…Žใ…Žใ…Žใ…Žใ…Žใ…Žใ…Žใ…Žใ…Žใ…Ž ๋‹ค์Œ์— Next.js ํ”„๋กœ์ ํŠธ๋ฅผ ํ•œ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด Vercel์— ๋ฐฐํฌํ•  ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

[์—๋Ÿฌ ํ•ด๊ฒฐ] Next.js : ๋™์  ๋ผ์šฐํŒ…๋œ ํŽ˜์ด์ง€ ๋ฐฐํฌ์‹œ 404 ์—๋Ÿฌ
Generated static files html files have wrong assets paths
assetPrefix
Next.js Image ์ปดํฌ๋„ŒํŠธ ๊ฒฝ๋กœ ์„ค์ •ํ•˜๊ธฐ ์‚ฌ์šฉ๋ฐฉ๋ฒ•(์ด๋ฏธ์ง€๊ฐ€ ์•ˆ๋‚˜์˜จ๋‹ค๋ฉด..?)
์ •์ ๋นŒ๋“œ์‹œ ๋ผ์šฐํŒ… ์งˆ๋ฌธ

profile
Frontend๐Ÿ“

0๊ฐœ์˜ ๋Œ“๊ธ€