-
๋ชจ๋ ธ๋ ํฌ ๋์ ํ๊ธฐ(Feat. Nx)TECH 2023. 8. 27. 17:49
์ต๊ทผ ๋ชจ๋ ธ๋ ํฌ๋ผ๋ ๊ฐ๋ ์ด ์ฃผ๋ชฉ๋ฐ๊ณ ์์ต๋๋ค. ๋ชจ๋ ์ฝ๋์ ๋ฆฌ์์ค๊ฐ ํ๋์ ์ ์ฅ์ ์์์ ๊ด๋ฆฌ๋๋ ๋ชจ๋ ธ๋ ํฌ ๋ฐฉ์์ ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ๋์ฌ ์ค๋ค๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
์ ๊ฐ ์ํด ์๋ ํ์์๋ ๋จ์ํ ์๋ก์ด ํธ๋ ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ ๊ฒ์ด ์๋, ๊ฐ๋ฐ์์ ์์ ํจ์จ๊ณผ ์์ฐ์ฑ ํฅ์์ ์ฃผ ๋ชฉ์ ์ผ๋ก ๋ฉํฐ๋ ํฌ ํ๊ฒฝ์์ ๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ์ผ๋ก์ ์ ํ์ ๊ฒฐ์ ํ๊ฒ ๋์์ต๋๋ค.
์ด ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์ ์ ๊ฒฝํ๊ณผ ๊ทธ ๊ฒฐ๊ณผ์ ๋ํ ํ๊ธฐ๋ฅผ ์์ฑํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋ชจ๋ ธ๋ ํฌ ๋์ ๋ฐฐ๊ฒฝ
์ฐ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ์ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
. โโโ AProject โโโ BProject โโโ CProject
- ๋ ํฌ์งํ ๋ฆฌ์ ํ์์ ๋ชจ๋
ธ๋ ํฌ๋ณด๋ค๋ ๋ชจ๋๋ฆฌ์
- ํ ๋ ํฌ์งํ ๋ฆฌ ์์ n๊ฐ์ ํ๋ก์ ํธ๊ฐ ์์
- ๋ชจ๋ ํ๋ก ํธ์๋์ ์ฝ๋์ ๋ฆฌ๋ทฐ๋ ํ๋์ ๋ ํฌ์์ ์ฐธ๊ณ ํ ์ ์์
- ๋ชจ๋ ธ๋ ํฌ ํด๋ง ํ๊ฒฝ(npm workspace, turborepo ๋ฑ)์ด ์๋
- ๋ชจ๋ ธ๋ ํฌ์ ์ด์ (๊ณตํต ๋ชจ๋, eslint ํ๊ฒฝ ์ค์ ๋ฑ)์ ์ฌ์ฉํ์ง ๋ชปํ๋ ์ํฉ
๋ ํฌ์งํ ๋ฆฌ์ ํ์์ ๋ชจ๋ ธ๋ ํฌ์ ์ ์ฌํ ํ์์ ๋๊ณ ์์์ผ๋, ๋ชจ๋ ธ๋ ํฌ์ ์ด์ ์ ์ฌ์ฉํ๊ณ ์์ง ์์์ผ๋ฏ๋ก ๋จ์ ๋ชจ๋๋ฆฌ์์ด๋ผ๊ณ ํ๋ ๊ฒ์ด ์ ํฉํฉ๋๋ค. ๊ณตํต ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์๋ ๊ตฌ์กฐ์๊ธฐ ๋๋ฌธ์ ์ฌ์ค์ ๋ฉํฐ๋ ํฌ์ ๋ ๊ฐ๊น๋ค๊ณ ๋๊ปด์ง๋ ๊ตฌ์กฐ์์ต๋๋ค.
๋ชจ๋ ธ๋ ํฌ๋ก ๊ฐ๊ธฐ ์ ๊น์ง๋ ์ฌ๋ฌ ๋๊ด๋ค์ด ๋ง์์ต๋๋ค. ์ฐ์ ์ฒ์ ๋ชจ๋ ธ๋ ํฌ์ ํ์์ฑ์ ๊นจ๋ฌ์์ ๋๋ถํฐ ์ด์ผ๊ธฐํด ๋ณด๋ ค๊ณ ํฉ๋๋ค.
๋ชจ๋ ธ๋ ํฌ๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ํ๊ฒ ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ํ๋ก์ ํธ ๊ฐ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ชจ๋์ ๊ด๋ฆฌํ๋ ๊ฒ์ ์ด๋ ค์์ ๋๊ปด์์ ๋๋ค.
๋ชจ๋ ธ๋ ํฌ์ ๊ฐ๋ ์ ์๊ณ ์๋ ์ฌ๋๋ค์ด๋ผ๋ฉด ์ด๋ฐ ๊ทธ๋ฆผ์ ์ ๋ง ๋ง์ด ๋ดค์ ๊ฒ์ ๋๋ค.
์ด ๊ทธ๋ฆผ์์๋ ์ฌ์ฉํ๋ ํด, ์ธ์ด, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ์ ์ด์ ์ ๋ง์ถ์ด ์ค๋ช ํ๊ณ ์์ง๋ง, ํ๋ก์ ํธ ๋ด์ ๊ณตํต ๋ชจ๋๋ ๊ฐ์ ๊ฒฝ์ฐ์ ๋๋ค.
์๋ฅผ ๋ค๋ฉด ๋ฆฌ์กํธ์ ๊ฐ์ custom hook์ A ํ๋ก์ ํธ, B ํ๋ก์ ํธ, C ํ๋ก์ ํธ ๊ฐ๊ฐ์ ์์ฑํ์ฌ ๊ด๋ฆฌํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ํ๋์ ํ ์ ๊ฐ๋จํ ํ ์ค๋ง ๋ฆฌํฉํ ๋งํ๊ฑฐ๋ ์ปดํฌ๋ํธ์ ๊ตฌ์กฐ๊ฐ ์กฐ๊ธ์ฉ ๋ฐ๋๋ ๊ฒฝ์ฐ์๋ ์ธ ํ์ผ์ ๋ชจ๋ ์์ ํด ์ฃผ์ด์ผ ํ์ต๋๋ค.
๋ํ eslint, prettier ๋ฑ์ ์ค์ ์ ๋์ผํ๊ฒ ์ธํ ํ๊ณ ์ถ์ ๋๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ํ๋์ ์ค์ ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ๋ก์ ํธ์ ํด๋น ์ค์ ์ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด ํ๋ก์ ํธ์ ๊ฐ์์ ๋์ํ๋ ํ์ผ๋ค์ ๋ชจ๋ ์์ ํด์ผ ํฉ๋๋ค. ์ค์ ํ์ผ์ ํ๋ ๋ณ๊ฒฝํ ๋๋ง๋ค ์ธ ํ๋ก์ ํธ์ ์ค์ ์ด ์ธ์ ๋ ํจ๊ป ๋ณ๊ฒฝ๋์ง ์์ ๋๋ ์์๊ธฐ ๋๋ฌธ์ eslint์ ์ฌ์ฉํ์ง ์๋ ๊ท์น ๋ฑ์ด ํ๋ก์ ํธ๋ง๋ค ๊ฐ๊ฐ ๋ฌ๋ผ ์ฝ๋ฉ ์ปจ๋ฒค์ ์ด ์ฌ์ํ๊ฒ ๋ค๋ฅธ ์ํฉ์ด์์ต๋๋ค.
๊ฒ๋ณด๊ธฐ์๋ ๋ชจ๋ ธ๋ ํฌ์ฒ๋ผ ๋ณด์ผ์ง ๋ชจ๋ฅด๋ ๋น์์ ํ๊ฒฝ์ ์ฝ๋ ๊ณต์ ์ธก๋ฉด์์๋ ๋ชจ๋ ธ๋ ํฌ์ ์ด์ ์ ๋๋ฆด ์ ์์์ง๋ง(๋ชจ๋ ํ๋ก์ ํธ์ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํ๋์ ๋ ํฌ์งํ ๋ฆฌ์์ ํ์ธํ ์ ์๋ค๋ ๊ฐ) ์ฝ๋ ๊ด๋ฆฌ ์ธก๋ฉด์์๋ ์ ํ ์๋์์ต๋๋ค. ํ์์๋ ์ด๋ฌํ ๋ฒ๊ฑฐ๋ก์์ ๋ถํธ์ ๋ง์ด ๋๋ผ๊ณ ์๋ ์ํฉ์ด์๊ณ , ๋ชจ๋ ํ๋ก ํธ์๋ ํ์๋ค๊ณผ ์ด์ผ๊ธฐ๋ฅผ ๋๋์ด ๋ดค์ ๋ ์ด ๋ฌธ์ ๋ฅผ ๋ชจ๋ ธ๋ ํฌ ๋ง์ด๊ทธ๋ ์ด์ ์ ํตํด ํด๊ฒฐํ๋ ์๊ฒฌ์ ๋ชจ๋๊ฐ ์ฐฌ์ฑํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋น์์ ํ ์ํฉ์์ ๋ฉํฐ๋ ํฌ์์ ๋ชจ๋ ธ๋ ํฌ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฒ์ ๋ฐ์์ผ ํ ์ ์ฐจ๊ฐ ๋งค์ฐ ๋ง์๊ณ , ๋ฐ๋ผ์ ๊ฐ์ฅ ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ๋ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํด๊ฒฐํ๊ธฐ ์ํด ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ๋ด๋ถ ๋ชจ๋์ ๋ง๋ค์ด ์ฌ์ฉ/๊ด๋ฆฌํ๋ ๊ฒ๋ถํฐ ์์ํ๊ฒ ๋์์ต๋๋ค.
ํ์์ ๋๋ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ด๋ถ ๋ชจ๋ ๊ณตํต ์ ์ฉ
- CRA ํ๋ก์ ํธ๋ฅผ Vite๋ก ๋ง์ด๊ทธ๋ ์ด์
- ๋ชจ๋ ธ๋ ํฌ ๋ง์ด๊ทธ๋ ์ด์
๋ด๋ถ ๋ชจ๋ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ
์ฌ๋ฌ ํ๋ก์ ํธ ๊ฐ ๋ด๋ถ์ ์ผ๋ก ๊ณตํต ๋ชจ๋์ ์ฌ์ฉํ๋ ๋ฐฉ์์
yarn link
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ฑํํ์ต๋๋ค. (๊ธฐ์กด ํจํค์ง ๋งค๋์ yarn ์ฌ์ฉ)yarn link
๋ ๋ก์ปฌ์์ ๋ค๋ฅธ ํจํค์ง๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๊ณ , ๋น์ ํ๋ก์ ํธ ๋ฐฐํฌ๋ CI/CD ํ๊ฒฝ์ ์ฌ์ฉํ์ง ์๊ณ aws์ ์ง์ ํ์ผ์ ์ ๋ก๋์ ๋ฐฐํฌํ๋ ํ๊ฒฝ์ด์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ์ ์ฉํ ์ ์์์ต๋๋ค.๊ธฐ์กด์๋ ํ๋ก์ ํธ๋ง๋ค hooks ํด๋์์ ๊ฐ๊ฐ ์ปค์คํ ํ ์ ๊ด๋ฆฌํ๊ณ ์์๋๋ผ๋ฉด ๊ณตํต ๋ชจ๋ ํ๊ฒฝ ์ธํ ํ์๋ Common์ด๋ผ๋ ํ๋ก์ ํธ ๋ด์์ ์ธ ํ๋ก์ ํธ์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ hooks๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋์ด ๊ฐ์ ๊ธฐ๋ฅ์ ์ฝ๋๊ฐ ํ๋ก์ ํธ์ ๋ฒ์ ์ ๋ฐ๋ผ ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ฒ ๋์์ต๋๋ค.
# before . โโโ AProject โ โโโ hooks โโโ BProject โ โโโ hooks โโโ CProject โโโ hooks # after . โโโ AProject โโโ BProject โโโ CProject โโโ Common โโโ hooks
์ด ์คํ ์์ react์ hook์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋
Uncaught TypeError: Cannot read properties of null (reading 'useState')
์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค.์ด ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ณตํต ๋ชจ๋์ ๊ฐ๋ฐํ ๊ฒฝ์ฐ์๋ Common ์ ํ๋ฆฌ์ผ์ด์ ์์ react๋ฅผ ๋ณ๋๋ก ์ค์นํ ๊ฒฝ์ฐ์ ์ ์๋ฌ์ฒ๋ผ ์๊ธฐ์น ์์ ๋์์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ ํ์ ํ์ต๋๋ค. Common์์๋
peer dependencies
๋ก react๋ฅผ ์ ์ธํด ์ฃผ์ด์ผ Common์ ์ฌ์ฉํ๋ ๊ณณ, ์๋ฅผ ๋ค๋ฉด AProject์ react ์์กด์ฑ์ Common์ด ์ฐธ์กฐํ๊ฒ ๋์ด ์์กด์ฑ ์ถฉ๋๋ก ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ต๋๋ค.VITE ๋ง์ด๊ทธ๋ ์ด์
VITE ๋ง์ด๊ทธ๋ ์ด์ ๋ฐฐ๊ฒฝ
๋ชจ๋ ธ๋ ํฌ ๋ง์ด๊ทธ๋ ์ด์ ์ ํ๊ธฐ ์ , CRA → Vite ๋ง์ด๊ทธ๋ ์ด์ ์ ๋จผ์ ์งํํ๊ฒ ๋์์ต๋๋ค.
React ๊ณต์ ๋ฌธ์์์ ์ ๊ท ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ๊ฐ์ด๋ ๋ถ๋ถ์ CRA์ ์๋ด๊ฐ ๋น ์ง ์ํ์ ๋๋ค. (์ฐธ๊ณ ) ์๋ก์ด ํ๋ก์ ํธ๋ฅผ ์์ํ๋ ค๋ ๊ฒฝ์ฐ Next.js, Remix.js ๋ฑ React ๊ธฐ๋ฐ ๋ฉํ ํ๋ ์์ํฌ๋ฅผ ์ถ์ฒํฉ๋๋ค. React๋ฅผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ์๋ Vite๋ฅผ ๋ฒ๋ค๋ฌ๋ก ์ถ์ฒํ๊ณ ์์ต๋๋ค.
์ธ์๋ ์ ํฌ ํ์์๋ PostCSS ๋์ ์ ํ์ผ๋, CRA๋ PostCSS์ ์ปค์คํ ํ๊ฒฝ ์ค์ ์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ eject๋ฅผ ํ๊ฑฐ๋ eject ์์ด ์นํฉ ์ค์ ์ ๋ณ๊ฒฝํ ์ ์๋ craco ๊ฐ์ ํจํค์ง๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. (์ฐธ๊ณ ) ํ๋ก ํธ์๋ ํ ๋ด์์๋ ์ด์ ๊ด๋ จํ์ฌ CRA๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ์๋ ๋ ผ์๊ฐ ์ด๋ฃจ์ด์ง๊ณ ์๋ ์ํฉ์ด์์ต๋๋ค.
์ฒ์์๋ CRA๋ก ์์ฑ๋ ํ๋ก์ ํธ๋ฅผ ๋ชจ๋ ธ๋ ํฌ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ค ์๋ํด ๋ณด์์ต๋๋ค. ๊ทธ๋ฌ๋ TypeScript๋ก ์์ฑ๋ ๋ด๋ถ ํจํค์ง๋ฅผ ์ปดํ์ผํ์ง ์๊ณ ๋ JavaScript ํ๋ก์ ํธ์์ importํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ ค์์ ๊ฒช์์ต๋๋ค. Turborepo์ ๊ณต์ ๋ฌธ์์๋ ๋ชจ๋ ธ๋ ํฌ์ ๋ด๋ถ ํจํค์ง๋ฅผ TypeScript๋ก, ํ๋ก์ ํธ๋ JavaScript๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ์ ์๋ฃจ์ ์ด ๋์ ์๊ธด ํ์์ผ๋ Next.js์ Vite๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ง ๋ช ์๋์ด ์๋ ์ํฉ์ด์์ต๋๋ค.
Nx๋ CRA ํ๋ก์ ํธ๋ฅผ Nx Workspace๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐฉ์์ด ์์ฑ๋์ด ์๊ธด ํ์ง๋ง ์ด๋ ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์์๊ณ , ๋ฉํฐ๋ ํฌ๋ฅผ ๋ชจ๋ ธ๋ ํฌ ํ์์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ์ ํฌ ํ์ ์ํฉ์๋ ์ ํฉํ์ง ์์ ์ ๋ณด์์ต๋๋ค.
๋ฐ๋ผ์ ์ฅ๊ธฐ์ ์ผ๋ก ๋ณด์์ ๋ Vite์ ๋น๋ ์ฑ๋ฅ ๊ฐ์ ๋ฑ์ผ๋ก ๊ฐ๋ฐ ํจ์จ์ฑ์ ์ป์ ์ ์๋ค๋ ์ ๊ณผ ๋ชจ๋ ธ๋ ํฌ ๋ง์ด๊ทธ๋ ์ด์ ์ด ์ฉ์ดํ๋ค๋ ์ ์ ์ด์ ๋ก ๋ชจ๋ ธ๋ ํฌ ๋ง์ด๊ทธ๋ ์ด์ ํ์๋ผ์ธ์ CRA ํ๋ก์ ํธ๋ฅผ Vite๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ์คํ ์ ์ถ๊ฐํ๊ฒ ๋์์ต๋๋ค.
VITE ๋ง์ด๊ทธ๋ ์ด์ ์ค ์ด์
ํ๋ก ํธ์๋ ํ๋ก์ ํธ๋ ์ด ์ธ ๊ฐ๊ฐ ์๋ ์ํฉ์ด์๋๋ฐ, ํ๋ก์ ํธ๋ง๋ค ํ๊ฒฝ์ด ์์ดํ์ต๋๋ค.
- AProject:
webpack
(CRA eject),JavaScript
- BProject:
CRA
,craco
,TypeScript
- CProject:
CRA
craco
,JavaScript
์๋ก ๋ค๋ฅธ ํ๊ฒฝ์ Vite ๋ง์ด๊ทธ๋ ์ด์ ํ๋ค ๋ณด๋ PostCSS ํ๋ฌ๊ทธ์ธ ์ค์ ์์ ์ ๋ฅผ ๋จน๊ธฐ๋ ํ์ต๋๋ค. AProject๋ webpack์์ PostCSS ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ postcss.config.js๋ก ์ค์ ํ๋ BProject์ ๋ฌ๋ผ ์คํ์ผ์ด ์ ๋๋ก ํํ๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด ๋ฌธ์ ๋ AProject์ postcss.config.js ํ์ผ์ ์ถ๊ฐํ์ฌ ํด๊ฒฐํ์ต๋๋ค.
ํ๋ก์ ํธ์์๋ glb์ zip ํ์ฅ์ ํ์ผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์์์ต๋๋ค. ์ด ํ์ผ๋ค์ Vite ๋น๋์ ํฌํจ์ํค๋ ค๋ฉด ์ถ๊ฐ์ ์ธ Vite ํ๋ฌ๊ทธ์ธ์ด ํ์ํฉ๋๋ค. ์ด ๋ถ๋ถ์ ๋ก์ปฌ์์ ๊ด๋ฆฌํ๋ glb์ zip ํ์ผ๋ค์ AWS S3์ ์ ๋ก๋ํ์ฌ ์ฌ์ฉํ์ต๋๋ค.
VITE ์ ์ฉ ํ
๋์ผํ ํ๊ฒฝ์์ ๋น๊ตํด ๋ณด์์ ๋ CRA ํ๊ฒฝ์์๋ ์ฝ 144s ์์๋์๋ ๋น๋ ์๊ฐ์ Vite ํ๊ฒฝ์์๋ ์ฝ 24s๋ก, 6๋ฐฐ ์ ๋ ๋จ์ถํ ์ ์์์ต๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์คํํ ๋์๋ ํ์คํ ์ฒด๊ฐํ ์ ์์ ๋งํผ ์๋๊ฐ ๋จ์ถ๋์๋๋ฐ, CRA ํ๊ฒฝ์์ ๊ธธ๊ฒ๋ 10s ์ด์ ์์๋์๋ ์คํ ์๊ฐ์ด Vite ํ๊ฒฝ์์๋ ์ฝ 400ms๋ก 25๋ฐฐ ๊ฐ๋ ๋จ์ถ๋์์ต๋๋ค.
์ฝ๋ ๋ณ๊ฒฝ ํ ์ ์ฅ ์์๋ CRA๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ก๊ณ ์นจ ํ๋ ๋ฐ 3~5s ์์๋์์ง๋ง, Vite๋ ์์ ๋ ๋ชจ๋๋ง ๋น ๋ฅด๊ฒ ๋ก๋ฉํ์ฌ ๋ฐ์ํด ์ฃผ๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ 1s ์ด๋ด์ ๋ณ๊ฒฝ ๋ด์ฉ์ด ๋ฐ์๋์ด ๊ฐ๋ฐ์ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์์ต๋๋ค.
CRA VITE ๋น๋ 144s 24s ํ๋ก์ ํธ ์คํ 10s+ 400ms ์ฝ๋ ๋ณ๊ฒฝ ํ ์๋ก๊ณ ์นจ 3~5s ~1s ๋ชจ๋ ธ๋ ํฌ ํด ์ ํ
ํ ์ํฉ์ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๊ฒฝํํด ๋ณธ ์ฌ๋์ด ์์๊ณ , ์๋ก์ด ํ๋ก ํธ์๋ ํ์(์ฃผ๋ก ์ ์ )์ด ํจ๊ปํ ๊ฐ๋ฅ์ฑ์ด ์์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ ์ฌ๋์ ๊ฑฐ์ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ ํ์ง ์์ ์ฌ๋๋ค์ผ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ ํฌ ํ์์๋
yarn workspace
๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๊ฒ๋ณด๋ค ํจ๊ณผ์ ์ธ ๋ชจ๋ ธ๋ ํฌ ํด์ ๋์ ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ๋์ ๊ฒ์ด๋ผ๋ ํ๋จ์ ๋ด๋ ธ์ต๋๋ค.๋น์ ์ ํฌ ํ์์ ๋ฆฌ์์นํ ๋ชจ๋ ธ๋ ํฌ ํด์ Lerna, Terborepo, Nx ์ธ ๊ฐ์ง๊ฐ ์์์ต๋๋ค.
๋ค๋ฅธ ๋ชจ๋ ธ๋ ํฌ ํด๊ณผ ๋น๊ตํ์ ๋ Nx๋ Nx console์ด๋ผ๋ VS Code์์ Nx๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํ GUI ํด์ ์ ๊ณตํฉ๋๋ค. Nx console์ ์ฌ์ฉํ์ ๋, ์๋ก์ด ๋ฆฌ์กํธ ํ๋ก์ ํธ(๋๋ ๋ฆฌ์กํธ๊ฐ ์๋ ํ๋ก์ ํธ๋)๋ฅผ ์์ฑํ๋ค๊ฑฐ๋, ์๋ก์ด ๋ด๋ถ ํจํค์ง๋ฅผ ์์ฑํ๋ค๊ฑฐ๋, ๋ชจ๋ ธ๋ ํฌ์ ๋ณ๋ ฌ์ ์ผ๋ก ๋์ ์ ์๋ํ๊ณ ์์๋ Storybook์ด๋ cypress๋ฅผ ์ธํ ํ๋ ์์ ๋ ์์ฝ๊ฒ ํ ์ ์์ ๊ฒ ๊ฐ์ ๋ณด์์ต๋๋ค. ๋ฐ๋ผ์ Nx๊ฐ ๊ฐ๋ฐ์ ๊ฒฝํ ์ธก๋ฉด์์ ์ ๋ฆฌํ ๊ฒ์ด๋ผ๊ณ ํ๋จํ์ต๋๋ค.
๋ํ ๊ณต์ ๋ฌธ์์ ๋ค์ํ ์ค๋ช ๊ณผ ์์ ๊ฐ ์กด์ฌํ๊ณ , npm trend๋ก ๋น๊ตํด ๋ณด์์ ๋ ๋ค๋ฅธ ํด๋ณด๋ค ์ฌ์ฉ์๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์ํ๊ณ ์ธก๋ฉด์์๋ ์ ๋ฆฌํ ๊ฒ์ด๋ผ๊ณ ์๊ฐ๋์ด Nx๋ก ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๊ด๋ฆฌํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ค ๊ฒช์ ์ด์
๊ธฐ์กด ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ๋ชจ๋ ธ๋ ํฌ ํ์์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ฉด์ ๊ฒช์๋ ์ด์๋ค์ ๋๋ค.
์ฒซ ๋ฒ์งธ๋ก๋, ๊ธฐ์กด (๊ฒ์ผ๋ก ๋ดค์ ๋ ๋ชจ๋ ธ๋ ํฌ ๋ชจ์์ ๋๋) ๋ ํฌ์งํ ๋ฆฌ์ Nx๋ง ์ถ๊ฐํ๋ ํํ์ ๋ง์ด๊ทธ๋ ์ด์ ์ ํ ์ ์์๋ค๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๊ธฐ์กด ๋ ํฌ์งํ ๋ฆฌ๋
yarn workspaces
์ด ์๋yarn link
๋ฅผ ์ฌ์ฉํ์ฌ ์์กด์ฑ์ ๊ด๋ฆฌํ๊ณ ์๋ ํํ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ธ๋ ํฌ ๊ตฌ์กฐ๋ฅผ ๋๊ณ ์์ง๋ ์์์ต๋๋ค.Nx์ ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ ๋๋ โ
npm/yarn/pnpm workspaces
์์ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐฉ๋ฒ, โก ๋ชจ๋ ธ๋ ํฌ๊ฐ ์๋ ๋จ์ผ ํ๋ก์ ํธ์ Nx๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ, โข ์๋ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐฉ๋ฒ ๋ฑ์ด ์์ฑ๋์ด ์์์ต๋๋ค. ์๋ ๋ง์ด๊ทธ๋ ์ด์ ์ Nx workspace๋ฅผ ์๋ก ์์ฑํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋package.json
์ ์์กด์ฑ์ ์๋์ผ๋ก ์ฎ๊ธฐ๋ ๋ฐฉ์์ด์์ต๋๋ค. ์ ํฌ ํ์์๋ ์๋ ๋ง์ด๊ทธ๋ ์ด์ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ๋ก ํ์ต๋๋ค.์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ ํ์ ๋, ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ณผ ํ์ ์ฐจ์ด๋ฅผ ์ด๋ป๊ฒ ์กฐ์ ํ ์ง์ ๋ํ ๊ณ ๋ฏผ์ด ์์์ต๋๋ค. ์คํํธ์ ์์ ์๋น์ค ๊ฐ๋ฐ์ ๋น ๋ฅธ ์๋๋ก ์งํ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋ ์์ ์ ๋งค์ผ ๋ฐ์ํ๊ณ , ์๋ก์ด ๋ ํฌ์งํ ๋ฆฌ์์ ๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ์ ๊ตฌ์ถํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ง์ด๊ทธ๋ ์ด์ ์ดํ์ ๊ธฐ์กด ๋ ํฌ์งํ ๋ฆฌ์ ์์ฑ๋ ์ฝ๋์ ์ฑํฌ๋ฅผ ์ด๋ป๊ฒ ๋ง์ถ๋๋๊ฐ ๋ฌธ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ง์ด๊ทธ๋ ์ด์ ์ผ์ ์ ๋ฐ๋ก ํ์ํ๊ฒ ๋์์ต๋๋ค.
๋ ๋ฒ์งธ๋ก๋, ๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ์ ๊ตฌ์ถํ ์๋ก์ด ์ ์ฅ์๋ก ์ฝ๋๋ฅผ ์ด์ ํ ๋ ์ปค๋ฐ ํ์คํ ๋ฆฌ๊น์ง ์ฎ๊ธฐ๋ ๊ณผ์ ์ด ํ์ํ์ต๋๋ค.
์ ํฌ ํ์์๋
git filter-repo
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ํจ๊ป ์ด์ ํ์ต๋๋ค. ์ธ์๋git filter-branch
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.์ธ ๋ฒ์งธ๋ก๋, JavaScript ํ๋ก์ ํธ์์ ์ปดํ์ผ ํ์ง ์์ TypeScript๋ก ์์ฑ๋ ๋ด๋ถ ํจํค์ง๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
yarn add --dev @nx/js
Nx์์๋ ๊ฐํธํ๊ฒ @nx/js๋ผ๋ ํจํค์ง๋ฅผ ์ค์นํจ์ผ๋ก์ JavaScript ํ๋ก์ ํธ ๋ด์์๋ TypeScript๋ก ์์ฑ๋ ๋ชจ๋์ ์คํํ ์ ์์์ต๋๋ค.
๋ค ๋ฒ์งธ๋ก๋, ๋ฐฐํฌ ํ๊ฒฝ์์ dayjs error๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
์ด ๋ฌธ์ ๋ dayjs ๊ณต์ ๋ฌธ์์ ์ ๋์ ์๋๋ฐ, tsconfig.json ์ค์ ๊ณผ ๊ด๋ จ ์์์ต๋๋ค.
tsconfig.json ์ค์ ์ ๋ฐ๋ผ
import * as dayjs from "dayjs"
์import dayjs from "dayjs"
์ค ์ฌ์ฉ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง๋ค๊ณ ํฉ๋๋ค.ํ๊ธฐ
๋ชจ๋ ธ๋ ํฌ ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๊ฒ์ ํ๋ก ํธ์๋ ํ์ ์์ ์ฌ์ ์ด์์ต๋๋ค. ๋๋ฃ์ ํจ๊ป ํ ๋ฌ ๋์ ์ฃผ์ 2ํ ํ์ฌ์ ๋จ์ ๋ฆ๊ฒ๊น์ง ์ํฐ๋์์ ์ฃผ์ตํ ๋ชจ๋ ธ๋ ํฌ๋ฅผ ์ฃผ์ ๋ก ํ ์ฑ๋ฆฐ์ง์๋ ์ฐธ์ฌํ๋ฉฐ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ตํ๊ธฐ๋ ํ์ต๋๋ค. ํ๋ก ํธ์๋ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ชจ์ธ ๋ฏธํ ์์ ๊ฐ์ฅ ์๊ธํ๊ฒ ํด๊ฒฐํ๋ฉด ์ข์ง๋ง ๋ชจ๋ ธ๋ ํฌ๋ฅผ ๋ค๋ค ๋ณธ ๊ฒฝํ์ด ์๊ธฐ ๋๋ฌธ์ ์ฃ๋ถ๋ฆฌ ์์ ๋ ์๋๊ฐ ๋์ง ์์ ์ ์๊ฒ๋ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ก ์ฌ๊ฒจ์ง๊ธฐ๋ ํ์ต๋๋ค. ์ด ๊ธ์ ๋น๋ ค ๋ชจ๋ ธ๋ ํฌ ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์ ์ ํจ๊ปํด ์ค ๋ฒ ์ผ๋ฆฌ์๊ฒ ๊ฐ์ฌ์ ๋ง์์ ์ ํฉ๋๋ค. ๐
ํด์ฌ๋ฅผ ์๋๊ณ ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ๊ฒ ๋์ด ํด์ฌ D-1๊น์ง ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ๋ ๊ธฐ์ต์ด ๋ฉ๋๋ค. ๋ชจ๋ ธ๋ ํฌ ๊ฐ์ ๊ฒฝ์ฐ๋ ํ๋ฃจ ๋นจ๋ฆฌ ์งํํ๊ณ ์ถ์ ์์ ์ด๊ธฐ๋ ํ๊ณ , ๋ ์ด๊นจ์ ์น๊ณ ์๋ ์ง์ด๋ผ๋ ์๊ฐ๋ ํ์์ด์ ๊ฑฐ์ ๋ง์ง๋ง ๋ ๊น์ง ์ ๋ฌด๋ฅผ ์ํํ์ง๋ง ๊ต์ฅํ ๊ธฐ๋ปค๊ณ ํ๊ฐ๋ถํ ๋ง์์ด ๋ค์์ต๋๋ค.
Vite ๋์ ํ production ๋ฐฐํฌ๋ฅผ ์ํด Rollup์ ์ฌ์ฉํด์ผ ํ๋ค๋ ์ ์์ ์ถ๊ฐ์ ์ผ๋ก ํ์ตํด์ผ ํ๋ ๋ถ๋ถ๋ ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ถ๋ถ์ ์์ ํ ํด๊ฒฐํ์ง ๋ชปํ ์ฑ๋ก ํด์ฌํ๊ฒ ๋์ด ์์ฝ์ต๋๋ค.
๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ๊ฒ ๋๋ฉฐ ๊ด๋ จ ์ํฐํด์ ๊ต์ฅํ ๋ง์ด ์ฐพ์๋ณด์๋ ๊ธฐ์ต๋ ๋ฉ๋๋ค. ํํด ํ์์๋ 2๋ถ๊ธฐ๋์ ๋ชจ๋ ธ๋ ํฌ ๋ง์ด๊ทธ๋ ์ด์ ์ ์งํํ๋ค๊ณ ํ๋๋ฐ, ์ด๋ฐ์๋ ๋นํจ์จ์ ์ธ ํ์คํฌ๋ค์ ์ฐ์์ ์ง์ณ ๋นจ๋ฆฌ ๋์ ํด ๋ฒ๋ฆฌ๊ณ ์ถ์ด ํ๋ ์๊ฐ๋ ๋๋ค์. ์งํํ๊ณ ๋ณด๋ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ ๋ง์ด ๋ค์ผ ์๋ฐ์ ์๋ ์์ ์ด์์ต๋๋ค.
ํ๋ก์ ํธ๋ฅผ ๋ชจ๋ ธ๋ ํฌ ํํ๋ก ๊ด๋ฆฌํ๋ฉฐ ๋๋ ์ ๋ค์ ์ ๋ฆฌํ๋ฉด์ ๊ธ์ ๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค.
- ๋ชจ๋ ธ๋ ํฌ ๋ง์ด๊ทธ๋ ์ด์ ์ ํตํด ๊ฐ์ฅ ๋นํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ๋ ๋ถ๋ถ, ์ฌ๋ฌ ํ๋ก์ ํธ ๊ฐ ์ฝ๋๋ฅผ ๊ณต์ ํ๊ณ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํ์ฌ ๊ฐ๋ฐ์๋ค์ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์์์ต๋๋ค.
- ์ฌ๋ฌ ๊ฐ์ง ๋ชจ๋ ธ๋ ํฌ ํด๋ค์ ๋น๊ต ๋ถ์ํ๋ฉด์ ํ์ ์๊ตฌ ์ฌํญ์ ๊ฐ์ฅ ์ ํฉํ ๋๊ตฌ๋ฅผ ์ ํํ๊ณ ๊ณผ๊ฑฐ๋ถํฐ ํ์ฌ๊น์ง์ ๋ชจ๋ ธ๋ ํฌ ๋ํฅ์ ๋ํ ์ธ์ฌ์ดํธ๋ ํจ๊ป ์ป์ ์ ์์์ต๋๋ค.
- ๋ชจ๋ ธ๋ ํฌ ํ๋ก์ ํธ๋ฅผ ์ฒ์ ์์ํ์ ๋๋ ๋ฏธ์ฒ ์๊ฐํ์ง ๋ชปํ๋ ๋ถ๋ถ์ธ Vite ๋ง์ด๊ทธ๋ ์ด์ ๊น์ง ํจ๊ป ์งํํ๊ฒ ๋์ด ๋น ๋ฅด๊ณ ๊ฐ๊ฒฐํ ๊ฐ๋ฐ ๊ฒฝํ๊น์ง ์ป์ ์ ์๊ฒ ๋์์ต๋๋ค.
์ฐธ๊ณ
Lerna is dead — Long Live Lerna
๋ชจ๋ ธ๋ ํฌ ์ ์ฉ๋ถํฐ yarn berry๊น์ง
๋ชจ๋ ํ๋ก ํธ์๋ ํ๋ก์ ํธ ๊ตฌ์ฑ ๊ธฐ๋ฒ - ๋ชจ๋ ธ๋ ํฌ ๊ฐ๋ ํธ
๋ชจ๋ ํ๋ก ํธ์๋ ํ๋ก์ ํธ ๊ตฌ์ฑ ๊ธฐ๋ฒ - ๋ชจ๋ ธ๋ ํฌ ๋๊ตฌ ํธ
๋ฒ๋ค๋ฌ ๋ง์ด๊ทธ๋ ์ด์ (Webpack to Vite)์ผ๋ก ๋น๋ ์๋ ๋์ด๊ธฐ
ํ์ํฌ ํฅ์์ ์ํ ๋ชจ๋ ธ๋ ํฌ(Monorepo) ์์คํ ๊ตฌ์ถ
'TECH' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ์ ์์ ์ ์ src์์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์๊น? (2) 2023.12.16 CSS์ ์ฐ์ ์์, CSS Cascading (0) 2023.09.04 ๋ฆฌ์กํธ ์ฟผ๋ฆฌ์ StaleTime๊ณผ CacheTime (0) 2023.01.24 [React] useMemo์ useCallback๋ก ๋ฆฌ์กํธ ๋ ๋๋ง ์ฑ๋ฅ ์ต์ ํํ๊ธฐ(Feat. React.memo) (0) 2022.04.09 [JavaScript] ๋ ๋์ ๋น๋๊ธฐ ํต์ (0) 2022.03.27 - ๋ ํฌ์งํ ๋ฆฌ์ ํ์์ ๋ชจ๋
ธ๋ ํฌ๋ณด๋ค๋ ๋ชจ๋๋ฆฌ์