S3+Cloud Front๋ก ๋ฐฐํฌํ๋ฉด์ ๋ฐ์ํ๋ ์ถ๊ฐ ์ค๋ฅ๋ค์ ๋ํด ์ ๋ฆฌ๋ฅผ ํ๋ ค๊ณ ํ๋ค.
์ ๋ฆฌ๋ฅผ ํ๊ธฐ ์ ์ Next.js๋ก ์ ์ ๋ฐฐํฌ๋ฅผ ๊ฒฐ์ ํ๋ ๊ฑด ์ ๋ง ์๊ฐ์ ์ฌ๋ฌ ๋ฒ ํ๊ณ ๊ฒฐ์ ํด์ผ ํ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐ์ด ๋ค์๋ค. ์ ์ ๋ฐฐํฌ๋ฅผ ๊ฒฐ์ ํ๋ฉด์ Next.js์ ์ด์ ์ ์ ๋๋ก ์ด์ฉํ์ง ๋ชปํ๋ ๊ฒ๋ค๋ ๋๋ฌด ๋ง์ง๋ง, ๋ถํ์ํ๊ฒ ๋ง์ ์ค๋ฅ๋ค์ ์์ ํด์ผ ํ๋ค. ์ ์ ๋ฐฐํฌ์์๋ ์ด์ฉํ ์ ์๋ ๊ธฐ๋ฅ๋ค์ด ๋ง๊ณ , ๊ทธ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํด๋์ ์ฝ๋์์ ๋ค ์์ ํด์ผ ํ๊ณ ... ๋ฌผ๋ก ๊ฐ์ฅ ์ด์์ ์ธ ๋ฐฐํฌ ๋ฐฉ๋ฒ์ Vercel๋ก ๋ฐฐํฌํ๋ ๊ฒ์ด๊ธด ํ๋ฐ... ๐ญ Vercel์ ๊ฒฝ์ฐ ์ ํ๋๋ ๋ถ๋ถ์ด ๋ง์๋ค. ์ ๋ฃ ํ๋์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๊ธดํ์ง๋ง... 1๋
์ด์ ์ ์งํด์ผ ํ๊ธฐ ๋๋ฌธ์ ํ์๋ค์๊ฒ ๋ถ๋ด์ด ๋ ์ ์์ด ์ ๋ป ๊ฒฐ์ ํ์ง ๋ชปํ๋ค. AWS Amplify๋ก ๋ฐฐํฌํ๋ฉด SSR์ด ๊ฐ๋ฅํ๋ค๊ณ ๋ ํ๋๋ฐ ๋น์ถํ๋ ๊ฒ์๊ธ์ ์ ๋ง ๋ง์ด๋ดค๋ค. ์๋๊ฐ ์ง์ง ๋๋ฆฌ๋ค๊ณ ํ๋ค. ์ฌ์ฉ์ฑ์ ์๊ฐํ๋ฉด ์๋์ ์ธ ๋ถ๋ถ์ ์ ๋ง ์ค์ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ์์ฝ์ง๋ง ์ด๋ฒ ํ๋ก์ ํธ์์๋ S3๋ก ์ ์ ๋ฐฐํฌ๋ฅผ ํด์ผํ์ง ์์๊น...
๋์ ๋ผ์ฐํ ์ผ๋ก๋ ํ์ด์ง๋ฅผ ๋ฐฐํฌํ์ ๋ 404 ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ด๊ฑด ๋ ๋๋ง ๋ฐฉ์์ ๋ํ ์ ๋๋ก ๋ ๊ณต๋ถ ์์ด Next.js๋ฅผ ์ ํํ๊ฒ ๋ผ์ ๋ฐ์ํ ์ค๋ฅ์ด๋ค.
/posts/[id].jsx์ ๊ฐ์ ๋์ ํ์ด์ง๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์ ๋, ์ ์ ๋ฐฐํฌ๋ฅผ ํ๊ฒ ๋๋ฉด [id]์ ํด๋นํ๋ ๊ฐ์ด ๋ฌด์์ด ๋ ์ง ๋ฏธ๋ฆฌ ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ HTML๋ก ๋ฏธ๋ฆฌ ์์ฑ๋ ์ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ 2๊ฐ์ง๊ฐ ์๋ ๊ฒ ๊ฐ์๋ค.
URL query๋ก ํด๊ฒฐ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ํ ํ์ผ๋ค๋ก ๋ฐฐํฌ๋ฅผ ํด์ฃผ์์ ๋ ๋น ํ๋ฉด์ด ํ์๋๊ณ font/css/js์ด ๋ชจ๋ ์ค๋ฅ๊ฐ ๋๊ฒ ๋์๋ค. ์ด์ ๋ํด ๊ตฌ๊ธ๋ง์ ํด๋ณด๋ ์๋์ ๊ฐ์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์๋ค.

๋ค๋ฅธ ๋ ํผ๋ฐ์ค์์๋ ๋ค์๊ณผ ๊ฐ์ด ํด๊ฒฐํ๋ค๊ณ ํด์ ์๋ํด๋ดค์ผ๋ ์ฌ์ ํ ์ผ๋ถ ํ์ด์ง์์๋ ์ ์ ํ์ผ์ ์ฐพ์ง ๋ชปํ๊ณ ์์๋ค. ํด๋น ๋ฌธ์ ๊ฐ ์ ๋๊ฒฝ๋ก/์๋๊ฒฝ๋ก๋ก ์ธํ ๋ฌธ์ ์๊ธฐ ๋๋ฌธ์ ์์ธ์ ๊ธ๋ฐฉ ์ฐพ์ ์ ์์๋๋ฐ, ์ฝ๊ฒ ์๊ฐํด๋ณด๋ฉด /community๊ฐ ์กด์ฌํ ์ ์๊ณ , /community/detail์ด ์กด์ฌํ ์ ์๊ธฐ ๋๋ฌธ์ "."์ผ๋ก ๊ฒฝ๋ก๋ฅผ ์ ๋๋ก ์ค์ ํด์ค ์ ์๋ ๊ฒ์ด๋ค. ๋น๋ ํ์ ๋ชจ๋ ํ์ด์ง์ ๊ฒฝ๋ก๋ฅผ ์์ ํด์ฃผ๋ ๊ฑด ๋๋ฌด... ๋ง์ด ์ ๋๋ค๊ณ ์๊ฐํด ํด๋น ๊ฒฝ๋ก๋ฅผ ๋ณํํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ํด๋ดค์ง๋ง, ์ ๋๋ก ๋์๋์ง ์์๋ค.
๋๋๊ฒ๋ ๊ณต์ ๋ฌธ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์๋๋ฐ, assetPrefix ๊ณต์ ๋ฌธ์์ ๋ค์ด๊ฐ๋ฉด ๋ฐ๋ก ํด๊ฒฐ์ฑ
์ด ๋์จ๋ค. (์ฝ์งํ๋ค๋ ๋ป)

๋ค์๊ณผ ๊ฐ์ด next.config.js์ ์ ๋ด์ฉ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋ชจ๋ ํ์ด์ง์์ ๋ฌธ์ ์์ด ์ ์ ํ์ผ์ ์ ์ฐพ์ ์ ์๊ฒ ๋๋ค.
๋ชจ๋ ํ์ด์ง๊ฐ ํ์๊ฐ ๋๊ธด ํ์ผ๋... ์ฌ์ ํ ํฐ ๋ฌธ์ ๊ฐ ์์๋๋ฐ ๋ชจ๋ Image๊ฐ ์๋ฐ์ผ๋ก ํ์๋๋ ๊ฒ์ด๋ค. ์ด์ ๋ํด์๋ ์ด์ฌํ ์ฐพ์๋ณด๊ธด ํ์ผ๋ ํฐ ์๋์ ๋ชป ์ป์๋ค.
NextJS images are not shown using "export" script
์ ๋ด์ฉ๊ณผ ๋์ผํ ์ํฉ์ด์์ผ๋... ๋ต๋ณ์ด ์์์ฐฎ์๋ค. ๋ค๋ฅธ ๊ฒ์๊ธ์ ์ฐพ์๋ณด๋ ค๊ณ ํ์ผ๋... ์ฐ๋ฆฌ ์ํฉ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ์ฐพ์ง ๋ชปํ๋ค. ๐ญ
ํด๋น ๋ด์ฉ์ ํด๊ฒฐ์ด ๋๊ธด ํ์ผ๋... ์ ํด๊ฒฐ๋๋์ง๋ ๋ชจ๋ฅด๋ ์ํฉ์ด๋ค. ์ผ๋จ ํด๊ฒฐํ ๋ฐฉ๋ฒ๋ค ์ค ๊ฐ๋ฅ์ฑ ์๋ ๊ฑธ๋ก๋ง ์ ๋ฆฌ๋ฅผ ํ๋ฉด...
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}/>
์ด ๋ฐฉ๋ฒ์ด ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ ์ด์ ๋ ํด๋น ๋ฐฉ์์ด ๋ง์๊น?๋ผ๋ ํ์ ์ด ์๋๋ฐ ๋ชจ๋ ์ด๋ฏธ์ง๋ฅผ ๋ณ๊ฒฝํด์ค ์๋ ์์ ๊ฒ ๊ฐ์์ ํ๋์ ์ด๋ฏธ์ง๋ง ๊ฒฝ๋ก๋ฅผ ์์ ๊ฐ์ด ์์ ํด์ฃผ๊ณ ๋ฐฐํฌ๋ฅผ ํ๋๋ฐ ๋ชจ๋ ์ด๋ฏธ์ง๊ฐ ์ ๋๋ก ํ์๊ฐ ๋์๋ค. ํด๋น ๋ถ๋ถ๋ง ์์ ๋ ๋ค์ ์ด๋ฏธ์ง๊ฐ ํ์๋๊ธด ํ์ผ๋ ๋ชจ๋ ์ด๋ฏธ์ง๊ฐ ์ ๋๋ก ํ์๋์๋ค๋ ์ ์์ ์ด์ ์ ๋ฐฐํฌํ ๋ด์ฉ์ด ๋ฆ๊ฒ ์ ์ฉ๋ ๊ฒ ์๋๊น...
images: {
domains: ['https://cdn.mydomain.com'],
unoptimized: true,
},
๋ค๋ง ์ด ๋ฐฉ๋ฒ์ ์๋๋ผ๊ณ ์๊ฐ๋๋ ๊ฒ ๋ด๋ถ์์ ์ ๊ณต๋๋ ์ด๋ฏธ์ง(์ฆ, public ๋๋ ํ ๋ฆฌ์ ์๋ ์ด๋ฏธ์ง๋, Next.js API๋ฅผ ํตํด ์ ๊ณต๋๋ ์ด๋ฏธ์ง)๋ ์ ์์ ์ผ๋ก ๋ก๋๋๋ค๊ณ ํ๋ค. ๊ทธ๋์ ๋น์ฐํ ์๋๊ฒ ์ง... ์ถ์๋ฐ ์ด๊ฑฐ ๋ง๊ณ ๋ ๋ฐ๋ ๊ฒ ์์ด์ ๋์ ํ ๋ชจ๋ฅด๊ฒ ๋ค.

์ด์ ๋ํด์๋ ์ถํ ์ ๋ต์ ์๊ฒ๋๋ฉด ์ถ๊ฐํ๋๋ก ํ๊ฒ ๋ค.
๋ฐฐํฌ๋ฅผ ์ด์งธ์ ์งธ ์ฑ๊ณตํ์ผ๋ ์ด์ํ ์ค๋ฅ๊ฐ ๋ ๋ฐ์ํ๋ค. 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 ์ปดํฌ๋ํธ ๊ฒฝ๋ก ์ค์ ํ๊ธฐ ์ฌ์ฉ๋ฐฉ๋ฒ(์ด๋ฏธ์ง๊ฐ ์๋์จ๋ค๋ฉด..?)
์ ์ ๋น๋์ ๋ผ์ฐํ
์ง๋ฌธ