재밌게 ν•©μ‹œλ‹€

κΈ°λ‘ν•˜κΈ°, κ°€μ‹œν™”ν•˜κΈ°

Vanilla JS/고양이

λ¦¬νŒ©ν† λ§ | μ»΄ν¬λ„ŒνŠΈ ν˜•νƒœλ‘œ μΆ”μƒν™”ν•˜κΈ°

μ€λ˜λ”” 2022. 9. 20. 15:48
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ λΈ”λ‘œκ·Έμ— μžˆλŠ” ν•΄μ„€ 글을 μ°Έκ³ ν•΄ λ¦¬νŒ©ν† λ§ν•œ λ‚΄μš©

μƒνƒœμ— 따라 λ°”λ€Œμ–΄μ•Ό ν•˜λŠ” μ˜μ—­μ΄ 크게 두 가지닀. Nodes와 Breadcrumb!

λ¦¬νŒ©ν† λ§ μ „

App μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ renderNodesSection 와 renderBreadcrumbSection ν•¨μˆ˜λ₯Ό μž‘μ„±ν–ˆλ‹€. 각 ν•¨μˆ˜ λ‚΄μ—μ„œ, μƒνƒœλ₯Ό 기반으둜 λ§ˆν¬μ—…μ„ λ Œλ”λ§ν•œλ‹€. μƒνƒœκ°€ λ³€κ²½λ˜λ©΄ ν•΄λ‹Ή ν•¨μˆ˜λ“€μ„ ν˜ΈμΆœν•΄ μ—…λ°μ΄νŠΈλœ μƒνƒœλ‘œ 화면을 λ Œλ”λ§ν•œλ‹€.

κ΅¬ν˜„ 쑰건 및 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ λΈ”λ‘œκ·Έμ—μ„œ μ œμ‹œν•œ λ°”λžŒμ§ν•œ λ°©ν–₯은 λ‹€μŒκ³Ό κ°™μ•˜λ‹€.

  • μ»΄ν¬λ„ŒνŠΈ ν˜•νƒœλ‘œ 좔상화
  • DOM 접근을 μ΅œμ†Œν™”
  • λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°λ³΄λ‹€λŠ” 선언적 ν”„λ‘œκ·Έλž˜λ°

μ»΄ν¬λ„ŒνŠΈ ν˜•νƒœλ‘œ μΆ”μƒν™”ν•˜κΈ°

'μ»΄ν¬λ„ŒνŠΈ ν˜•νƒœλ‘œ 좔상화 ν•˜λΌ'λŠ” 게 μ–΄λ–€ μ˜λ―ΈμΈμ§€ 잘 와닿지 μ•Šμ•˜λ‹€. 검색해 λ³Έ κ²°κ³Ό μΆ”μƒν™”λž€ λ³΅μž‘ν•œ 자료, λͺ¨λ“ˆ, μ‹œμŠ€ν…œ λ“±μœΌλ‘œλΆ€ν„° 핡심적인 κ°œλ… λ˜λŠ” κΈ°λŠ₯을 κ°„μΆ”λ € λ‚΄λŠ” 것을 μ˜λ―Έν•œλ‹€. μ»΄ν¬λ„ŒνŠΈλž€ μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•œ 각각의 λ…λ¦½λœ λͺ¨λ“ˆμ„ μ˜λ―Έν•œλ‹€.

 

κ·Έλ ‡λ‹€λ©΄ μ»΄ν¬λ„ŒνŠΈ ν˜•νƒœμ˜ μΆ”μƒν™”λž€ μ „체 Appμ—μ„œ νŠΉμ • κΈ°λŠ₯을 μž¬μ‚¬μš©μ΄ κ°€λŠ₯ν•œ λ…λ¦½λœ λͺ¨λ“ˆλ‘œ κ°„μΆ”λ €λ‚΄λŠ” 것이겠닀.

 

λ‚΄κ°€ μ΄ν•΄ν•œ λͺ¨λ“ˆμ€ λ‹€μŒκ³Ό 같은 λŠλ‚Œμ΄λ‹€.

λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜λŠ” μž…μž₯μ—μ„œλŠ” λͺ¨λ“ˆμ˜ λ‚΄λΆ€ μž‘λ™ 원리λ₯Ό μ•Œ ν•„μš”κ°€ μ—†λ‹€. κ·Έμ € μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€μ™€, ν•΄λ‹Ή λͺ¨λ“ˆμ΄ μ–΄λ–€ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ”μ§€(λͺ¨λ“ˆμ΄ λ§Œλ“€μ–΄ λ‚΄λŠ” κ²°κ³Όλ¬Ό)만 μ•Œλ©΄ λœλ‹€. → 이λ₯Ό λ§Œμ‘±ν•˜κ²Œλ” νŠΉμ • κΈ°λŠ₯을 뢄리해 λ‚΄λŠ” 게 λͺ¨λ“ˆν™” μ•„λ‹κΉŒ?

 

λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ° v.s. 선언적 ν”„λ‘œκ·Έλž˜λ°

이 κ°œλ… λ˜ν•œ 잘 이해가 λ˜μ§€ μ•Šμ•„ μ°Ύμ•„λ΄€λ‹€.

"λ‚˜λŠ” μ§€κΈˆ e마트 λ°”λ‘œ μ˜†μ— μžˆμŠ΅λ‹ˆλ‹€. 그럼 μ—¬κΈ°μ„œλΆ€ν„° μ§‘κΉŒμ§€ μ–΄λ–»κ²Œ κ°€μ•Ό ν• κΉŒμš”?"

λͺ…λ Ήν˜• 방식 (HOW) : μ£Όμ°¨μž₯ 뢁μͺ½ 좜ꡬλ₯Ό λ‚˜μ™€ μ™Όμͺ½μœΌλ‘œ κ°€μ„Έμš”. 12λ²ˆκ°€ μΆœκ΅¬μ— 도착할 λ•ŒκΉŒμ§€ 15번 뢁μͺ½ λ„λ‘œλ₯Ό νƒ€μ„Έμš”. 이케아λ₯Ό 끼고 μš°νšŒμ „ν•˜μ„Έμš”. μ§μ§„ν•˜μ—¬ 첫 번째 μ‹ ν˜Έλ“±μ—μ„œ μš°νšŒμ „ ν•˜μ„Έμš”. λ‹€μŒ μ‹ ν˜Έλ“±μ„ μ§€λ‚˜ μ’ŒνšŒμ „μ„ ν•˜μ„Έμš”. 우리 집은 298μž…λ‹ˆλ‹€.

μ„ μ–Έν˜• 방식 (WHAT): λ‚΄ μ£Όμ†ŒλŠ” 98 West Immutable Alley, Eden, Utah 84310μž…λ‹ˆλ‹€.

선언적 방식: 무엇을 μˆ˜ν–‰ν•˜λŠ”μ§€μ—λ§Œ 관심이 μžˆλ‹€. κ·Έ 무엇이 μ •ν™•νžˆ μ–΄λ–»κ²Œ μ΄λ€„μ§€λŠ” μ§€μ—λŠ” 관심이 μ—†λ‹€. 마치 λΈ”λž™λ°•μŠ€μ²˜λŸΌ, λ‚œ input을 μ€„ν…Œλ‹ˆ λ„ˆλŠ” λ‚΄κ°€ μ›ν•˜λŠ” output을 λ‚΄λ†“κΈ°λ§Œ ν•˜λ©΄ 돼.

 

λ”°λΌμ„œ μ»΄ν¬λ„ŒνŠΈ λ‹¨μœ„λ‘œ λΆ„λ¦¬ν•˜λŠ” νŒ¨ν„΄μ€ 선언적 방식이라고 ν•  수 μžˆλ‹€. κ°€λ Ή ν•œ UI μ»΄ν¬λ„ŒνŠΈκ°€ μžˆλ‹€λ©΄, μš°λ¦¬λŠ” κ·Έ μ»΄ν¬λ„ŒνŠΈμ— stateλ₯Ό λ„˜κ²¨μ£Όκ³  (κ·Έ μ•ˆμ— 과정이 μ–΄λ–»κ²Œ λ˜λ“ ) ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈκ°€ κ·Έ stateλ₯Ό 가지고 μš°λ¦¬κ°€ μ›ν•˜λŠ” UIλ₯Ό λ Œλ”λ§ν•˜κΈ°λ₯Ό κΈ°λŒ€ν•  것이닀.

 

κ·Έ 외에도 선언적 방식은 λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ κ°–λŠ”λ‹€.

  • 선언적 방식은 μ½”λ“œκ°€ λ‹¬μ„±ν•˜κ³ μž ν•˜λŠ” 게 λ¬΄μ—‡μΈμ§€λ§Œμ„ λ‚˜μ—΄ν•˜κΈ° λ•Œλ¬Έμ—, μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ΄ λ†’λ‹€.
    (μƒμ„Έν•œ κ΅¬ν˜„ 방식이 달라지지 μ•ŠμœΌλ―€λ‘œ)
  • 선언적 방식은 μƒνƒœλ₯Ό 직접 μˆ˜μ •ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • 가독성이 μ’‹λ‹€ = μ½”λ“œ ν•œ 쀄 ν•œ 쀄을 읽지 μ•Šμ•„λ„ ν•΄λ‹Ή μ½”λ“œκ°€ μ–΄λ–€ κΈ°λŠ₯을 ν•˜λŠ” μ½”λ“œμΈμ§€ νŒŒμ•…ν•  수 μžˆλ‹€.

map ν•¨μˆ˜κ°€ λŒ€ν‘œμ μΈ 선언적 방식에 ν•΄λ‹Ήν•œλ‹€κ³  λ³Ό 수 μžˆλ‹€.

  • λͺ…λ Ήν˜• 방식
function double (arr) {
  let results = []
  for (let i = 0; i < arr.length; i++){
    results.push(arr[i] * 2) // μƒνƒœλ₯Ό 직접 μˆ˜μ •ν•œλ‹€.
  }
  return results
}
  • μ„ μ–Έν˜• 방식
function double (arr) {
  return arr.map((item) => item * 2) // μƒνƒœλ₯Ό 직접 μˆ˜μ •ν•˜μ§€ μ•ŠλŠ”λ‹€. 
}

λ¬Όλ‘ , μ„ μ–Έν˜• 방식이 μ œλŒ€λ‘œ λ™μž‘ν•˜κΈ° μœ„ν•΄μ„œλŠ” λͺ…λ Ήν˜•μœΌλ‘œ "μ–΄λ–»κ²Œ"κ°€ κ΅¬ν˜„λœ 것듀이 μΆ”μƒν™”λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. map ν•¨μˆ˜λŠ” λͺ…λ Ήν˜• κ΅¬ν˜„μ„ μΆ”μƒν™”ν•œ λŒ€ν‘œμ μΈ ν•¨μˆ˜λΌκ³  ν•  수 μžˆλ‹€. μ»΄ν¬λ„ŒνŠΈ λ‹¨μœ„μ˜ 좔상화 λ˜ν•œ λΉ„μŠ·ν•œ 의미인 κ²ƒμœΌλ‘œ νŒŒμ•…λœλ‹€. μ»΄ν¬λ„ŒνŠΈ 내뢀에 "μ–΄λ–»κ²Œ"λ₯Ό κ΅¬ν˜„ν•˜κ³ , 전체 Appμ—μ„œλŠ” ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ₯Ό μ‚¬μš©ν•΄ λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°μ„ ν•œλ‹€.

 

λ¦¬νŒ©ν† λ§ ν›„

μƒνƒœμ— 따라 Nodes UIλ₯Ό λ Œλ”λ§ν•œλ‹€. → ν•΄λ‹Ή κΈ°λŠ₯을 Nodes λΌλŠ” μ»΄ν¬λ„ŒνŠΈλ‘œ μΆ”μƒν™”ν–ˆλ‹€. setState ν•¨μˆ˜λ₯Ό 톡해 μ»΄ν¬λ„ŒνŠΈμ—κ²Œ λͺ…령을 내릴 수 μžˆλ‹€. λ‚΄κ°€ λͺ…λ Ήν•œ μƒνƒœλ₯Ό 기반으둜 UIκ°€ λ Œλ”λ§λ˜λŠ” μ„ΈλΆ€ 과정을 λ‚˜λŠ” μ•Œ 수 μ—†λ‹€. 

 

  • DOM μ ‘κ·Όμ˜ μ΅œμ†Œν™”: DOM 접근이 μΌμ–΄λ‚˜λŠ” 경우λ₯Ό 두 κ°€μ§€λ‘œ ν•œμ •ν–ˆλ‹€.
    • μ»΄ν¬λ„ŒνŠΈκ°€ μΈμŠ€ν„΄μŠ€ν™” 될 λ•Œ
    • render ν•¨μˆ˜κ°€ 싀행될 λ•Œ
  • render ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” 상황 λ˜ν•œ 두 κ°€μ§€λ‘œ ν•œμ •ν–ˆλ‹€. μ»΄ν¬λ„ŒνŠΈκ°€ μΈμŠ€ν„΄μŠ€ν™” 될 λ•Œμ™€ μƒνƒœκ°€ λ³€κ²½λ˜μ—ˆμ„ λ•Œ! 이전 μ½”λ“œμ—μ„œλŠ” DOMμ ‘κ·Όκ³Ό λ Œλ”λ§μ΄ μ–Έμ œ μ–Έμ œ λ°œμƒν•˜λŠ” 지 μ•Œ 수 μ—†μ—ˆλ‹€.(renderNodesSection ν•¨μˆ˜κ°€ μ–΄λ”” μ–΄λ””μ—μ„œ ν˜ΈμΆœλ˜μ—ˆλŠ”μ§€ 일일이 확인해야 ν–ˆλ‹€.) μƒνƒœμ˜ 변경이든, UI의 변경이든  λͺ¨λ“  변경은 μ΅œμ†Œν•œμ˜ 횟수둜 μ˜ˆμƒ κ°€λŠ₯ν•˜κ²Œ λ°œμƒν•˜λŠ” 게 μ’‹λ‹€. 그런 μ˜λ―Έμ—μ„œ render ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” 상황을 ν•œμ •ν•˜λŠ” 것은 μ€‘μš”ν•˜λ‹€.

λ‹€μŒ κΈ€μ—μ„œλŠ” μ»΄ν¬λ„ŒνŠΈ κ°„ μ˜μ‘΄μ„±μ— λŒ€ν•΄ λ‹€λ€„λ³΄μž.