๊ฐœ์š”

Next.js 13 ๋ฒ„์ „ app router ๋ฆด๋ฆฌ์ฆˆ ์ดํ›„ ์ดํ›„ ์ด์ „ page router๋ฅผ ์ผ์„๋•Œ๋ณด๋‹ค ํŽธ์˜์‚ฌํ•ญ๋“ค์ด ๋งŽ์•„์กŒ๋‹ค.
๋” ์ด์ƒ React Router๋ฅผ ์“ฐ์ง€ ์•Š์•„๋„ ๋˜๊ณ , ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ ˆ์ด์•„์›ƒ, ๋กœ๋”ฉ, ์—๋Ÿฌ ํŽ˜์ด์ง€, 404 ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
์ด์™ธ์—๋„ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋“ฑ์žฅ ์ดํ›„ app ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋™์ž‘๋œ๋‹ค.
๋ฌผ๋ก  ์–ด๋””๊นŒ์ง€๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์ด๊ธฐ์— ์ž์œ ๋„๋Š” ์กฐ๊ธˆ ์ œํ•œ๋˜์ง€๋งŒ ํ•œ๋ฒˆ ์จ๋ณด๋ฉด ๊ต‰์žฅํžˆ ๋งค๋ ฅ์ ์œผ๋กœ ๋‹ค๊ฐ€์˜ฌ ๊ฒƒ์ด๋‹ค.

๋ณ€๊ฒฝ์‚ฌํ•ญ

๋ผ์šฐํŒ…

app ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

๊ธฐ์กด page ๋ฐฉ์‹ ๋ผ์šฐํŒ…์€ page ์ค‘์‹ฌ์ด์—ˆ๋‹ค. ํ•˜์ง€๋งŒ app ๋ผ์šฐํŒ…์€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์ด๋‹ค.

  • Next.js 12 ์ดํ•˜: /pages/a/b.tsx Ehsms /pages/a/b/index.tsx๋Š” ๋ชจ๋‘ ๋™์ผํ•œ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค. ํŒŒ์ผ๋ช…์ด index๋ผ๋ฉด ์ด ๋‚ด์šฉ์€ ๋ฌด์‹œ๋œ๋‹ค.
  • Next.js 13 app: /app/a/b๋Š” /a/b๋กœ ๋ณ€ํ™˜๋˜๋ฉฐ, ํŒŒ์ผ๋ช…์€ ๋ฌด์‹œ๋œ๋‹ค. ํด๋”๋ช…๊นŒ์ง€๋งŒ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

์œ„ ์˜ˆ์ œ์ธ /sign/sign-in ์ฃผ์†Œ์— ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด sign-in ํŽ˜์ด์ง€๊ฐ€ ๋‚˜์˜ฌ๊ฒƒ์ด๋‹ค.

๋ ˆ์ด์•„์›ƒ

Next.js 12 ๋ฒ„์ „๊นŒ์ง€๋Š” ํŽ˜์ด์ง€ ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ _app์ด ์œ ์ผํ–ˆ๋‹ค.

๊ทผ๋ฐ ์ด ๋ฐฉ์‹์€ _app์—์„œ๋ฐ–์— ํ•  ์ˆ˜ ์—†์–ด ์ œํ•œ์ ์ด๊ณ , ๊ฐ ํŽ˜์ด์ง€๋ณ„๋กœ ์„œ๋กœ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ์œ ์ง€ํ•˜๊ธฐ ํž˜๋“ค๋‹ค.

Next.js 13๋ถ€ํ„ฐ๋Š” ํด๋” ๋‚ด์— layout.js(js, jsx, ts, tsx) ํŒŒ์ผ์ด ํฌํ•จ๋œ๋‹ค๋ฉด ๊ทธ ํ•˜์œ„ ํด๋” ๋ฐ ์ฃผ์†Œ์— ๋ชจ๋‘ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค.

์ฆ‰, sign ํด๋”์— layout.js๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ํ•˜์œ„ ํด๋” ๋ชจ๋‘์—๊ฒŒ ๋ ˆ์ด์•„์›ƒ์ด ์ผ๊ด„ ์ ์šฉ๋œ๋‹ค.

๋งŒ์•ฝ ํŽ˜์ด์ง€ ํ•˜์œ„์—์„œ ๋ ˆ์ด์•„์›ƒ์ด ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด ๋™์ผ ๋Ž์Šค์— layout.js๋ฅผ ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค. ๊ทธ๋Ÿผ ๋‹ค์‹œ ํ•˜์œ„ ํด๋” ๋ชจ๋‘์—๊ฒŒ ์ผ๊ด„ ์ ์šฉ๋œ๋‹ค.

layout.tsx

๋ฃจํŠธ์˜ ๊ฒฝ์šฐ ๋‹จ ํ•˜๋‚˜์˜ ๋ ˆ์ด์•„์›ƒ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ ˆ์ด์•„์›ƒ์€ ๋ชจ๋“  ํŽ˜์ด์ง€์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ์ด๋‹ค.

๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ ๊ฐ™์€ ๊ฒฝ์šฐ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌ์„ฑ์ด ๋œ๋‹ค.

๋ฃจํŠธ ๋ ˆ์ด์•„์›ƒ์ธ layout.tsx

๋กœ๋”ฉ

loading.tsx

๋กœ๋”ฉ์˜ ๊ฒฝ์šฐ๋„ ๋ฆฌ์•กํŠธ Suspense๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋กœ๋”ฉ์ค‘์ผ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

404

404 ํŽ˜์ด์ง€ ์ฒ˜๋ฆฌ ๋˜ํ•œ ๊ต‰์žฅํžˆ ํŽธํ•ด์กŒ๋‹ค.

app ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์— not-found.js๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด ๋ผ์šฐํŒ… ์ฃผ์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ 404 ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋ง ํ•ด์ค€๋‹ค.

not-found.tsx

์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ

๋ฆฌ์•กํŠธ์—์„œ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋“ฑ์žฅํ•œ ์ดํ›„ Next.js 13 ๋ฒ„์ „์—์„œ๋„ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋„์ž…๋๋‹ค.
์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์„œ๋ฒ„์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ์„œ๋ฒ„๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋‘๊ณ , ์„œ๋ฒ„๊ฐ€ ํ•  ์ˆ˜ ์—†๋Š” ๋‚˜๋จธ์ง€ ์ž‘์—…์€ ํด๋ผ์ด์–ธํŠธ์ธ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค.
์ฆ‰, ์ผ๋ถ€ ์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ, ์ผ๋ถ€ ์ปดํฌ๋„ŒํŠธ๋Š” ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง ๋œ๋‹ค.
์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ง•์œผ๋กœ๋Š”

  • ์š”์ฒญ์ด ์˜ค๋ฉด ๊ทธ ์ˆœ๊ฐ„ ์„œ๋ฒ„์—์„œ ๋”ฑ ํ•œ ๋ฒˆ ์‹คํ–‰๋จ์œผ๋กœ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ๋ฆฌ์•กํŠธ์—์„œ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” useState, useReducer ๋“ฑ์˜ ํ›…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ํ•œ๋ฒˆ ๋ Œ๋”๋ง ๋˜๋ฉด ๋์ด๊ธฐ์— ๋ Œ๋”๋ง ์ƒ๋ช…์ฃผ๊ธฐ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ useEffect, useLayoutEffect๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ๋งŒ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— DOM API๋ฅผ ์“ฐ๊ฑฐ๋‚˜ window, document ๋“ฑ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋‹ค๋ฅธ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜ div, span, p๊ฐ™์€ ์š”์†Œ๋ฅผ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์—†๋‹ค.

๋ฆฌ์•กํŠธ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค ๊ณต์šฉ ์ปดํฌ๋„ŒํŠธ๋กœ ํŒ๋‹จํ•˜์—ฌ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ๋ถ„๋ฅ˜ํ•œ๋‹ค.
ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋ผ๋Š” ๊ฒƒ์„ ๋ช…์‹œํ•˜๋ ค๋ฉด 'use client' ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ๊ฐ€๋Šฅํ•˜๋‹ค.

'use client'

์ƒˆ๋กœ์šด fetch ๋„์ž…๊ณผ getServerSideProps, getStaticProps, getInitialProps์˜ ์‚ญ์ œ

๊ณผ๊ฑฐ Next.js ์—์„œ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง๊ณผ ์ •์  ํŽ˜์ด์ง€ ์ œ๊ณต์„ ์œ„ํ•ด ์ด์šฉ๋˜๋˜ getServerSideProps, getStaticProps, getInitialProps๊ฐ€ ์‚ญ์ œ๋๋‹ค. ๋Œ€์‹  ๋ฐ์ดํ„ฐ ์š”์ฒญ์€ fetch๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ค„์ง„๋‹ค.

 

์ด ๊ธ€์€ ๋ชจ๋˜ ๋ฆฌ์•กํŠธ Deep Dive ์ฑ… ์ผ๋ถ€๋ฅผ ์ ์šฉํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

๋„์„œ๊ตฌ๋งค๋งํฌ

๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค!