์ƒํ˜„์— ํ•˜๋ฃจํ•˜๋ฃจ
๊ฐœ๋ฐœ์ž์˜ ํ•˜๋ฃจ

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 ์ €์žฅ์†Œ ์•ˆ์— ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ ์ €์žฅ์†Œ์˜ ์ปค๋ฐ‹์€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.