이번 ν¬μŠ€νŠΈλŠ” NPM(Node Package Manager)이 λ‹€λ₯Έ μ–Έμ–΄μ˜ νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €μ™€λŠ” λ‹€λ₯Έ νŠΉμ§•μΈ Nested Dependencies에 λŒ€ν•΄ λ‹€λ£¨λŠ” 글을 λ²ˆμ—­ν•œ κΈ€μž…λ‹ˆλ‹€. 원문: Nested Dependenciesμž…λ‹ˆλ‹€. (μ²«λ²ˆμ—­κΈ€μ΄λΌ μ˜€μ—­μ΄ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.) *제 κ°œμΈλΈ”λ‘œκ·Έμ—μ„œ κ°€μ Έμ™”μŠ΅λ‹ˆλ‹€.

✌ μ€‘μ²©λœ 쒅속성과 ν‰ν‰ν•œ 쒅속성 (Nested Dependencies and Flat Dependencies)

μ˜€λŠ˜λ‚  λ§Žμ€ νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €λ“€μ΄ μžˆμ§€λ§Œ, 기본적으둜 μ€‘μ²©λœ 쒅속성(Nested Dependencies)으둜 μž‘λ™ν•˜λ„λ‘ μ„€κ³„λœ νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €λŠ” npm 밖에 μ—†λ‹€. (적어도 λ‚΄κ°€ μ•ŒκΈ°μ—λŠ”)

nested-vs-flat-deps

μœ„ λ‹€μ΄μ–΄κ·Έλž¨μ—μ„œ deps μ»¨ν…Œμ΄λ„ˆλ“€μ€ μ’…μ†μ„±μ˜ 격리된 집합을 λ‚˜νƒ€λ‚Έλ‹€. λŒ€λΆ€λΆ„μ˜ νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €λ“€μ€ λͺ¨λ“  쒅속성에 λŒ€ν•΄μ„œ ν•˜λ‚˜μ˜ 'λ„€μž„μŠ€νŽ˜μ΄μŠ€'λ₯Ό κ°–λŠ”λ‹€. λ‚˜λŠ” 이 μƒνƒœλ₯Ό 'flat(ν‰ν‰ν•œ)' 이라고 λΆ€λ₯Έλ‹€. μ™œλƒν•˜λ©΄ 쒅속성을 ν’€ λ•Œ 였직 ν•œ λ‹¨κ³„μ˜ 검색 μš©μ΄μ„±μ„ κ°€μ§„λ‹€λŠ” 것을 μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 그것은 μ•± μ „μ²΄μ—μ„œ 'foo' λΌλŠ” 이름을 가진 쒅속성이 ν•˜λ‚˜λ§Œ μžˆλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

πŸ₯™ ν‰ν‰ν•œ 쒅속성 (Flat Dependencies)

ν‰ν‰ν•œ 쒅속성 μ‹œμŠ€ν…œμ—μ„œ 쒅속성을 ν‘ΈλŠ” μž‘μ—…μ΄ μ–΄λ–»κ²Œ μΌμ–΄λ‚˜λŠ”μ§€μ— λŒ€ν•΄ μ•Œμ•„λ³΄κΈ° μœ„ν•΄ 예제λ₯Ό μ‚΄νŽ΄λ³΄λ„λ‘ ν•˜μž.

flat-deps

이 μ˜ˆμ œμ—λŠ” μ„Έ 개의 쒅속성이 μžˆλ‹€. 검정색 선듀은 '의쑴' 관계λ₯Ό μ˜λ―Έν•œλ‹€. 즉, 우리 앱은 a, b, 그리고 cλ₯Ό μ˜μ‘΄ν•˜κ³  있고, cλŠ” aλ₯Ό μ˜μ‘΄ν•˜κ³  μžˆλ‹€. 우리 μ•±κ³Ό cλŠ” λͺ¨λ‘ aλ₯Ό μ˜μ‘΄ν•˜κ³  μžˆλ‹€.

쒅속성이 ν‰ν‰ν•˜κΈ° λ•Œλ¬Έμ— (우리 μ•± 전체에 였직 ν•˜λ‚˜μ˜ λ³΅μ‚¬λ³Έλ§Œ 가지고 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•¨) 우리 μ•±κ³Ό cκ°€ λͺ¨λ‘ a의 ν˜Έν™˜λ˜λŠ” 버전에 μ˜μ‘΄ν•˜λ„λ‘ ν•΄μ•Όν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€. λ§Œμ•½ μš°λ¦¬κ°€ cλ₯Ό μƒˆλ‘œμš΄ λ²„μ „μœΌλ‘œ μ—…κ·Έλ ˆμ΄λ“œν•˜κ³  μ‹Άλ‹€λ©΄, κ·ΈλŸ¬λ‚˜ μƒˆ 버전이 우리 μ•±κ³Ό μ˜μ‘΄ν•˜κ³  μžˆλŠ” a와 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” λ²„μ „μ˜ a둜 μ—…κ·Έλ ˆμ΄λ“œν•œλ‹€λ©΄, 쒅속성 좩돌이 λ°œμƒν•œλ‹€. 이 ν˜„μƒμ€ "DLL 지μ˜₯" (Windows) λ˜λŠ” 더 일반적으둜 "쒅속성 지μ˜₯" 이라고 ν•œλ‹€.

🐦 μ€‘μ²©λœ 쒅속성 (Nested Dependencies)

μ΄λ²ˆμ—λŠ” μ€‘μ²©λœ 쒅속성 μ‹œμŠ€ν…œμ˜ 같은 예제λ₯Ό μ‚΄νŽ΄λ³΄μž.

nested-deps

μ—¬κΈ°μ„œλŠ” ν•œ λ‹¨κ³„μ˜ 쒅속성이 μ•„λ‹ˆλΌ μ—¬λŸ¬ λ‹¨κ³„μ˜ 쒅속성을 가지고 μžˆλ‹€. a와 bκ°€ 쒅속성을 가지고 μžˆμ§€ μ•Šλ‹€κ³  κ°€μ •ν•˜μž. 우리 μ•±κ³Ό cλŠ” λͺ¨λ‘ μ—¬μ „νžˆ a에 μ˜μ‘΄ν•˜κ³  μžˆλ‹€.

μ€‘μ²©λœ μ’…μ†μ„±μ—μ„œλŠ” a의 두 볡사본을 가지고 μžˆλ‹€. 우리 앱이 a의 버전 1이 ν•„μš”ν•˜κ³  cκ°€ a의 버전 2κ°€ ν•„μš”ν•˜λ‹€λ©΄ a의 두 버전을 λͺ¨λ‘ μ„€μΉ˜ν•œλ‹€. c의 쒅속성듀이 cμ—κ²Œλ§Œ 이용 κ°€λŠ₯ν•˜κ³ , μ–΄λ–€ 것도 그것듀에 μ ‘κ·Όν•  수 μ—†λ‹€. μΆ”κ°€μ μœΌλ‘œ, 우리 μ•±κ³Ό cκ°€ λͺ¨λ‘ a와 ν˜Έν™˜λ˜λŠ” 버전에 μ˜μ‘΄ν•œλ‹€λŠ” 것이 λ“œλŸ¬λ‚œλ‹€λ©΄, c's deps 폴더λ₯Ό 생성할 ν•„μš”κ°€ μ—†λ‹€. 이 κ²½μš°μ—λŠ” ν‰ν‰ν•œ μ’…μ†μ„±μ²˜λŸΌ 보일 것이닀. (이것이 npm dedupeκ°€ λ™μž‘ν•˜λŠ” 방법이닀.)

πŸ”– μž₯점과 단점

ν‰ν‰ν•œ 쒅속성 (Flat Dependencies)

  • 두 가지 섀계 쀑 더 λ‹¨μˆœν•˜λ‹€. μ–Όλ§ˆλ‚˜ λ³΅μž‘ν•œμ§€λ₯Ό κ²°μ •ν•˜λŠ” 것은 μ‚¬μš©μžμ—κ²Œ λ‹¬λ €μžˆλ‹€.
  • 쒅속성 좩돌이 일어날 수 μžˆλ‹€. (a.k.a 쒅속성 지μ˜₯)
  • 쒅속성을 λ…λ¦½μ μœΌλ‘œ 뢈러올 수 μ—†λŠ” μ–Έμ–΄μ˜ μœ μΌν•œ μ˜΅μ…˜μ΄λ‹€.

μ€‘μ²©λœ 쒅속성 (Nested Dependencies)

  • 쒅속성 좩돌이 μΌμ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€.
  • μž‘κ³  고립된 λͺ¨λ“ˆμ˜ μ‚¬μš©μ„ ꢌμž₯ν•œλ‹€.
  • 더 λ³΅μž‘ν•˜λ‹€.
  • μ„œλ‘œμ˜ 쒅속성을 κ²©λ¦¬ν•˜κΈ° μœ„ν•΄ 1κΈ‰ 객체 λ²”μœ„ 지정을 μ§€μ›ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ 같은 언어에 μ’‹λ‹€.
  • ν•„μš”ν•˜λ‹€λ©΄ μ’…μ†μ„±μ˜ μ—¬λŸ¬ 볡사본을 μ„€μΉ˜ν•œλ‹€. 즉, 더 λ§Žμ€ λ””μŠ€ν¬ 곡간을 μ°¨μ§€ν•œλ‹€. (μ‹€μ œλ‘œ μ½”λ“œκ°€ μž‘κΈ° λ•Œλ¬Έμ— 거의 λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ”λ‹€.)
  • λͺ¨λ“ˆν˜•μœΌλ‘œ μ„€κ³„λ˜μ§€ μ•Šμ€ 쒅속성을 μ‚¬μš©ν•˜λŠ” μ‚¬μš©μžλ₯Ό ν˜Όλž€μŠ€λŸ½κ²Œ ν•œλ‹€. (예: 'μ™œ λ‚΄ 앱에 jQuery 5개 버전이 μžˆμ§€?')