λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
IT-Engineering/JavaScript

Next.jsμ—μ„œ 자꾸 use clientλ₯Ό 써도 λ˜λŠ”κ°€(feat. SSR, CSR)

by 🧞‍♂️ 2024. 1. 14.
λ°˜μ‘ν˜•

 

Next.jsμ—μ„œ Three.jsλ‚˜ vtkjs와 같은 κ·Έλž˜ν”½ λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ„ ν™œμš©ν•˜λ‹€ 보면, μ–΄μ©” 수 없이 κ³„μ†ν•΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈ λ˜λŠ” νƒ€μž…μŠ€ν¬λ¦½νŠΈ 파일 μ΅œμƒλ‹¨μ— use clientλ₯Ό μž…λ ₯ν•˜κ²Œ λ˜λŠ” κ²½μš°κ°€ μ™•μ™• λ°œμƒν•œλ‹€.

Next.jsλŠ” μ•„λ¬΄λž˜λ„ μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§(Server-Side Rendering, SSR)이 μž₯점인 ν”„λ ˆμž„μ›Œν¬μ΄λ‹€ λ³΄λ‹ˆ, use clientλ₯Ό μ“°λ©΄ κ·Έ μž₯점을 ν‡΄μƒ‰μ‹œν‚€λŠ” 것 같은 죄책감이 λ“ λ‹€.

κ²°λ‘ λΆ€ν„° λ§ν•˜μžλ©΄ 죄책감을 λŠλ‚„ ν•„μš”λŠ” μ—†λ‹€. "use client"의 μ‚¬μš©μ€ μ„±λŠ₯ μΈ‘λ©΄μ—μ„œ λŠλ €μ§€λŠ” μš”μΈμ΄ μ•„λ‹ˆλΌ, 였히렀 μ„±λŠ₯을 μ΅œμ ν™”ν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ λ„μž…λœ κΈ°λŠ₯이닀. 이λ₯Ό 톡해 κ°œλ°œμžλŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 더 μ„Έλ°€ν•˜κ²Œ μ‘°μ •ν•˜κ³ , μ‚¬μš©μž κ²½ν—˜μ„ κ°œμ„ ν•  수 μžˆλ‹€.

Next.jsμ—μ„œ "use client"λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 Next.js 13 μ΄μƒμ˜ λ²„μ „μ—μ„œ λ„μž…λœ μƒˆλ‘œμš΄ κΈ°λŠ₯으둜, μ„œλ²„ μ»΄ν¬λ„ŒνŠΈμ™€ ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΅¬λΆ„ν•˜κΈ° μœ„ν•œ λͺ…μ‹œμ μΈ 방법이닀. 이 ꡬ뢄은 Next.js의 μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ μ•„ν‚€ν…μ²˜μ˜ μΌλΆ€λ‘œ, λ Œλ”λ§ μ„±λŠ₯을 μ΅œμ ν™”ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œμ™€ μ„œλ²„ μ‚¬μ΄λ“œμ˜ μ½”λ“œ μ‹€ν–‰ μœ„μΉ˜λ₯Ό 더 λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄ λ„μž…λ˜μ—ˆλ‹€.

"use client"의 λ„μž… λ°°κ²½

Next.jsλŠ” 기본적으둜 μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§(SSR)을 μ§€μ›ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬λ‹€. SSR은 초기 νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œ μ„œλ²„μ—μ„œ HTML을 μƒμ„±ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ „μ†‘ν•¨μœΌλ‘œμ¨, 초기 λ‘œλ”© μ„±λŠ₯을 κ°œμ„ ν•˜κ³  검색 엔진 μ΅œμ ν™”(SEO)λ₯Ό ν–₯μƒμ‹œν‚¬ 수 μžˆλŠ” 방법이닀. κ·ΈλŸ¬λ‚˜ λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈκ°€ μ„œλ²„μ—μ„œ λ Œλ”λ§λ  ν•„μš”λŠ” μ—†μœΌλ©°, μΌλΆ€λŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œμ—μ„œλ§Œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•  수 μžˆλ‹€.

"use client" μ‚¬μš©

  • ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈ: "use client"λ₯Ό 파일 상단에 μΆ”κ°€ν•¨μœΌλ‘œμ¨, ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈκ°€ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œμ—μ„œλ§Œ λ Œλ”λ§λ˜μ–΄μ•Ό 함을 λͺ…μ‹œμ μœΌλ‘œ ν‘œμ‹œν•œλ‹€. μ΄λŠ” λΈŒλΌμš°μ €μ—μ„œλ§Œ μ‚¬μš©λ˜λŠ” APIλ‚˜ μƒν˜Έ μž‘μš©μ΄ λ§Žμ€ κΈ°λŠ₯(예: μž…λ ₯ 양식 처리, ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ λΌμš°νŒ…)에 μœ μš©ν•˜λ‹€.
  • μ„œλ²„ μ»΄ν¬λ„ŒνŠΈ: "use client"λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” μ»΄ν¬λ„ŒνŠΈλŠ” μ„œλ²„ μ»΄ν¬λ„ŒνŠΈλ‘œ κ°„μ£Όλ˜λ©°, 이듀은 μ„œλ²„μ—μ„œ λ Œλ”λ§λ˜μ–΄ 초기 νŽ˜μ΄μ§€ λ‘œλ“œ μ‹œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μ „μ†‘λœλ‹€.

μ„±λŠ₯적인 μΈ‘λ©΄

  • μ„±λŠ₯ ν–₯상: "use client"λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ¨ κ°œλ°œμžλŠ” μ»΄ν¬λ„ŒνŠΈκ°€ μ‹€ν–‰λ˜μ–΄μ•Ό ν•  μ μ ˆν•œ μœ„μΉ˜(μ„œλ²„ λ˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ)λ₯Ό λͺ…ν™•νžˆ 지정할 수 μžˆλ‹€. μ΄λŠ” λΆˆν•„μš”ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ 싀행을 쀄이고, ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œμ˜ λΆ€ν•˜λ₯Ό μ΅œμ†Œν™”ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ „λ°˜μ μΈ μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆλ‹€.
  • λ‘œλ”© μ‹œκ°„ 단좕: μ„œλ²„ μ»΄ν¬λ„ŒνŠΈλŠ” μ‚¬μš©μžμ—κ²Œ λΉ λ₯΄κ²Œ μ½˜ν…μΈ λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ μ„œλ²„μ—μ„œ 사전 λ Œλ”λ§λ˜λ©°, ν΄λΌμ΄μ–ΈνŠΈ μ»΄ν¬λ„ŒνŠΈλŠ” ν•„μš”ν•œ κ²½μš°μ—λ§Œ λ‘œλ“œλ˜μ–΄ μ‹€ν–‰λœλ‹€. μ΄λŠ” 특히 초기 νŽ˜μ΄μ§€ λ‘œλ”© μ‹œκ°„μ„ λ‹¨μΆ•μ‹œν‚€λŠ” 데 도움이 λœλ‹€.

 

μΆ”κ°€μ μœΌλ‘œ, 이와 κ΄€λ ¨ν•œ SSRκ³Ό CSR에 λŒ€ν•œ μž₯단점을 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² λ‹€.


Next.jsμ—μ„œ 'use client' λ˜λŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ λ Œλ”λ§(Client-Side Rendering, CSR)을 μ‚¬μš©ν•˜λŠ” 것과 Next.js의 μ£Όμš” μž₯점 쀑 ν•˜λ‚˜μΈ μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§(Server-Side Rendering, SSR)을 ν™œμš©ν•˜λŠ” 것 μ‚¬μ΄μ—λŠ” μ€‘μš”ν•œ 차이가 μžˆλ‹€. 이해λ₯Ό 돕기 μœ„ν•΄ 두 가지 μ ‘κ·Ό λ°©μ‹μ˜ 차이점과 각각의 μž₯단점을 μ„€λͺ…ν•˜κ² λ‹€.

1. μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§ (SSR)의 μž₯점:

  • SEO μ΅œμ ν™”: μ„œλ²„μ—μ„œ λ Œλ”λ§λœ νŽ˜μ΄μ§€λŠ” 검색 엔진에 μ˜ν•΄ 더 잘 인덱싱될 수 μžˆλ‹€. μ™œλƒν•˜λ©΄ νŽ˜μ΄μ§€μ˜ 컨텐츠가 HTML ν˜•νƒœλ‘œ 이미 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.
  • λΉ λ₯Έ 첫 νŽ˜μ΄μ§€ λ‘œλ“œ: μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ§ˆ 초기 컨텐츠가 μ„œλ²„μ—μ„œ 이미 μƒμ„±λ˜μ–΄ μ „μ†‘λ˜λ―€λ‘œ, ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 좔가적인 μžλ°”μŠ€ν¬λ¦½νŠΈ 처리 없이 λ°”λ‘œ ν‘œμ‹œλ  수 μžˆλ‹€.
  • μ‚¬μš©μž κ²½ν—˜ κ°œμ„ : 초기 λ‘œλ“œ μ‹œκ°„μ΄ λ‹¨μΆ•λ˜μ–΄ μ‚¬μš©μž κ²½ν—˜(UX)이 κ°œμ„ λœλ‹€.

2. ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ λ Œλ”λ§ (CSR)의 μž₯점:

  • λΈŒλΌμš°μ € μ΅œμ ν™”: 일뢀 λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ κΈ°λŠ₯듀은 λΈŒλΌμš°μ €μ˜ νŠΉμ • κΈ°λŠ₯에 μ˜μ‘΄ν•˜κΈ° λ•Œλ¬Έμ— ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œμ—μ„œλ§Œ μ œλŒ€λ‘œ μž‘λ™ν•œλ‹€.
  • 동적 μƒν˜Έμž‘μš©: ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ λ Œλ”λ§μ€ μ‚¬μš©μž μƒν˜Έμž‘μš©μ— 따라 λ™μ μœΌλ‘œ μ½˜ν…μΈ λ₯Ό λ³€κ²½ν•˜λŠ” κ²½μš°μ— μœ λ¦¬ν•˜λ‹€.
  • 뢀뢄적인 νŽ˜μ΄μ§€ μ—…λ°μ΄νŠΈ: 전체 νŽ˜μ΄μ§€λ₯Ό μƒˆλ‘œ κ³ μΉ¨ν•˜μ§€ μ•Šκ³ λ„ μΌλΆ€λΆ„λ§Œ μ—…λ°μ΄νŠΈ ν•  수 μžˆλ‹€.

'use client' μ‚¬μš© μ‹œμ˜ 차이점:

  • 'use client'λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ‚˜ κΈ°λŠ₯은 ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œμ—μ„œλ§Œ μ‹€ν–‰λœλ‹€. 즉, μ„œλ²„ μ‚¬μ΄λ“œμ—μ„œλŠ” 이 μ»΄ν¬λ„ŒνŠΈλ‚˜ κΈ°λŠ₯에 λŒ€ν•œ λ Œλ”λ§μ΄ 이루어지지 μ•ŠμœΌλ©°, λͺ¨λ“  μ²˜λ¦¬κ°€ λΈŒλΌμš°μ €μ—μ„œ μ§„ν–‰λœλ‹€.
  • μ΄λŠ” Next.js의 SSR κΈ°λŠ₯을 일뢀 ν¬κΈ°ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 즉, ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•œ SEO μ΄μ μ΄λ‚˜ μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§μ˜ 초기 λ‘œλ“œ μ‹œκ°„ 단좕 효과λ₯Ό ν™œμš©ν•  수 μ—†κ²Œ λœλ‹€.
  • κ·ΈλŸ¬λ‚˜, μ΄λŠ” λΈŒλΌμš°μ € μ „μš© κΈ°λŠ₯을 μ‚¬μš©ν•΄μ•Ό ν•˜κ±°λ‚˜, ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œμ—μ„œλ§Œ κ°€λŠ₯ν•œ 동적 μƒν˜Έμž‘μš©μ΄ ν•„μš”ν•œ κ²½μš°μ—λŠ” ν•„μˆ˜μ μΌ 수 μžˆλ‹€.

결둠적으둜, Next.jsμ—μ„œλŠ” κ°€λŠ₯ν•œ 경우 μ„œλ²„ μ‚¬μ΄λ“œ λ Œλ”λ§μ„ ν™œμš©ν•˜λŠ” 것이 μ’‹μ§€λ§Œ, νŠΉμ • μƒν™©μ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ λ Œλ”λ§μ΄ 더 적합할 수 μžˆλ‹€. 개발 μ‹œμ—λŠ” 각 μ»΄ν¬λ„ŒνŠΈμ™€ κΈ°λŠ₯의 μš”κ΅¬ 사항과 λͺ©μ μ— 따라 μ μ ˆν•œ λ Œλ”λ§ 방식을 μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

λ°˜μ‘ν˜•

λŒ“κΈ€