monorepo ๋ repo ๋ฅผ ๊ตฌ์ฑํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ค์ ํ๋๋ก , ํ repository ๋ด๋ถ์ ์ฌ๋ฌ project ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌ์ฑ๋ ํ๊ฒฝ์ ๋งํฉ๋๋ค.
์ด์ ํ์ฌ์์ ํตํฉ์ ์ผ๋ก ๊ฐ๋ฐํ๋ ํ๋ก์ ํธ๊ฐ ์์๋๋ฐ , ๊ทธ ํ๋ก์ ํธ๊ฐ ๊ฐ๋ณ์ ์ธ ๋ ํ๋ก์ ํธ๋ก ๋๋์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ์๊ฒผ์ต๋๋ค. ํ์ง๋ง ๋ถ๋ฆฌ๋๋ ๊ฒฝ์ฐ์๋ ๋น์ทํ ๋์์ธ๊ณผ ๋น์ทํ๊ฒ ์ฌ์ฉ๋๋ ์ฝ๋๊ฐ ์กด์ฌํด์ ๊ณ ๋ฏผํ๋ ์์ค์ monorepo๋ฅผ ์ ํํ๊ฒ ๋์์ต๋๋ค. ์ฌ์ฉํด๋ณธ ๊ฒฐ๊ณผ๋ก๋ ์๋์ ๊ฐ์ ์ฅ๋จ์ ์ด ์กด์ฌํ์ต๋๋ค.
๋น์ทํ component, ๋น์ทํ hook์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. project1, project2 (์ดํ p1, p2 ) ์์ ๋ชจ๋ ์ฌ์ฉ๋๋ ๊ฒ๋ค์ common ์ด๋ผ๋ workspace์ ๋๊ณ , ํ์ํ ๊ณณ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํด์ ๋ถํ์ํ๊ฒ ๋๋ฒ ์ ์ธํ ํ์๊ฐ ์์ด์ ธ์ ํธ๋ฆฌํฉ๋๋ค.
์ฝ๋ ์ปจ๋ฒค์ ํต์ผ์ ์ฉ์ดํฉ๋๋ค. p1, p2 ๊ฐ ํ repository ์์ ์กด์ฌํ๋ค๋ณด๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์๋ ์ผ์ ํ ์ปจ๋ฒค์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ฌ์์ง๊ณ , ์ฌ๋ฌ ํ๋ก์ ํธ๊ฐ ์ผ์ ํ ์ปจ๋ฒค์ ์ ์ ์งํ๋ฏ๋ก ๊ฐ๋ฐํ ๋ด๋ถ์์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ๋ ์ฌ์์ง๋ ์ฅ์ ์ด ์์ต๋๋ค. ๋ ํ๋ก์ ํธ๋ฅผ ์ฎ๊ฒจ๊ฐ๋ฉด์ ์ผ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๊ทธ ๊ฐ๊ทน์ ๋๋๋ค๊ธฐ ์ฌ์์ง๋๋ค.
๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ๋ชจ๋์ ํ๋ฒ์ ์ค์นํด์ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค. ๋ค๋ง ๋จ์ ์๋ ๋งํ๊ฒ ์ง๋ง ๋์ผํ์ง ์์ ๋ฒ์ ์ ๋ชจ๋์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๋ถ๋ถ์๋ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
๋์ผํ์ง ์์ ๋ฒ์ ์ ๋ชจ๋์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ถฉ๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ง์ฝ ๊ฐ์ ๋ชจ๋์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ์๋ ํ๋ก์ ํธ๋ณ๋ก ํฉ์๊ฐ ํ์ํ ์ ์์ต๋๋ค.
์ฒ์ ์ค์ ๋ฐ ์ฌ์ฉ์ ์๊ฐ์ด ํ์ํ๊ณ , ์ดํด ๋ฐ ํ์ต์ ์๊ฐ์ด ํฌ์๋ฉ๋๋ค. ๋ฐ์๊ฒ ๋์๊ฐ๋ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ , ์ค์น ๋ฐ ์ ์ฉ์ด ํ๋ค ์ ์์ต๋๋ค.
์ฌ๋ฌ ์ฅ๋จ์ ์ด ์กด์ฌํ๊ณ ํ๋ก์ ํธ์ ๊ท๋ชจ์ ๋ฐ๋ผ์ ์ฌ์ฉ์ด ํ๋ค ์๋ ์์ง๋ง , ์ฌ์ฉํด๋ณธ ๊ฒฝํ์ผ๋ก๋ ๊ต์ฅํ ํธ๋ฆฌํ ์ ์ด ๋ ๋ง์์ต๋๋ค. ์ ๊ฒฝํ์ผ๋ก๋ ๊ณตํต์ธ component ์ hook ์ ๋ง๋ค ์ ์๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ์ฅ์ ์ผ๋ก ๋ค๊ฐ์๊ณ , dependency ๊ฐ ํ๋๋ง ์ค์น๋์ด๋ ๋๋ค๋ ์ ๋ ํฐ ์ฅ์ ์ด์์ต๋๋ค. ์ฒ์ ์ ์ฉํ ๋๋ ๋ฌผ๋ก ์ฌ๋ฌ ์ด๋ ค์์ด ์์์ง๋ง ํ๋ฒ ์ ์ฉ์ ์ ํด๋๋ฉด ๊ต์ฅํ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ต๋๋ค.
yarn ์์ monorepo๋ฅผ ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํ๋๋ก ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. ํ๋์ repo์์ ์ฌ๋ฌ project ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๊ณ , dependency ๋ฅผ ๊ด๋ฆฌํด์ฃผ์ด ํธ๋ฆฌํ๊ฒ monorepo ์ธํ ์ด ๊ฐ๋ฅํฉ๋๋ค.
monorepo ๋ฅผ ์์ฑํ๋ ค๋ ํด๋ ๋ด๋ถ์ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ํตํด ๊ธฐ๋ณธ ํ์ผ์ ์์ฑํฉ๋๋ค.
shell
yarn init -y
์ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ๊ธฐ๋ณธ ํ์ผ๋ค์ด ์ค์น๋๊ณ , package.json ํ์ผ์ ์๋์ ๊ฐ์ด ์์ฑ๋ฉ๋๋ค.
json
{
"name": {ProjectName},
"packageManager": "yarn@4.1.1"
}
root์ package.json ํ์ผ์ ์๋์ ๊ฐ์ด ์ถ๊ฐํฉ๋๋ค.
json
{
...
"workspaces": {
"packages": [
"packages/**"
]
}
...
}
monorepo ๋ก ์ฌ์ฉํ workspace ๋ฅผ ์ง์ ํ๋๋ฐ , packages ๋ผ๋ ํด๋๋ฅผ ์์ฑํด์ ๊ทธ ์์ ์๋ ํ์ผ์ monorepo๋ก ๊ด๋ฆฌํ๋ค๋ ์๋ฏธ์
๋๋ค. ๋ฐ๋ผ์ packages ํด๋ ์์ฑ ํ , ๊ทธ ์์monorepo ๋ก ์ฌ์ฉํ ํ์ผ๋ค์ ์ถ๊ฐํฉ๋๋ค. ์ ๋ project1 , project2 ๋ฅผ vite๋ก ์ถ๊ฐํ์ต๋๋ค.

์ถ๊ฐ๋ก , ์์ฑ๋ project ๋ค์ package.json ๋ด๋ถ์ ๊ด๋ฆฌํ ํ๋ก์ ํธ์ ์ด๋ฆ์ ๋ฐ๋์ ์ง์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
root ์์ project๋ฅผ ์คํํ๊ฑฐ๋ ๋น๋ ๋ฑ๋ฑ์ ์์
์ ํ ๋๋ง๋ค yarn workspace {project name} build ์ ํ์์ผ๋ก ์์ฑํด์ผ ํ๋ ๊ท์ฐฎ์์ด ์๋ค. ๋๋ cd ~ ๋ฅผ ์ด์ฉํด ์ ์ํด์ผํ๋ค. ์ด๋ฅผ root ์์ ์งํํ๊ธฐ ์ํด์ script๋ฅผ ์์ ํด ์ฃผ์ด์ผ ํ๋ค.
shell
"scripts": { "p1": "yarn workspace project1", "p2": "yarn workspace project2" }
project1,2 ์ ์ ์ํ๊ธฐ ์ํด์ p1,p2 ๋ช ๋ น์ด๋ฅผ ์ง์ ํด ์ฃผ์๋ค. ์ด๋ ๊ฒ ์ง์ ํด๋๋ฉด, ์๋์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
shell
yarn p1 build # project1 ๋น๋ yarn p2 dev # project2 ์คํ


๊ฐ๊ฐ ํ๋ก์ ํธ์ root ์์ ๊ฐํธํ๊ฒ ์คํ๋๋ ๋ชจ์ต์ด๋ค.
tsconfig.json ์์ ๊ฐ ํ์ผ๋ง๋ค ๊ฐ๋ณ๋ก tsconfig.json ์ ์ค์ ํ ์๋ ์์ง๋ง , ๊ณตํต๋๋ ๋ถ๋ถ์ด ์๋ค๋ฉด root ์ ์ง์ ํด๋๊ณ ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค. ์ฌ๊ธฐ์๋ ๊ณตํต๋๋ ๋ถ๋ถ์ root์ ์ง์ ํด๋๊ณ , ๊ฐ์ ธ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
root ์ tsconfig.json ํ์ผ์ ์์ฑํ๊ณ , ์๋์ฒ๋ผ ์
๋ ฅํ๋ค.
json
// root tsconfig.json
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
compilerOptions : project1 project2 ๋ด๋ถ์์ ๊ณตํต์ธ ๋ถ๋ถ์ ์ถ์ถํด์ ์ถ๊ฐํ๋ค.references : root ์์ ํ์ package ๋ด๋ถ์ tsconfig ๊ฐ ์ด๋์ ์กด์ฌํ๋์ง ์๋ ค์ฃผ๋ ์ ๋ณด์ด๋ค. ํ์ root์์ ํ์ tsconfig.json ์ ์์น๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค.exclude : ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ ํ์ง ์์ ํ์ผ์ ์ถ๊ฐํ๋ค.์ดํ ํ์ ํด๋์ tsconfig.json ํ์ผ์์ extends ๋ฅผ ํตํด์ ์ถ๊ฐํ๋ค.
json
{
...
"extends": "../../tsconfig.json",
"include": ["src"],
...
}
๊ธฐ๋ณธ ์ค์ ์ ๊ฒฝ์ฐ ํฌ๊ฒ ์ด๋ ค์์ด ์์์ง๋ง , ์ดํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ๋ฑ์ ๊ณผ์ ์์ ์ฌ๋ฌ ์ค๋ฅ๊ฐ ์์๋ ๊ธฐ์ต์ด ์๋ค. ์ดํ 2ํธ์์๋ prettier , eslint ๋ฑ ๊ฐ๋ฐ์ ์์ํ๊ธฐ ์ ์ ์ค์ ํด์ผ ํ๋ ๊ฒ๋ค์ ์์ฑํ๋ ค๊ณ ํ๋ค.
์๋ชป๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ ์์ ์ด ์๋ repo ๋ ์ฌ๊ธฐ๋ฅผ ํ์ธํด์ฃผ์ธ์ !