μƒν˜„μ— ν•˜λ£¨ν•˜λ£¨
All 개발자의 ν•˜λ£¨

Monorepo? πŸ—„ λͺ¨λ…Έλ ˆν¬

( μ—…λ°μ΄νŠΈ: )

이번 JSConf에 πŸ“ [메인 μŠ€ν…Œμ΄μ§€] λͺ¨λ…Έλ ˆν¬μ—μ„œ κ°œλ°œν•˜κΈ° – 자이 μ‚°ν† μ‹œ μ„Έμ…˜μ„ λ“£λ‹€κ°€ λͺ¨λ…Έλ ˆν¬μ—λŒ€ν•΄μ„œ μ•Œκ²Œλ˜μ—ˆλ‹€. κ·Έλž˜μ„œ λͺ¨λ…Έλ ˆν¬μ— λŒ€ν•΄μ„œ κΈ€λ‘œ 정리해보렀 ν•œλ‹€.

Lerna Git repo Git submodule

맀 ν”„λ‘œμ νŠΈλ§ˆλ‹€ λΉ„μŠ·ν•œ μ½”λ“œλ₯Ό 많이 μ‚¬μš©ν•˜κ²Œ λœλ‹€. npm에 νŒ¨ν‚€μ§€λ‘œ λ°°ν¬ν•˜κΈ°λ„ μ• λ§€ν•˜κ³  μ§€κΈˆλ‚˜λ„ 이런 κ°œλ…μ΄μ—†μ–΄μ„œ Master-publisher λΌλŠ” κ³³μ—μ„œ UI듀을 μ „λΆ€ κ°œλ°œν•˜κ³  stroybook으둜 ν™•μΈν•˜κ³  이 과정후에 μ½”λ“œλ₯Ό μ‹€μ œ μ‚¬μš©ν•  κ³³μ—μ„œ μ‚¬μš©ν•˜κ²Œλœλ‹€. 또 λ‹€λ₯Έ κ³³μ—μ„œ μ‚¬μš©ν•  λ•Œλ„μžˆκ³  ν•˜μ§€λ§Œ μ›λ³Έμ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§ν•˜κ±°λ‚˜ 쒀더 퍼포먼슀λ₯Ό λŒμ–΄μ˜¬λ¦¬κΈ°μœ„ν•΄μ„œ λ³€κ²½ν•˜λ‹€λ³΄λ©΄ λ‹€λ₯Έ 곳의 μ½”λ“œλ“€λ„ λ™μΌν•˜κ²Œ λ³€κ²½ν•΄μ€˜μ•Όν•œλ‹€. ν•˜μ§€λ§Œ ν•œλ‘κ°€μ§€μ˜ ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•œλ‹€ν•˜λ©΄ λ²ˆκ±°λ‘­μ§€λ§Œ λͺ¨λ‘ μˆ˜μž‘μ—…μœΌλ‘œ ꡐ체해쀄 μˆ˜λ„μžˆλ‹€. 그런데 이런개 λ§Œμ•½ 100가지가 λ„˜μ–΄κ°„λ‹€λ©΄? μ½”λ“œ λ¦¬νŒ©ν† λ§μ„ ν•˜κΈ° μ—„λ‘λ„μ•ˆλ‚˜μ„œ μ‹œλ„λ„ λͺ»ν•˜κ²Œλ  것이닀.

ν•˜μ§€λ§Œ 계속 ν•˜λ‚˜μ˜ μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ μž¬μ‚¬μš©ν•˜κ³ μ‹Άμ€ λ‹ˆμ¦ˆκ°€ λ°œμƒν•œλ‹€. κ·Έλž˜μ„œ λͺ¨λ…Έλ ˆν¬κ°€ 생긴 것같닀.

Mono Repo, λΆ„μ‚°λ˜μ–΄ κ΄€λ¦¬λ˜λŠ” μ—¬λŸ¬ Repositoryλ₯Ό ν•œ Repository μ•ˆμ— λ„£μ–΄μ„œ κ΄€λ¦¬ν•˜μž 이닀.

그럼 μ–΄λ–€ 것듀을 ν†΅ν•΄μ„œ?

Lerna

LernaλŠ” μ—¬λŸ¬ Packages(ν”„λ‘œμ νŠΈ)λ₯Ό κ΄€λ¦¬ν•˜λ„λ‘ λ„μ™€μ£ΌλŠ” 도ꡬ 이닀.

mono-repo/
 packages/
 package-1/package.json
 package-2/package.json
 package.json
 lerna.json

이 package에 μžˆλŠ” pacjage.,json을 μ°Έμ‘°ν•˜μ—¬, node_module을 관리할 수 μžˆλ„λ‘ 도와쀀닀.

μž₯점 Mono Repo 둜 ν”„λ‘œμ νŠΈλ₯Ό κ΅¬μ„±ν•˜κ²Œλ˜λ©΄, 각가 ν”„λ‘œμ νŠΈ λ§ˆλ‹€ μ„€μ •ν•˜λ˜ ESlintλ‚˜ Jest λ“±μ˜ μ„ΈνŒ…μ„ 더 이상 볡뢙할 ν•„μš”κ°€ μ—†λ‹€. ν•œ Repo에 λͺ¨λ“  μ½”λ“œκ°€ ν¬ν•¨λ˜μ–΄ 있기 λ•Œλ¬Έμ—, μ½”λ“œ μž¬μ‚¬μš©λ„ μš©μ΄ν•΄ 진닀.

단점 기쑴의 Repo 둜 κ΄€λ¦¬ν•˜λ˜ μ½”λ“œλ₯Ό ν•©μΉ˜λ©΄, historyλ₯Ό μžƒμ–΄λ²„λ¦΄ μˆ˜λ„ μžˆλ‹€.

Git Submodule

ν”„λ‘œμ νŠΈλ₯Ό μˆ˜ν–‰ν•˜λ‹€ 보면 λ‹€λ₯Έ ν”„λ‘œμ νŠΈλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μ’…μ’… μžˆλ‹€. ν•¨κ»˜ μ‚¬μš©ν•  λ‹€λ₯Έ ν”„λ‘œμ νŠΈλŠ” μ™ΈλΆ€μ—μ„œ κ°œλ°œν•œ λΌμ΄λΈŒλŸ¬λ¦¬λΌλ˜κ°€ λ‚΄λΆ€ μ—¬λŸ¬ ν”„λ‘œμ νŠΈμ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•  라이브러리일 수 μžˆλ‹€. 이런 μƒν™©μ—μ„œ 자주 μƒκΈ°λŠ” μ΄μŠˆλŠ” 두 ν”„λ‘œμ νŠΈλ₯Ό μ„œλ‘œ λ³„κ°œλ‘œ λ‹€λ£¨λ©΄μ„œλ„ κ·Έ 쀑 ν•˜λ‚˜λ₯Ό λ‹€λ₯Έ ν•˜λ‚˜ μ•ˆμ—μ„œ μ‚¬μš©ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€λŠ” 것이닀.

Git μ €μž₯μ†Œ μ•ˆμ— λ‹€λ₯Έ Git μ €μž₯μ†Œλ₯Ό λ””λ ‰ν† λ¦¬λ‘œ 뢄리해 넣은 것이 μ„œλΈŒ λͺ¨λ“ˆμ΄λ‹€. λ‹€λ₯Έ λ…λ¦½λœ Git μ €μž₯μ†Œλ₯Ό Cloneν•΄μ„œ λ‚΄ Git μ €μž₯μ†Œ μ•ˆμ— 포함할 수 있으며 각 μ €μž₯μ†Œμ˜ 컀밋은 λ…λ¦½μ μœΌλ‘œ κ΄€λ¦¬ν•œλ‹€.