๊ฐœ๋ฐœ/Next.js

[Nextjs] Route segment 'force-dynamic' ๊ฐ€ ํ•„์š”ํ•  ๋•Œ

๋ฐ(Ming) ๐Ÿˆ‍โฌ› 2024. 3. 29. 00:10
728x90
๋ฐ˜์‘ํ˜•

 

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

 

์ •ํ™•ํžˆ๋Š” ์ •์  ๋ Œ๋”๋งํ•˜๋Š” ํŽ˜์ด์ง€์—์„œ ๊ณ„์† ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์ƒํ™ฉ

 

๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ ํ˜ธ์ถœํ•œ๊ฒŒ ์„œ๋ฒ„API๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ ๊ฒŒ ์•„๋‹ˆ๋ผ nextjs๊ฐ€ ์ง€์›ํ•˜๋Š” api route๋ฅผ ์ด์šฉํ•ด์„œ severless ํ•œ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค. ์ฐธ๊ณ ๋กœ API ๋ผ์šฐํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Next.js ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด ๋ถ€๋ถ„์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” nextjs์˜ ์„œ๋ฒ„ ๋ Œ๋”๋ง์— ๋Œ€ํ•ด์„œ ์•Œ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.


 

nextjs ์„œ๋ฒ„ ๋ Œ๋”๋ง์—๋Š” ์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ,

์ฒซ๋ฒˆ์งธ Static (์ •์ ),

๋‘๋ฒˆ์งธ dynamic(๋™์ ),

์„ธ๋ฒˆ์งธ Streaming ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ๊ฑด ์ •์ ๋ Œ๋”๋ง๊ณผ ๋™์ ๋ Œ๋”๋ง์ด๋‹ค. 

 

์ •์  ๋ Œ๋”๋ง์ด ๊ธฐ๋ณธ๊ฐ’์ธ๋ฐ, ๋ผ์šฐํŠธ๊ฐ€ ๋นŒ๋“œ ์‹œ๊ฐ„์— ๋ Œ๋”๋ง๋˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ ์žฌ๊ฒ€์ฆ ํ›„์— ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ Œ๋”๋ง๋œ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์บ์‹œ๋˜์–ด ์ฝ˜ํ…์ธ  ์ „์†ก ๋„คํŠธ์›Œํฌ(CDN)์— ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ๋ Œ๋”๋ง ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉ์ž์™€ ์„œ๋ฒ„ ์š”์ฒญ ๊ฐ„์— ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งž์ถคํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ  ๋นŒ๋“œ ์‹œ๊ฐ„์— ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋ฉฐ ์ด๋Š” ์ •์  ๋ธ”๋กœ๊ทธ ๊ธ€์ด๋‚˜ ์ œํ’ˆ ํŽ˜์ด์ง€์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์ด๋‹ค.

 

๋™์  ๋ Œ๋”๋ง์—์„œ๋Š” ๋ผ์šฐํŠธ๊ฐ€ ๊ฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ์š”์ฒญ ์‹œ๊ฐ„์— ๋ Œ๋”๋ง๋œ๋‹ค. ๋ผ์šฐํŠธ์— ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งž์ถคํ™”๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋˜๋Š” ์š”์ฒญ ์‹œ๊ฐ„์—๋งŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋ฉฐ ์ด๋Š” ์ฟ ํ‚ค๋‚˜ URL์˜ ๊ฒ€์ƒ‰ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์ด๋‹ค. ๋™์  ํ•จ์ˆ˜๋‚˜ ์บ์‹œ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ๋ฐœ๊ฒฌ๋˜๋ฉด Next.js๋Š” ๋ผ์šฐํŠธ ์ „์ฒด๋ฅผ ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋„๋ก ์ „ํ™˜ํ•œ๋‹ค.

 

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


 

 

 

 

์˜ค๋ฅ˜๊ฐ€ ๋‚œ ์‚ฌ์œ ์— ๋Œ€ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ณด๋ฉด ๋‚ด์šฉ์ด ์ดํ•ด๊ฐ€ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ฝœ์„ ๋ณด๋ฉด revalidatePath('/') ๋ฅผ ์“ฐ๋Š”๋ฐ ์ด๋ถ€๋ถ„์ด ํ•ด๋‹น /URL์— ์žˆ๋˜ ์บ์‹œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ธ๋ฐ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ๋„ ์žˆ๋‹ค. ๋‹ค์‹œ ๋กœ๋“œํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ๋™์ ์ธ ๋ Œ๋”๋ง์— ํ•ด๋‹น. ์ •์ ์ธ ๋ Œ๋”๋ง์„ ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์ธ๋ฐ ๊ธฐ๋ณธ ๊ฐ’์ด ์ •์ ์ธ ๋ Œ๋”๋ง์ด ๋˜๋‹ค๋ณด๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ๊ณ„์† ๋‚œ ๊ฒƒ์ด๋‹ค. 

๊ฒฐ๊ตญ ๋ฌธ์ œ ์ƒํ™ฉ์€ api route์—์„œ ๋™์  ๋ Œ๋”๋ง์„ ํ•ด์•ผํ•˜๋Š”๋ฐ, ํŽ˜์ด์ง€์—์„œ๋Š” ๊ธฐ๋ณธ๊ฐ’์ธ ์ •์  ๋ Œ๋”๋ง์„ ์ง€์›ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ๊ฒƒ

 

์ด ๋ถ€๋ถ„์˜ ๊ฐ„๊ทน์„ ํ’€์–ด ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Route Segment์ด๋‹ค. 

 

Route Segment ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด์ง€, ๋ ˆ์ด์•„์›ƒ ๋˜๋Š” ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ์˜ ๋™์ž‘์„ ์ง์ ‘ ๋‚ด๋ณด๋‚ด๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์–‘ํ•œ ์˜ต์…˜๋“ค์ด ์žˆ๋Š”๋ฐ ๊ทธ ์ค‘์—์„œ๋„ dynamic ์˜ต์…˜์„ ์“ฐ๋ฉด ๋ ˆ์ด์•„์›ƒ ๋˜๋Š” ํŽ˜์ด์ง€์˜ ๋™์  ๋™์ž‘์„ ์™„์ „ํžˆ ์ •์ ์ด๊ฑฐ๋‚˜ ์™„์ „ํžˆ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

'force-dynamic': ๊ฐ•์ œ ๋™์  ๋ Œ๋”๋ง์œผ๋กœ ์„ค์ •ํ•˜์—ฌ, ๊ฐ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ์‹œ๊ฐ„์— ๋ผ์šฐํŠธ๊ฐ€ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. 
์ด ์˜ต์…˜์€ ํŽ˜์ด์ง€ ๋””๋ ‰ํ† ๋ฆฌ์˜ getServerSideProps()์™€ ๋™๋“ฑํ•ฉ๋‹ˆ๋‹ค.

 

'force-dynamic' ์˜ต์…˜์€ ๋ผ์šฐํŠธ๊ฐ€ ๊ฐ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ ์‹œ๊ฐ„์— ๋™์ ์œผ๋กœ ๋ Œ๋”๋ง๋˜์–ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ ์ด๋Š” ๋ผ์šฐํŠธ๊ฐ€ ๊ฐœ์ธํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๊ฑฐ๋‚˜ ์š”์ฒญ ์‹œ๊ฐ„์—๋งŒ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ํฌํ•จํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ํŠน์ • ์ฟ ํ‚ค์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ฝ˜ํ…์ธ ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ URL์˜ ๊ฒ€์ƒ‰ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— 'force-dynamic'๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” getServerSideProps()์™€ ๋น„์Šทํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ๋ผ์šฐํŠธ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉ์ž์— ๋งž๊ฒŒ ๋ Œ๋”๋งํ•œ๋‹ค. 

์ฆ‰, ์ •์  ํŽ˜์ด์ง€ ์ƒ์„ฑ ๊ณผ์ •์—์„œ ๋ฐœ์ƒํ•œ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŽ˜์ด์ง€๋ฅผ ๋™์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ์šฐํšŒํ•œ ๊ฒƒ. ์ด๋Š” ํŽ˜์ด์ง€๊ฐ€ ์ •์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๊ณผ์ •์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ๋™์ ์ธ ์š”์†Œ๊ฐ€ ์žˆ์–ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. 

force-dynamic ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ ๋™์  ๋ Œ๋”๋ง์œผ๋กœ ์šฐํšŒํ•ด์„œ ํ•ด๊ฒฐํ•œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ๋œ๋‹ค

 

 

 

 

๐Ÿ‘‡๐Ÿป ๊ณต์‹๋ฌธ์„œ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ธฐ

 

File Conventions: Route Segment Config | Next.js

Learn about how to configure options for Next.js route segments.

nextjs.org

 

 

 

 

 

 

 

728x90