Skip to content

Instantly share code, notes, and snippets.

@kxwxn
Last active January 18, 2024 08:12
Show Gist options
  • Save kxwxn/44b6f01bfe9269e31b4cf34af9506b70 to your computer and use it in GitHub Desktop.
Save kxwxn/44b6f01bfe9269e31b4cf34af9506b70 to your computer and use it in GitHub Desktop.
πŸ’‘Next.js에 λŒ€ν•΄μ„œπŸ’‘

Next.js tipsπŸ’‘

  • layout.tsx & template.tsx :

    νŽ˜μ΄μ§€κ°„ 이동이 μΌμ–΄λ‚ λ•Œ λ¦¬λ Œλ”λ§μ΄ μΌμ–΄λ‚˜μ§€ μ•Šκ²Œ ν•˜λ €λ©΄ layout.tsxλ₯Ό μ‚¬μš© μ•„λ‹ˆλ©΄ template.tsx(마운트) μ‚¬μš©ν•©λ‹ˆλ‹€. νŽ˜μ΄μ§€ μ΄λ™μ‹œ 기둝(둜그)등을 남기렀면 template.tsxλ₯Ό μ‚¬μš©ν•˜λ©΄ μœ μš©ν•©λ‹ˆλ‹€.
  • Fetching :

Next.jsλ₯Ό μ‚¬μš©ν• λ•ŒλŠ” 데이터 패칭과 κ΄€λ ¨λœ λ™μž‘μ€ κ°€λŠ₯ν•œ ν•œ μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ—μ„œ μž‘μ„±ν•˜λŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€.

  • Caching :

캐싱을 더 잘 μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” 데이터λ₯Ό 어디에 μ €μž₯ν•  수 μžˆλŠ”μ§€μ— λŒ€ν•΄ μš°μ„  μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. λ°μ΄ν„°λŠ” 크게 λ©”λͺ¨λ¦¬, 파일 μ‹œμŠ€ν…œ 그리고 λ„€νŠΈμ›Œν¬ μ΄λ ‡κ²Œ 3개의 μž₯μ†Œμ—μ„œ κ°€μ Έ 올 수 μžˆμŠ΅λ‹ˆλ‹€. κ°€μ Έμ˜€λŠ” μ†λ„λŠ” λ©”λͺ¨λ¦¬, 파일 μ‹œμŠ€ν…œ 그리고 λ„€νŠΈμ›Œν¬ 순으둜 λΉ λ¦…λ‹ˆλ‹€. Next.jsλŠ” λ‚΄μž₯ 데이터 μΊμ‹œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. fetching을 톡해 데이터λ₯Ό κ°€μ Έμ˜€λ©΄ κ°€μ Έμ˜¨ κ²°κ³Όλ₯Ό 파일 μ‹œμŠ€ν…œ 기반의 μΊμ‹œμ— μ €μž₯ν•©λ‹ˆλ‹€. 결과적으둜 λ™μΌν•œ URL의 μž¬μš”μ²­μ„ λ³΄λ‚΄λŠ” 경우 λ‹€μ‹œ 데이터λ₯Ό μš”μ²­ν•˜λŠ” λŒ€μ‹ μ— μΊμ‹œμ—μ„œ λΉ λ₯΄κ²Œ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. λ¬Όλ‘  데이터 캐싱 λ™μž‘μ— λŒ€ν•œ ν†΅μ œκΆŒμ€ κ°œλ°œμžμ—κ²Œ 있기 λ•Œλ¬Έμ— 자주 λ³€κ²½λ˜λŠ” λ°μ΄ν„°μ˜ 경우 캐싱을 λΉ„ν™œμ„±ν™” 함 으둜써 μ΅œμ‹ μ˜ 데이터λ₯Ό λ Œλ”λ§ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ œμ½”λ“œ

fetch('uri',{
cache: "no-store"
}) // 데이터가 자주 λ³€κ²½λ˜λŠ” 경우 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
fetch('uri',{
next: {revalidate: 10},
}) // 캐싱을 νŠΉμ • μ‹œκ°„ λ™μ•ˆλ§Œ μœ μ§€ν•˜κ³ , κ·Έ μ΄ν›„μ—λŠ” λ‹€μ‹œ μš”μ²­μ„ 보내 μ΅œμ‹  버전을 μΊμ‹±ν•˜κ³  싢은 κ²½μš°μ— μ‚¬μš©ν•©λ‹ˆλ‹€.
캐싱 ν™œμ„±ν™” μ—¬λΆ€λŠ” fetch ν•¨μˆ˜μ—μ„œλ§Œ μ‚¬μš© ν•  수 μžˆμŠ΅λ‹ˆλ‹€.(axios λ“± 3rd-party λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” μ‚¬μš©μ΄ λΆˆκ°€ν•©λ‹ˆλ‹€.)
  • Static Rendering and Dynamic Rendering :

Static : 정적 λ Œλ”λ§μ€ λ³€ν•˜μ§€ μ•ŠλŠ” 데이터가 μžˆλŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό ν”„λ‘œλ•μ…˜ λΉŒλ“œ μ‹œμ μ— λ Œλ”λ§ν•˜κ³  이후 ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈκ°€ ν•„μš”ν•œ 경우 이λ₯Ό μž¬λ Œλ”λ§ν•˜λŠ” λŒ€μ‹ μ— 캐싱해 μ €μž₯ν•΄λ‘” 데이터λ₯Ό μ΄μš©ν•΄ ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ₯Ό κ°€μ Έμ˜¬ 수 μžˆλŠ” λ Œλ”λ§ μž…λ‹ˆλ‹€.
  • Dynamic : μ›Ή νŽ˜μ΄κ°€ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ μš”μ²­ μ‹œμ— λ™μ μœΌλ‘œ μƒμ„±λ˜λ©°, Javascriptλ₯Ό μ‚¬μš©ν•˜μ—¬ νŽ˜μ΄μ§€ μƒνƒœ 및 λ‚΄μš©μ„ λ™μ μœΌλ‘œ μ‘°μž‘ν•˜λŠ” 방식을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

  • Next.jsλŠ” ν”„λ‘œλ•μ…˜ λͺ¨λ“œκ°€ μ•„λ‹Œ 개발 λͺ¨λ“œμ—μ„œλŠ” λ³„λ„μ˜ 정적 λ Œλ”λ§ 없이 맀번 μƒˆλ‘œμš΄ μš”μ²­μ„ λ³΄λ‚΄λŠ” 동적 λ Œλ”λ§ λ°©μ‹μœΌλ‘œ λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν”„λ‘œλ•μ…˜ λͺ¨λ“œλ‘œ λΉŒλ“œν•˜λ©΄ 데이터듀을 정적 λ°μ΄ν„°λ‘œ μ·¨κΈ‰ν•˜κΈ° λ•Œλ¬Έμ— 졜초 λ Œλ”λ§ν•œ 데이터λ₯Ό 캐싱에 μ €μž₯해두고 ν•„μš”ν•  λ•Œλ§ˆλ‹€ μ €μž₯ν•΄λ‘” κ±Έ μž¬μ‚¬μš©ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ—μ„œ 캐싱을 λΉ„ν™œμ„±ν™”ν•˜λ©΄ Next.jsλŠ” 이 νŽ˜μ΄μ§€μ˜ λ‚΄μš©μ΄ λ³€κ²½λ˜λŠ” 것 으둜 κ°„μ£Όν•΄ 동적 λ Œλ”λ§ λ°©μ‹μœΌλ‘œ ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ₯Ό μ²˜λ¦¬ν•©λ‹ˆλ‹€. 그러면 Lambda μ•„μ΄μ½˜μ΄ 보이며 이 것은 정적 λ Œλ”λ§μ΄ μ•„λ‹Œ 동적 λ Œλ”λ§ λ°©μ‹μœΌλ‘œ λ™μž‘ν•¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€.
  • Production BuildλŠ” κ°œλ°œμžκ°€ μž‘μ„±ν•œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œμ™€ λ¦¬μ†ŒμŠ€λ₯Ό μ΅œμ ν™”λœ ν˜•λŒ€λ‘œ λ²ˆλ“€λ§ν•˜κ³ , λΆˆν•„μš”ν•œ 정보λ₯Ό μ œκ±°ν•˜μ—¬ μ›Ή μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€μ œ μ‚¬μš©μ„ μœ„ν•œ μ΅œμ’… μ œν’ˆμœΌλ‘œ λ§Œλ“œλŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€. ν”„λ‘œλ•μ…˜ λΉŒλ“œλ₯Ό 톡해 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 μ΅œμ ν™” ν•˜κ³ , μ‚¬μš©μžμ—κ²Œ λΉ λ₯΄κ³  μ•ˆμ •μ μΈ μ›Ή κ²½ν—˜μ„ μ œκ³΅ν•  수 있게 λ©λ‹ˆλ‹€.
  • Prallel Routes : ν•œ 화면에 두 개의 νŽ˜μ΄μ§€λ₯Ό λ³΄μ—¬μ€„λ•Œ μ‚¬μš©ν•œλ‹€.

@parallel μ΄λŸ°μ‹μœΌλ‘œ 폴더λͺ…을 μ •μ˜ν•΄μ£Όκ³  Layout νŽ˜μ΄μ§€μ—μ„œ {parallel} μ΄λ ‡κ²Œ prop 으둜 λ Œλ”λ§λ˜κ²Œ ν•˜λ©΄ λ©λ‹ˆλ‹€. μ‚¬μš©μ‹œ μ€‘μš”ν•œ 점은, layout.tsx와 @parallel은 같은 κ²½λ‘œμ— μžˆμ–΄μ•Ό μ‚¬μš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. layout.ts μ—μ„œ props둜 {children}{parallel} μ΄λŸ°μ‹μœΌλ‘œ.
  • Intercepting Routes : 라우트λ₯Ό κ°€λ‘œμ±„λ©΄ λΈŒλΌμš°μ € url을 λž©ν•‘ν•˜λ©΄μ„œ ν˜„μž¬ λ ˆμ΄μ•„μ›ƒ λ‚΄μ—μ„œ μƒˆ 경둜λ₯Ό λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ ν˜„μž¬ νŽ˜μ΄μ§€μ˜ μ»¨ν…μŠ€νŠΈλ₯Ό μœ μ§€ν•˜κ³  μ‹Άμ„λ•Œ μ‚¬μš©ν•˜λ©΄ μœ μš©ν•©λ‹ˆλ‹€.

μƒλŒ€κ²½λ‘œ ../ , ./ 이것과 λΉ„μŠ·ν•˜κ²Œ (..) , (.) μ΄λŸ°μ‹μœΌλ‘œ 경둜λ₯Ό νƒμƒ‰ν•˜κ³  그뒀에 ν•΄λ‹Ή κ²½λ‘œμ— μžˆλŠ” 라우트의 이름을 μ μŠ΅λ‹ˆλ‹€. (..)about = 이것은 λΆ€λͺ¨ λ””λ ‰ν† λ¦¬μ˜ about νŽ˜μ΄μ§€λ₯Ό λͺ…μ‹œν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. (.)posting = 이것은 ν˜„μž¬ ν΄λ”μ˜ posting νŽ˜μ΄μ§€λ₯Ό λͺ…μ‹œν•©λ‹ˆλ‹€. 그리고 μ€‘μš”ν•œ 뢀뢄은, μΈν„°μ…‰νŠΈλ₯Ό λ‹Ήν•œ μ›λž˜ url에 ν•΄λ‹Ήν•˜λŠ” κ²½λ‘œλŠ” ν•„μš”κ°€ 없을 것 κ°™μ§€λ§Œ, μƒˆλ‘œκ³ μΉ¨μ΄λ‚˜, url창에 직접 μž‘μ„±ν•˜μ—¬ μ ‘μ†ν•˜λŠ” 경우 싀행이 되게 λ©λ‹ˆλ‹€. 그렇지 μ•Šκ³  νƒœκ·Έλ₯Ό ν†΅ν•΄μ„œ 올 κ²½μš°μ—λŠ” μΈν„°μ…‰νŠΈλ₯Ό λ‹Ήν•΄μ„œ λ Œλ”λ§ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • Route Groups : μ‹€μ œ uri에 영ν–₯을 μ£Όμ§€μ•ŠλŠ” 경둜.

(group) μ΄λŸ°μ‹μœΌλ‘œ κ·Έλ£Ήλͺ…을 μ§€μ–΄μ„œ 디렉토리λ₯Ό μƒμ„±ν•˜λŠ”λ°, μ‹€μ œ uriμ—λŠ” 영ν–₯을 주지 μ•ŠμŠ΅λ‹ˆλ‹€.

  • Private folder : 폴더 μ •λ¦¬μš©μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€. 쀑볡을 제거 ν•  λ•Œ μ’‹μŠ΅λ‹ˆλ‹€.

_private μ΄λŸ°μ‹μœΌλ‘œ ν΄λ”μ˜ 이름을 μ •μ˜ν•˜κ³  λ‚˜λ©΄

  • useRouter : ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ λ¦¬λ‹€μ΄λ ‰νŠΈν•˜λŠ” ν›….

μ˜ˆμ œμ½”λ“œ

const router = useRouter();
router.replace(href:"/home"); // replaceλŠ” λ‹¨μˆœνžˆ uri만 κ΅μ²΄ν•˜κ³  νžˆμŠ€ν† λ¦¬ κ°μ²΄μ—λŠ” μΆ”κ°€λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ—, λ’€λ‘œκ°€κΈ° μ‹œμ— λ¬Έμ œμ—†μ΄ '/'으둜 이동이 κ°€λŠ₯ν•˜λ‹€(ν˜Ήμ€ 그전에 λ¨Έλ¬Όλ €λ˜ νŽ˜μ΄μ§€)
return null

const router = useRouter();
router.push(href:"/home"); // pushλ₯Ό μ‚¬μš©ν•  κ²½μš°μ—λŠ” νžˆμŠ€ν† λ¦¬ 객체에 μΆ”κ°€ν•˜μ—¬μ„œ, λ’€λ‘œκ°€κΈ°λ₯Ό μ‚¬μš©ν•  λ•Œ λ¬Έμ œκ°€ λœλ‹€. λ’€λ‘œκ°€κΈ°λ₯Ό ν•˜λ©΄ λ¦¬λ‹€μ΄λ ‰νŠΈλ₯Ό ν–ˆλ˜ νŽ˜μ΄μ§€λ‘œ λŒμ•„κ°€κΈ° λ•Œλ¬Έμ—, λ‹€μ‹œ /hom으둜 μ™€μ§€λŠ” κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•œλ‹€. 
return null
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment