๊ณ ์ค๋ฝ์์ ํ๋ก์ ํธ๋ฅผ ์ธ๋ฒ์งธ ์ด์ด์ค๋ฉด์ ํจ์จ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๊ณ์ ๊ณ ๋ฏผํ๊ณ ์๋ค. ์ด๋ฒ์ ์๋ก์ด ํ๋ก์ ํธ, ๋๋ฅ์ ์์ํ๋ฉด์ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๋์ ํ๊ฒ ๋์๋ค. ์ด๋ฒ ํฌ์คํ ์ ๋ชจ๋ ธ๋ ํฌ ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ CICD๋ฅผ ๊ตฌ์ถํ๋ฉด์ ๊ณต๋ถํ๋ ๊ฒ๋ค๊ณผ ์ฝ์ง์ ๋ํ ๊ธฐ๋ก์ด๋ค.
1) ๋์ ์ด์ , yarn workspaces, berry
2) ๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ ์ธํ - vite, nextjs, storybook, emotion
3) CI/CD - docker, github actions ์ธํ
1. ๋์ ์ด์
์๋ ์ ์ฒ์ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ํ๋ก ํธ์ชฝ์ 3๊ฐ์ ๋ ํฌ๋ก ๊ตฌ์ฑํ๋ค. ์ ์ ํ๋ก ํธ ์ฌ์ดํธ, ์ด๋๋ฏผ ์ฌ์ดํธ, ๊ทธ๋ฆฌ๊ณ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ๋ค. ์คํ ๋ฆฌ๋ถ ๋ ํฌ์งํ ๋ฆฌ์ ์ปดํฌ๋ํธ๋ค์ npm ํจํค์ง๋ก ๋ฐฐํฌํด์ ํ๋ก ํธ์ ์ด๋๋ฏผ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ๋ค. ์ด๋ฐ ๋ฉํฐ๋ ํฌ๋ ๊ฐ์ฅ ๋ณดํธ์ ์ธ ๋ฐฉ์์ด๋ค.
์ฌ์ค ๊ท๋ชจ๊ฐ ํฌ์ง ์๋ค๋ณด๋ ์ด๋ ๋คํ ๋ถํธํจ๊น์ง ์๋์ง๋ง ์์ฌ์์ ์ด๋์ ๋ ์์๋ค. ๊ทธ๋์ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๋์ ํ๊ธฐ๋ก ํ๋ค!
์๋น์ค ๊ฐ์ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ธฐ ์ฝ๋ค
๊ฐ๋ฐ ์์๋ฅผ ๊ณํํ ๋ ์คํ ๋ฆฌ๋ถ ๋ ํฌ์์ ์ปดํฌ๋ํธ๋ค์ ๋ค ๋ฝ์๋๊ณ ์๋น์ค ๊ฐ๋ฐ๋ก ๋์ด๊ฐ๊ธฐ๋ก ํ๊ณ , ์ค์ ๋ก ๊ทธ๋ ๊ฒ ์งํํ๋ค. ํ์ง๋ง ๋น์ฐํ ์ค๊ฐ์ ๊ธฐํ๊ณผ ๋์์ธ์ด ๋ฐ๋๊ฒ ๋๋ฉด์ ๊ฐ๋ฐ์ค์ ๊ณ์ ๋ค๋ฅธ ๋ ํฌ์งํ ๋ฆฌ์ ์๋ ์ปดํฌ๋ํธ๋ค์ ์์ ํด์ผ ํ๋ ์ผ์ด ์๊ฒผ๋ค. ๊ทธ๋๋ง๋ค ์ปดํฌ๋ํธ ํ๋ก์ ํธ๋ฅผ ์ด์ด์ ์์ ํ๊ณ , ํจํค์ง ๋ฐฐํฌ ๊ธฐ๋ค๋ ธ๋ค๊ฐ, ๋ค์ ์๋น์ค ๋ ํฌ๋ก ๋์์์ ์์กด์ฑ ๋ค์ด๋ฐ๋ ๊ณผ์ ์ด ํ์ํ๋ค. ์๋นํ ๊ท์ฐฎ์์ ๋์ค์ผ๋ก ๊ฐ์๋ก ํจํค์ง ์์ฐ๊ณ ๊ทธ๋ฅ ๊ทธ๋๊ทธ๋ ๋์ถฉ ๋ง๋ค์๋ ๊ธฐ์ต์ด ์๋ค. '์ค๋ณต์ผ๋ก ์ฌ์ฉ๋ ์ ์๋ ๊ฒ'์๋ ์ปดํฌ๋ํธ ๋ฟ๋ง ์๋๋ผ ๋ฆฌ์กํธ ํ , ์ ํธํจ์, ํ์ ์ธํฐํ์ด์ค ๋ฑ์ด ์์ ์ ์๋ค.
ํ๋ก์ ํธ ์ ์ฒด์ ๋ณ๊ฒฝ์ ํ์ ํ๊ธฐ ์ฝ๋ค
๊ธฐ์กด์ ์ด๋๋ฏผ์ ๋ค๋ฅธ ์น๊ตฌ๋ค์๊ฒ ๋งก๊ธฐ๊ณ ํ๋ก ํธ๋ง ์ ๊ฒฝ์จ์ ์์ ํ๋ค. ํ์ง๋ง ์ ์๋น์ค๋ฅผ ๊ธฐํํ๋ฉด์ ์ ์ ํ์ด์ง๋ณด๋ค ์ฃผ ๊ธฐ๋ฅ์ผ๋ก ์ฌ๊ธธ ์ ๋๋ก ์ด๋๋ฏผ ํ์ด์ง์ ์ค์์ฑ์ด ์ปค์ก๋ค. ๋์ถฉ antd๋ก ๋์ก๋ ๋์์ธ์์ ์ ์ ํ์ด์ง์ ์ผ๊ด๋ ๋์์ธ์ผ๋ก ๋ค์ ์์ ํ๋ค. ๊ฐ์ด ํ์ ํ๋ ์น๊ตฌ๋ค์ด ์ปค๋ฐํ ์์ ๋ค๋ ๊ฐ์ด ํ์ ํ๊ณ ๋ฆฌ๋ทฐํ ์ ์์ด์ผ ํ๋ค. ๋ชจ๋ ์๋น์ค๋ฅผ ํ๋์ ๋ ํฌ์์ ๊ด๋ฆฌํ ์ ์๋ค๋ฉด ํ์ ์๋ ํฐ ๋์์ด ๋ ์ ์๋ค.
๋ชจ๋ ธ๋ ํฌ๋ฅผ ๋์ ํ๊ธฐ๋ก ํ ๊ณ๊ธฐ๋ ์ ๋๊ฐ์ง์ด์ง๋ง, ์ฌ์ค ์๋ ๋ชจ๋ ธ๋ ํฌ ์ฌ์ฉ์ ๊ฐ์ฅ ํฐ ์ด์ ๋ ์์กด์ฑ ๊ด๋ฆฌ์ ์๋ค. ์ฌ๋ฌ ๊ฐ์ ๋ ํฌ์์ ์์กดํ๋ ํจํค์ง๋ค์ ๋ฃจํธ์์ ํ๋ฒ์ ๋ช ์ํ ์ ์๊ณ , ๊ด๋ฆฌ์ ํจ์ ์ฉ์ดํ๋ค๊ณ ํ๋ค. ํ์ง๋ง ์ฒ์ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ฉด์ ์ ๋ฅผ ๋ง์ด ๋จน์๋ค. ์์กด์ฑ๊ณผ ํจํค์ง๋งค๋์ ์ ๋ํด ๊ณ ๋ฏผ์ ๋ง์ด ํ๊ณ , ๊ทธ๋งํผ ์ด๊ฒ์ ๊ฒ ์ฐพ์๋ณด๋ฉด์ ๊ณต๋ถํ๋ค. ํ์ง๋ง ์์ง๋ ๋๋ฌด ๋๋ฌด ์ด๋ ต๋ค.
2. Yarn workspaces
๋ชจ๋ ธ๋ ํฌ ๊ด๋ฆฌ๋ฅผ ์ํ ๋๊ตฌ๋ก yarn workspaces๋ฅผ ์ ํํ๋ค. ์ฐ๋ฆฌ๋๋ผ์์ ๊ฐ์ฅ ๋ ํผ๋ฐ์ค๊ฐ ๋ง๊ณ ๋ฌธ์๋ ์๋์ด ์์ด์ ์ฌ์ฉํ๊ฒ ๋์๋ค. workspace๋ผ๋ ๊ฒ์ ๋ด๊ฐ ์ดํดํ๊ณ ์ฌ์ฉํ๊ณ ์๋๋๋ก ์ค๋ช ํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค!
โโโ apps
โ โโโ admin # ์ด๋๋ฏผ ์๋น์ค. react + vite
โ โโโ ticket # ํฐ์ผ ์๋น์ค. nextjs
โโโ shared
โโโ ui # ๊ณต์ ์ปดํฌ๋ํธ, theme. react + storybook
โโโ utils # ์ ํธ ํจ์, ๊ณต์ฉ ํ
, ํ์
๋ฑ. react
ํ๋ก์ ํธ๊ฐ ์ด๋ ๊ฒ ๊ตฌ์ฑ๋์ด ์์ ๋, shared ๋๋ ํ ๋ฆฌ์ ์๋ ํจํค์ง๋ค์ apps์ ์๋ ์๋น์ค๋ก ๋ถ๋ฌ์ ์ฌ์ฉ๋ ์ ์์ด์ผ ํ๋ค. ์ฆ ๊ฐ์ '์์ ๊ณต๊ฐ'์์ ์๊ณ , ui์ utils๊ฐ ์์กดํ๊ณ ์๋ ํจํค์ง๋ค๋ ํจ๊ป ๋ถ๋ฌ์ ์ฌ์ฉ๋๋ค. yarn berry์์๋ ์ด๋ฐ ๊ธฐ๋ฅ์ yarn workspaces๋ผ๋ ์ด๋ฆ์ผ๋ก ์ง์ํ๊ณ ์๋ค.
// ./package.json
{
"name": "dudoong-front",
"packageManager": "yarn@3.3.0",
"private": true,
"workspaces": {
"packages": [
"apps/*",
"shared/*"
]
},
// ...
}
๋ฃจํธ์ package.json
์์ ์ด๋ ๊ฒ workspace๋ฅผ ๋ช
์ํด์ค๋ค. apps์ ์๋ ๋ชจ๋ ํจํค์ง์ shared์ ์๋ ๋ชจ๋ ํจํค์ง๋ค์ด workspace ์์ ๋ค์ด๊ฐ์๋ค.
// shared/ui/package.json
{
"name": "@dudoong/ui",
"main": "src/index.ts",
"types": "src/index.ts",
//...
}
// apps/admin/package.json
{
"name": "admin",
"private": true,
"version": "0.0.0",
"type": "module",
"dependencies": {
"@dudoong/ui": "workspace:shared/ui",
"@dudoong/utils": "workspace:shared/utils",
// ...
}
//...
}
๊ทธ๋ฆฌ๊ณ shared ๋ ํฌ์ apps ๋ ํฌ์ package.json์์ dependencies์ ๋ช ์๋ฅผ ํจ์ผ๋ก์ workspace๋ฅผ ํ์ฉํ ์ ์๋ค.
yarn install
์ ํ๋ฉด ๋ฃจํธ์ package.json์์ ํ์ ๋๋ ํ ๋ฆฌ์ package.json์ ๋ช
์๋ ์์กด์ฑ๊น์ง ํ๋ฒ์ ์ค์นํ ์ ์๋ค. ์ด ๊ณผ์ ์์ ํ์ ํจํค์ง๋ค์ ์ค์น๋ ํจํค์ง๋ค์ ์ค๋ณต์ ์ ๊ฑฐํ๋ค. ๋ฃจํธ์ node_modules๋ก ํธ์ด์คํ
๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจํค์ง๋ฅผ ์ฐ๋ฏ์ด ๋ชจ๋ ธ๋ ํฌ ์์ ํจํค์ง๋ค์ dependencies๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค๋๊ฒ ๊ต์ฅํ ํธํ๊ณ ๋ง์ ๋ ๋ค. ์ธ๋ถ ํจํค์ง๋ก ๋ฐฐํฌํด์ ์ฌ์ฉํ ์๋ ์์ง๋ง ๊ทธ๋ด ํ์๊น์ง ์์๋์๋ ๋ฑ ์ ๋นํ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ๋ค. ์์ธํ ์ธํ ์ ๋ค์ ํฌ์คํ ์ผ๋ก ๋๋ ์ ๊ธฐ๋กํ ์์ .
3. Yarn Berry
yarn workspaces๋ฅผ ์ฌ์ฉํ๋ฉด์ yarn berry์ pnp๋ชจ๋๋ฅผ ์ฒ์ ๋์ ํด๋ณด๋ ค๊ณ ํ๋ค. ๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด ์ ์๋๋ค. tsconfig๋ฌธ์ ์ธ์ง ๋ญ์ง ๋ชจ๋๋ค์ ๊ฒฝ๋ก๋ฅผ ์ ๋๋ก ๋ชป์ฐพ์์๋ค. ์ผ๋ฐ craํ๊ฒฝ๊ณผ ํฐ๋ณด๋ ํฌ ํ๊ฒฝ์์ ๋๊ฐ์ด yarn berry ์ค์ ์ ํด๋ดค์๋ ๋ฌธ์ ์์ด ์ ์๋ํ๊ฒ์ ๋ณด์์, ๋ด ํ๋ก์ ํธ์ tsconfig ๊ฐ์ ์ค์ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค. ๊ฑฐ์ ์ดํ์ ๋๋ฅผ ๋ถ์ก๊ณ ์์๋๋ฐ๋ ํด๊ฒฐํ์ง ๋ชปํด์ ์ผ๋จ pnp๋ชจ๋๋ ์ ์ธํ๊ธฐ๋ก ํ๋ค. pnp๋ฅผ ์ง์ํ์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๋ ๋ช ์๊ณ next13์์ pnp๋ก ์ธํ ์ด์๊ฐ ๋ง์ด ์๊ฒผ๋ค๋ ์ด์ผ๊ธฐ๋ฅผ ๋ค์ด์ ์คํ๋ ค ๋งํธํ node_module๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก.
node_modules๋ก๋ถํฐ ์ฐ๋ฆฌ๋ฅผ ๊ตฌ์ํด ์ค Yarn Berry ํ ์ค์ ๊ฐ์ฉ๋ ๊ธฐ์ ๋ธ๋ก๊ทธ. ์์ฝํ์๋ฉด ๋ณต์กํ๊ณ ๋นํจ์จ์ ์ธ node_modules ๋์ .yarn/cache
์ zipํ์ผ์ ํํ๋ก ์ ์ฅํ๊ณ , .pnp.cjs
์ ํด๋น ํ์ผ์ ์ฐพ์ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ๋ค.
yarn set version berry
yarn install
yarn์ ๋ฒ์ ์ berry๋ก ์ค์ ํ๊ณ installํ๋ฉด yarnrc.yml
ํ์ผ์ด ์์ฑ๋๋ค.
yarn dlx @yarnpkg/sdks vscode
ํ์ ๋ชจ๋์ ๊ฒฝ๋ก๋ฅผ node_modules๊ฐ ์๋ ๋ค๋ฅธ ๊ฒฝ๋ก์์ ์ฐพ์์ผ ํ๋ค. vscode๋ฅผ ์ฌ์ฉํ ๋๋ ์์ ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ํ์ ์คํฌ๋ฆฝํธ sdk๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. pnp๊ฐ ์ ๋๋ก ์๋์ ์ํด์ ์ sdk๋ง ์๋ฐฑ๋ฒ์ ์ค์นํด๋ดค๋ ๊ฒ ๊ฐ๋ค.
// .yarnrc.yml
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
spec: '@yarnpkg/plugin-typescript'
yarnPath: .yarn/releases/yarn-3.3.0.cjs
nodeLinker: node-modules
nodeLinker๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ pnp๋ชจ๋๋ก ๋์ํ๋ค. ์๋ง์ ์๋ ๋์ node-modules๋ก ๋ฐ๊ฟ์ฃผ์๋ค.
๋ค์ ๊ธ์ ์ ์ฒด์ ์ธ ๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ ๊ตฌ์ถ๊ณผ ์ฝ์ง๊ธฐ๋ก ๋์์ค๊ฒ ์ด๋ค.