๐ฆ Monorepo๋? - Polyrepo์ ๋น๊ตํด๋ณด๊ธฐ โ
ํ๋ก์ ํธ๋ฅผ ์์ํ๋ฉด์ pnpm + Turborepo ๊ธฐ๋ฐ ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์กฐ๋ฅผ ์ ํํ๋ค.
Monorepo์ ๊ฐ๋ ๊ณผ Polyrepo์์ ์ฐจ์ด๋ฅผ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
๐ Reference
https://medium.com/@magenta2127/monorepo-vs-multi-repo-vs-monolith-7c4a5f476009
๐งฉ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๋๋์ด ๊ด๋ฆฌํ ๊ฒ์ธ๊ฐ - ์ด๊ฒ ๋ ํฌ์งํ ๋ฆฌ ์ ๋ต์ ํต์ฌ์ด๋ค.
| ์ ๋ต | ์ค๋ช |
|---|---|
| ๋ชจ๋ ธ๋ฆฌ์ค(Monolith) | ํ๋์ ํ๋ก์ ํธ ์์ ๋ชจ๋ ์ฝ๋๊ฐ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์์ด ๋ถ๋ฆฌ๊ฐ ์ด๋ ค์ด ๊ตฌ์กฐ |
| ํด๋ฆฌ๋ ํฌ(Polyrepo) | ์๋น์คยทํจํค์ง๋ง๋ค ๊ฐ๊ฐ ๋ณ๋ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ์ฌ ๋ ๋ฆฝ์ ์ผ๋ก ์ด์ |
| ๋ชจ๋ ธ๋ ํฌ(Monorepo) | ํ๋์ ๋ ํฌ์งํ ๋ฆฌ ์์ ์ฌ๋ฌ ํจํค์ง๋ฅผ ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๊ณ๋ก ๋๋์ด ๊ด๋ฆฌ |
Monorepo โ Monolith
- Monorepo โ ์ ์ฅ์๊ฐ ํ๋
- Monolith โ ๊ตฌ์กฐ๊ฐ ํ๋
- ๋ชจ๋ ธ๋ ํฌ๋ ์ฝ๋๊ฐ ํ ๋ ํฌ์ ์์ด๋ ๊ฐ ํจํค์ง๋ ๋ ๋ฆฝ์ ์ผ๋ก ์กด์ฌํ ์ ์๋ค.
Monorepo๋? โ
๋ชจ๋ ธ๋ ํฌ๋ ๋จ์ผ ์ ์ฅ์(Monolithic Repository)์ ์ฝ์๋ก, ๋ ๊ฐ ์ด์์ ํ๋ก์ ํธ๋ฅผ ํ๋์ ๋ ํฌ์งํ ๋ฆฌ์์ ํจ๊ป ๊ด๋ฆฌํ๋ ์ ๋ต์ด๋ค.
๋จ์ํ ํด๋๋ฅผ ํ๋ฐ ๋ชจ์๋๋ ๊ฒ์ด ์๋๋ผ, ๋ค์๊ณผ ๊ฐ์ ๊ด๋ฆฌ์ ํจ์จ์ฑ์ ๋ชฉ์ ์ผ๋ก ํ๋ค.
- ํจํค์ง ๊ฐ ์์กด์ฑ ๊ณต์
- ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฌ์ฉ
- ํตํฉ๋ ์ค์ ๊ด๋ฆฌ
- ์บ์ ๊ธฐ๋ฐ ๋น๋
Monorepo์ ์ฅ๋จ์ โ
์ฅ์ โ
์ฝ๋ ์ฌ์ฌ์ฉ์ฑ ๊ทน๋ํ: ์ฌ๋ฌ ์๋น์ค์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ UI, utils ๋ฑ์ ๋ณ๋์ ๋ฐฐํฌ ๊ณผ์ ์์ด ๋ฐ๋ก ์ฐธ์กฐํ ์ ์๋ค.์์์ ์ปค๋ฐ (Atomic Commits): ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธํฐํ์ด์ค๋ฅผ ๋ณ๊ฒฝํ ๋, ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์๋น์ค์ ์ฝ๋๋ฅผ ํ ๋ฒ์ PR๋ก ์์ ํ ์ ์์ด ๋ฒ์ ๋ถ์ผ์น๋ก ์ธํ ๋ฐํ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๋ค.์ผ๊ด๋ ๊ฐ๋ฐ ํ๊ฒฝ: ESLint, Prettier ์ค์ ๋ฑ์ ์ต์์์์ ํ ๋ฒ๋ง ๊ด๋ฆฌํ๋ฉด ๋ชจ๋ ํ์ ํ๋ก์ ํธ์ ๋์ผํ๊ฒ ์ ์ฉ๋๋ค.
๋จ์ โ
CI/CD ๋ณต์ก๋์ ๋น๋ ์๊ฐ: ์ ์ฅ์๊ฐ ์ปค์ง์๋ก ์ ์ฒด ๋น๋ ์๊ฐ์ด ๋์ด๋ ์ ์๋ค. ๋ฐ๋ผ์Turborepo๋Nx๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ํจํค์ง๋ง ์ ๋ณ์ ์ผ๋ก ๋น๋ํ๋ ์ ๋ต์ด ํ์์ ์ด๋ค.๋ฌ๋ ์ปค๋ธ: ์ด๋ฐ ํ๊ฒฝ ๊ตฌ์ถ์ ์๊ฐ์ด ๋ค์ ์์๋ ์ ์๋ค.์์กด์ฑ ์ค์ผ: ํน์ ํ๋ก์ ํธ์๋ง ํ์ํ ์์กด์ฑ์ด ๋ฃจํธ์ ์ค์น๋์ด ๋ค๋ฅธ ํ๋ก์ ํธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ์ฃผ์๊ฐ ํ์ํ๋ค.
๐ชบ ์ํฌ์คํ์ด์ค๋?
pnpm, yarn ๋ฑ ํจํค์ง ๋งค๋์ ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ผ๋ก, ํ๋์ ๋ ํฌ์งํ ๋ฆฌ ์์์ ์ฌ๋ฌ package.json์ ๊ฐ์ง ํด๋๋ค์ ๊ฐ๋ณ ํจํค์ง๋ก ์ธ์ํ๊ฒ ํด์ค๋ค. ์ด๋ฅผ ํตํด ๋ด๋ถ ํจํค์ง๋ฅผ ๋ง์น ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฒ๋ผ importํด์ ์ธ ์ ์๋ค.
Polyrepo๋? โ
Polyrepo(Multi-repo)๋ ํ๋ก์ ํธ๋ง๋ค ์ ์ฅ์๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ๋ ์ ํต์ ์ธ ๋ฐฉ์์ด๋ค.
๊ฐ ์๋น์ค(User, Admin, API ๋ฑ)๋ ์์ ๋ง์ ๋
๋ฆฝ์ ์ธ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๋ค.
Polyrepo์ ์ฅ๋จ์ โ
์ฅ์ โ
ํ๋ณ ์์จ์ฑ: ํ๋ง๋ค ์ํ๋ ๊ธฐ์ ์คํ๊ณผ ์ปจ๋ฒค์ ์ ์์ ๋กญ๊ฒ ์ ์ฉํ ์ ์๋ค.๊ฒฉ๋ฆฌ๋ ๊ถํ: ํน์ ํ๋ก์ ํธ์ ์์ค ์ฝ๋ ์ ๊ทผ ๊ถํ์ ์๊ฒฉํ ๋ถ๋ฆฌํ๊ธฐ ์ฝ๋ค.
๋จ์ โ
์ฝ๋ ์ค๋ณต: ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ ์ฝ๋๋ฅผ ๋ ํฌ์งํ ๋ฆฌ๋ง๋ค ๋ณต์ฌํด์ ์ฌ์ฉํ๊ฒ ๋๋ค.๋๊ธฐํ์ ์ด๋ ค์: ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ ํ๋ฉด ์ด๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์ผ์ผ์ด ๋ค์ด๊ฐ์ ์ ๋ฐ์ดํธํ๊ณ ๋ฐฐํฌํด์ผ ํ๋ค.
๋ชจ๋ ธ๋ ํฌ vs ํด๋ฆฌ๋ ํฌ (Multi-repo) โ
| ๊ตฌ๋ถ | ๋ชจ๋ ธ๋ ํฌ (Monorepo) | ํด๋ฆฌ๋ ํฌ (Polyrepo / Multi-repo) |
|---|---|---|
| ๊ด๋ฆฌ ๋ฐฉ์ | ํ๋์ ์ ์ฅ์์์ ๋ชจ๋ ํ๋ก์ ํธ ๊ด๋ฆฌ | ํ๋ก์ ํธ๋ณ๋ก ๊ฐ๋ณ ์ ์ฅ์ ์ด์ |
| ์ฝ๋ ๊ณต์ | ๋ด๋ถ ํจํค์ง ์ฐธ์กฐ๋ก ๋งค์ฐ ์ฌ์ | NPM ๋ฐฐํฌ ๋๋ ๋ณ๋ ์ค์ ํ์ |
| ์์กด์ฑ ๊ด๋ฆฌ | ๋ฒ์ ์ผ๊ด์ฑ ์ ์ง๊ฐ ์ฌ์ | ํ๋ก์ ํธ๋ง๋ค ๋ฒ์ ์ด ๋ฌ๋ผ ์ถฉ๋ ๊ฐ๋ฅ์ฑ ๋์ |
| CI/CD | ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋น๋ํ๋ ๋ณต์กํ ์ค์ ํ์ | ๊ฐ ํ๋ก์ ํธ๊ฐ ๋ ๋ฆฝ์ ์ด๋ผ ๋น๋๊ฐ ๋น ๋ฆ |
| ๊ถํ ๊ด๋ฆฌ | ์ ์ฅ์ ์ ์ฒด์ ๋ํ ์ ๊ทผ ๊ถํ ๋ถ์ฌ | ํ๋ก์ ํธ๋ณ๋ก ์ธ๋ฐํ ๊ถํ ์ ์ด ๊ฐ๋ฅ |
| ํ์ฅ์ฑ | ๋์ | ๋ฎ์ |