๊ฐœ๋ฐœ ์—ฌ์ •/FrontEnd

Next.js 13 (App Router) ์˜ˆ์ƒ ๋ฉด์ ‘ ์งˆ๋ฌธ (1)

calm-lee 2025. 5. 19. 20:52

๐Ÿ“ ๋ผ์šฐํŒ… ๋ฐ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

1. Q: Next.js 13์—์„œ pages/์™€ app/ ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ฃผ์š” ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?


A: pages/๋Š” Pages Router๋กœ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…๊ณผ getStaticProps, getServerSideProps๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด app/์€ App Router๋กœ React Server Components(RSC)๋ฅผ ์ง€์›ํ•˜๊ณ , layout.tsx ๋“ฑ์˜ ํŒŒ์ผ๋กœ ๋” ์œ ์—ฐํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก ์„ค๋ช…:

  • App Router๋Š” ์ค‘์ฒฉ ๋ ˆ์ด์•„์›ƒ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ, ์ŠคํŠธ๋ฆฌ๋ฐ ๋“ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • Pages Router๋Š” ๊ธฐ์กด ๋ฐฉ์‹์ด๋ฉฐ ์ ์ฐจ App Router๋กœ ์ „ํ™˜๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‘ ๋ผ์šฐํŒ… ์‹œ์Šคํ…œ์€ ์„œ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์„ ํƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

2. Q: app/๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์˜ page.tsx, layout.tsx, loading.tsx์˜ ์—ญํ• ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?
A: page.tsx๋Š” ํŠน์ • ๊ฒฝ๋กœ์˜ ์‹ค์ œ ์ฝ˜ํ…์ธ  ํŽ˜์ด์ง€์ด๊ณ , layout.tsx๋Š” ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ๊ณตํ†ต UI๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. loading.tsx๋Š” ๋ฐ์ดํ„ฐ ํŒจ์นญ ์ค‘ ๋ณด์—ฌ์ค„ ๋กœ๋”ฉ ํ™”๋ฉด์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก ์„ค๋ช…:

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

 

3. Q: layout.tsx์™€ _app.tsx์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
A: layout.tsx๋Š” App Router์—์„œ ๊ฒฝ๋กœ ๋‹จ์œ„๋กœ ์ค‘์ฒฉ ๊ฐ€๋Šฅํ•œ ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด _app.tsx๋Š” Pages Router์—์„œ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๊ณตํ†ต์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ธ€๋กœ๋ฒŒ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค.
๐Ÿ’ก ์„ค๋ช…:

  • layout.tsx๋Š” ์ค‘์ฒฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  route ๋ถ„๊ธฐ๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • _app.tsx๋Š” ํ•˜๋‚˜๋งŒ ์กด์žฌํ•˜๋ฉฐ ๋ชจ๋“  ํŽ˜์ด์ง€์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • App Router์—์„œ๋Š” _app.tsx๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

4. Q: error.tsx๋Š” ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜์š”?
A: ํŠน์ • route๋‚˜ ํ•ด๋‹น ํ•˜์œ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ error.tsx๊ฐ€ ์ž๋™์œผ๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ ๋‹จ์œ„์—์„œ๋งŒ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก ์„ค๋ช…:

  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ/ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๋ชจ๋‘์—์„œ ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • try/catch์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ
  • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ปค์Šคํ…€ ์—๋Ÿฌ ํŽ˜์ด์ง€ ์ œ์ž‘ ๊ฐ€๋Šฅ

 

5. Q: ๋™์  ๋ผ์šฐํŒ…์€ App Router์—์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋‚˜์š”?
A: ํด๋”๋ช…์„ [slug]์™€ ๊ฐ™์ด ๋Œ€๊ด„ํ˜ธ๋กœ ๊ฐ์‹ธ์„œ ์ƒ์„ฑํ•˜๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„์ด ๋™์  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. params ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ’ก ์„ค๋ช…:

  • [id]/page.tsx ํ˜•ํƒœ๋กœ ๊ตฌํ˜„
  • params.id๋ฅผ ํ†ตํ•ด URL ํŒŒ๋ผ๋ฏธํ„ฐ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • generateStaticParams()์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ์‹œ ์ •์  ๋นŒ๋“œ ๊ฐ€๋Šฅ

 


 

๐Ÿ“ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์™€ ๋ฐ์ดํ„ฐ ํŒจ์นญ

 

6. Q: React Server Components(RSC)๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?
A: RSC๋Š” ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ์— HTML๋กœ ์ „๋‹ฌ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ JavaScript๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ’ก ์„ค๋ช…:

  • ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์ฝ๊ณ  ๋ Œ๋”๋ง ๊ฐ€๋Šฅ
  • ํด๋ผ์ด์–ธํŠธ์— ์ „์†ก๋˜๋Š” JS ํฌ๊ธฐ ๊ฐ์†Œ
  • ์„œ๋ฒ„ ์ „์šฉ API ํ‚ค๋‚˜ ๋ณด์•ˆ ์ •๋ณด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

 

7. Q: ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ fetch๋ฅผ ์“ฐ๋ฉด ์•ˆ ๋˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?
A: ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ, ์„œ๋ฒ„ ์ „์šฉ API ํ‚ค๋‚˜ ๋น„๊ณต๊ฐœ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ์นญํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก ์„ค๋ช…:

  • ํด๋ผ์ด์–ธํŠธ fetch๋Š” API ํ‚ค ๋…ธ์ถœ ์œ„ํ—˜์ด ์žˆ์Œ
  • ์„œ๋ฒ„ fetch๋Š” ๋ณด์•ˆ๊ณผ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•จ
  • ๋ฐ์ดํ„ฐ ์บ์‹ฑ, revalidation ๋“ฑ์˜ ๊ธฐ๋Šฅ๋„ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅ

 

8. Q: getStaticProps, getServerSideProps๋Š” App Router์—์„œ ์–ด๋–ป๊ฒŒ ๋Œ€์ฒด๋˜๋‚˜์š”?
A: App Router์—์„œ๋Š” ์ด ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ง์ ‘ fetch()๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์บ์‹ฑ๊ณผ revalidation์€ fetch ์˜ต์…˜์œผ๋กœ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก ์„ค๋ช…:

  • fetch()์— cache, next.revalidate ์˜ต์…˜ ์‚ฌ์šฉ
  • ๋” ์„ ์–ธ์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•œ ๋ฐฉ์‹
  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ ํŒจ์นญ์˜ ์ค‘์‹ฌ ์—ญํ•  ์ˆ˜ํ–‰

 

9. Q: fetch()์— cache: 'no-store'๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ค ํšจ๊ณผ๊ฐ€ ์žˆ๋‚˜์š”?
A: ์ด ์„ค์ •์€ ์š”์ฒญ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ๊ฐ€์ ธ์˜ค๋Š” SSR(Server Side Rendering) ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก ์„ค๋ช…:

  • ๋ฐ์ดํ„ฐ๊ฐ€ ์ž์ฃผ ๋ฐ”๋€Œ๋Š” ๋Œ€์‹œ๋ณด๋“œ ๋“ฑ์— ์ ํ•ฉ
  • cache: 'force-cache'๋Š” ๋นŒ๋“œ ์‹œ ์บ์‹œ, revalidate๋Š” ISR
  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„ ์ธก์—์„œ๋งŒ ์ž‘๋™ํ•˜๋Š” ์„ค์ •

 

10. Q: generateStaticParams()๋Š” ์–ธ์ œ ์‚ฌ์šฉ๋˜๋ฉฐ, ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋‚˜์š”?
A: ๋™์  ๋ผ์šฐํŒ… ํŽ˜์ด์ง€์—์„œ ๋นŒ๋“œ ํƒ€์ž„์— ํ•„์š”ํ•œ ๊ฒฝ๋กœ ๋ชฉ๋ก์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ SSG(static generation)๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. params ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ •์ ์ธ HTML ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก ์„ค๋ช…:

  • App Router์—์„œ getStaticPaths์˜ ๋Œ€์ฒด ๊ธฐ๋Šฅ
  • ๋™์  ๊ฒฝ๋กœ๋ฅผ ์ •์ ์œผ๋กœ ํ”„๋ฆฌ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Œ
  • ๋™์  URL๊ณผ SSG๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜