νλ°νΈμλ λͺ¨λ Έλ ν¬ κ΄λ¦¬μ λν μ’ ν© κ°μ΄λ. μν¬μ€νμ΄μ€ κ΅¬μ± μ λ΅, λꡬ μ΅μ , νμ₯μ±κ³Ό νμ μ μν λͺ¨λ² μ¬λ‘λ₯Ό λ€λ£Ήλλ€.
νλ°νΈμλ λͺ¨λ Έλ ν¬ κ΄λ¦¬: μν¬μ€νμ΄μ€ ꡬμ±κ³Ό λꡬ
λμμμ΄ μ§ννλ νλ°νΈμλ κ°λ° νκ²½μμ νλ‘μ νΈκ° μ±μ₯ν¨μ λ°λΌ μ½λλ² μ΄μ€μ 볡μ‘μ±μ κ΄λ¦¬νλ κ²μ λ§€μ° μ€μν΄μ‘μ΅λλ€. μ¬λ¬ νλ‘μ νΈλ₯Ό λ¨μΌ 리ν¬μ§ν 리μμ κ΄λ¦¬νλ λͺ¨λ Έλ ν¬λ νλ°νΈμλ μ ν리μΌμ΄μ μ ꡬμ±νκ³ νμ₯νλ λ° ν¨κ³Όμ μΈ ν΄κ²°μ± μ μ 곡ν©λλ€. μ΄ μ’ ν© κ°μ΄λμμλ νλ°νΈμλ λͺ¨λ Έλ ν¬ κ΄λ¦¬, νΉν μν¬μ€νμ΄μ€ κ΅¬μ± μ λ΅κ³Ό κ°λ° μν¬νλ‘μ°λ₯Ό κ°μννλ κ°λ ₯ν λꡬμ λν΄ μμλ΄ λλ€.
λͺ¨λ Έλ ν¬λ 무μμΈκ°?
λͺ¨λ Έλ ν¬λ λͺ¨λ νλ‘μ νΈ, λΌμ΄λΈλ¬λ¦¬, μ»΄ν¬λνΈκ° λ¨μΌ 리ν¬μ§ν 리λ₯Ό 곡μ νλ μννΈμ¨μ΄ κ°λ° μ λ΅μ λλ€. μ΄λ κ° νλ‘μ νΈκ° μ체 리ν¬μ§ν 리λ₯Ό κ°λ ν΄λ¦¬λ ν¬(polyrepo) μ κ·Ό λ°©μκ³Ό λμ‘°λ©λλ€. ν΄λ¦¬λ ν¬λ μκ³ λ 립μ μΈ νλ‘μ νΈμ μ ν©νμ§λ§, λͺ¨λ Έλ ν¬λ ν¬κ³ μνΈ μ°κ²°λ μ½λλ² μ΄μ€λ₯Ό κ΄λ¦¬νλ λ° λ°μ΄λ©λλ€.
λͺ¨λ Έλ ν¬ μ¬μ©μ μ΄μ
- μ½λ 곡μ λ° μ¬μ¬μ©: λͺ¨λ Έλ ν¬ λ΄ μ¬λ¬ νλ‘μ νΈμμ μ»΄ν¬λνΈμ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ½κ² 곡μ νκ³ μ¬μ¬μ©ν μ μμ΅λλ€. μ΄λ μΌκ΄μ±μ λμ΄κ³ μ½λ μ€λ³΅μ μ€μ λλ€. μλ₯Ό λ€μ΄, λμμΈ μμ€ν μ»΄ν¬λνΈλ₯Ό ν κ³³μμ κ°λ°νμ¬ λͺ¨λ νλ°νΈμλ μ ν리μΌμ΄μ μμ μ¦μ μ¬μ©ν μ μμ΅λλ€.
- λ¨μνλ μμ‘΄μ± κ΄λ¦¬: μ€μμμ μμ‘΄μ±μ κ΄λ¦¬νμ¬ λͺ¨λ νλ‘μ νΈμμ μΌκ΄λ λ²μ μ μ μ§ν μ μμ΅λλ€. μ΄λ μμ‘΄μ± μΆ©λμ μ€μ΄κ³ μ λ°μ΄νΈλ₯Ό κ°μνν©λλ€.
- μμμ λ³κ²½(Atomic Changes): μ¬λ¬ νλ‘μ νΈμ κ±ΈμΉ λ³κ²½ μ¬νμ λ¨μΌ 컀λ°μΌλ‘ λ§λ€ μ μμ΅λλ€. μ΄λ 리ν©ν λ§μ λ¨μννκ³ κ΄λ ¨ λ³κ²½ μ¬νμ΄ νμ ν¨κ» λ°°ν¬λλλ‘ λ³΄μ₯ν©λλ€. μ¬λ¬ μ ν리μΌμ΄μ μμ μ¬μ©λλ ν΅μ¬ λ°μ΄ν° ꡬ쑰λ₯Ό μ λ°μ΄νΈνλ κ²½μ°λ₯Ό μμν΄ λ³΄μΈμ. λͺ¨λ Έλ ν¬λ λκΈ°νλ μ λ°μ΄νΈ νλ‘μΈμ€λ₯Ό μ©μ΄νκ² ν©λλ€.
- ν₯μλ νμ : μ 체 μ½λλ² μ΄μ€μ λν ν΅ν©λ λ·°λ₯Ό μ 곡νμ¬ κ°λ°μ κ°μ νμ μ μ¦μ§ν©λλ€. νμ μμ€ν μ λ€λ₯Έ λΆλΆλ€μ΄ μ΄λ»κ² μνΈ μμ©νλμ§ μ½κ² μ΄ν΄ν μ μμ΅λλ€.
- κ°μνλ λΉλ λ° λ°°ν¬: μ€μ μ§μ€μ λΉλ λ° λ°°ν¬ νλ‘μΈμ€λ₯Ό ꡬννμ¬ λ¦΄λ¦¬μ€ μ£ΌκΈ°λ₯Ό κ°μνν μ μμ΅λλ€. λꡬλ μμ‘΄μ± κ·Έλνλ₯Ό λΆμνμ¬ μ΅κ·Ό λ³κ²½ μ¬νμ μν₯μ λ°μ νλ‘μ νΈλ§ λΉλνκ³ λ°°ν¬ν μ μμ΅λλ€.
- ν₯μλ μ½λ κ°μμ±: μ 체 μ½λλ² μ΄μ€μ λν κ°μμ±μ λμ¬ νλ‘μ νΈλ₯Ό μ°Ύκ³ , μ΄ν΄νκ³ , κΈ°μ¬νκΈ° μ½κ² λ§λλλ€.
λͺ¨λ Έλ ν¬ μ¬μ©μ μ΄λ €μ
- 리ν¬μ§ν 리 ν¬κΈ°: λͺ¨λ Έλ ν¬λ λ§€μ° μ»€μ§ μ μμΌλ©°, ν΄λ‘ μ΄λ λΈλμΉκ³Ό κ°μ νΉμ μμ μ μ±λ₯μ μν₯μ μ€ μ μμ΅λλ€. μ€νμ€ μ²΄ν¬μμ(sparse checkout)κ³Ό κ°μ μ λ΅μΌλ‘ μ΄ λ¬Έμ λ₯Ό μνν μ μμ΅λλ€.
- λΉλ μκ°: μ΅μ νλμ§ μμ κ²½μ° μ 체 λͺ¨λ Έλ ν¬λ₯Ό λΉλνλ λ° μκ°μ΄ λ§μ΄ 걸릴 μ μμ΅λλ€. Nxλ Turborepoμ κ°μ λꡬλ λΉλ κ²°κ³Όλ¬Όμ μΊμ±νκ³ νμν κ²λ§ λ€μ λΉλνμ¬ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.
- λꡬμ 볡μ‘μ±: λͺ¨λ Έλ ν¬λ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ €λ©΄ μ λ¬Έμ μΈ λꡬμ μ μ μλ μν¬νλ‘μ°κ° νμν©λλ€. μ¬λ°λ₯Έ λꡬλ₯Ό μ ννκ³ μ¬λ°λ₯΄κ² ꡬμ±νλ κ²μ΄ μ€μν©λλ€.
- μ κ·Ό μ μ΄: λͺ¨λ Έλ ν¬μμ μΈλΆνλ μ κ·Ό μ μ΄λ₯Ό ꡬννλ κ²μ μ΄λ €μΈ μ μμΌλ©°, μ μ€ν κ³νκ³Ό ꡬμ±μ΄ νμν©λλ€.
μν¬μ€νμ΄μ€ κ΅¬μ± μ λ΅
νλ°νΈμλ λͺ¨λ Έλ ν¬λ₯Ό μ±κ³΅μ μΌλ‘ κ΄λ¦¬νλ ν΅μ¬μ λͺ ννκ³ μΌκ΄λ μν¬μ€νμ΄μ€ ꡬμ±μ ν립νλ λ° μμ΅λλ€. μ ꡬ쑰νλ μν¬μ€νμ΄μ€λ μ½λλ² μ΄μ€λ₯Ό νμνκ³ , νλ‘μ νΈ μμ‘΄μ±μ μ΄ν΄νλ©°, μ½λ νμ§μ μ μ§νκΈ° μ½κ² λ§λλλ€.
λλ ν 리 ꡬ쑰
νλ°νΈμλ λͺ¨λ Έλ ν¬μ μΌλ°μ μΈ λλ ν 리 ꡬ쑰λ μΌλ°μ μΌλ‘ λ€μμ ν¬ν¨ν©λλ€:
- /apps: λͺ¨λ Έλ ν¬ λ΄μ κ°λ³ μ ν리μΌμ΄μ μ ν¬ν¨ν©λλ€. κ° μ ν리μΌμ΄μ μ μ체 λλ ν 리λ₯Ό κ°μ ΈμΌ ν©λλ€. μ: `apps/web`, `apps/mobile`, `apps/admin`.
- /libs: μ¬λ¬ μ ν리μΌμ΄μ μμ 곡μ λλ μ¬μ¬μ© κ°λ₯ν λΌμ΄λΈλ¬λ¦¬ λ° μ»΄ν¬λνΈλ₯Ό ν¬ν¨ν©λλ€. λΌμ΄λΈλ¬λ¦¬λ κΈ°λ₯μ΄λ λλ©μΈλ³λ‘ ꡬμ±λμ΄μΌ ν©λλ€. μ: `libs/ui`, `libs/data-access`, `libs/api`.
- /tools: λͺ¨λ Έλ ν¬λ₯Ό λΉλ, ν μ€νΈ, λ°°ν¬νλ λ° μ¬μ©λλ μ€ν¬λ¦½νΈμ μ νΈλ¦¬ν°λ₯Ό ν¬ν¨ν©λλ€.
- /docs: λͺ¨λ Έλ ν¬μ κ·Έ νλ‘μ νΈμ λν λ¬Έμλ₯Ό ν¬ν¨ν©λλ€.
- /config: λͺ¨λ Έλ ν¬ λ΄μμ μ¬μ©λλ λ€μν λꡬ λ° μλΉμ€(μ: ESLint, Prettier, Jest)μ κ΅¬μ± νμΌμ ν¬ν¨ν©λλ€.
μμ:
my-monorepo/ βββ apps/ β βββ web/ β β βββ src/ β β β βββ components/ β β β βββ app.tsx β β β βββ ... β β βββ package.json β β βββ ... β βββ mobile/ β β βββ src/ β β β βββ components/ β β β βββ app.tsx β β β βββ ... β β βββ package.json β β βββ ... β βββ admin/ β βββ ... βββ libs/ β βββ ui/ β β βββ src/ β β β βββ button.tsx β β β βββ ... β β βββ package.json β β βββ ... β βββ data-access/ β β βββ src/ β β β βββ api.ts β β β βββ ... β β βββ package.json β β βββ ... β βββ utils/ β βββ ... βββ tools/ β βββ scripts/ β βββ ... βββ package.json βββ ...
μ½λ μμ κΆ λ° ν ꡬ쑰
λͺ¨λ Έλ ν¬ λ΄μμ λͺ νν μ½λ μμ κΆκ³Ό μ± μμ ν립νμΈμ. μ½λλ² μ΄μ€μ νΉμ λΆλΆμ μ μ§ κ΄λ¦¬ν μ± μμ΄ μλ νμ΄λ κ°μΈμ μ μν©λλ€. μ΄λ μ± μκ°μ λμ΄κ³ μΆ©λμ μ€μ λλ€.
μλ₯Ό λ€μ΄, `libs/ui` λΌμ΄λΈλ¬λ¦¬λ₯Ό μ μ§ κ΄λ¦¬νλ μ λ΄ νμ΄ μκ³ , λ€λ₯Έ νλ€μ `apps` λλ ν 리μ κ°λ³ μ ν리μΌμ΄μ μ μ± μμ§ μ μμ΅λλ€.
λ²μ κ΄λ¦¬ μ λ΅
λͺ¨λ Έλ ν¬ λ΄μ λͺ¨λ νλ‘μ νΈμ λΌμ΄λΈλ¬λ¦¬μ λν΄ μΌκ΄λ λ²μ κ΄λ¦¬ μ λ΅μ μ ννμΈμ. λ³κ²½ μ¬νμ μ±κ²©μ λͺ ννκ² μ λ¬νκΈ° μν΄ μλ§¨ν± λ²μ λ(SemVer) μ¬μ©μ κ³ λ €νμμμ€.
Lernaμ κ°μ λꡬλ μ»€λ° νμ€ν 리λ₯Ό λΆμνμ¬ μ λ°μ΄νΈκ° νμν ν¨ν€μ§λ₯Ό κ²°μ ν¨μΌλ‘μ¨ λ²μ κ΄λ¦¬ νλ‘μΈμ€λ₯Ό μλνν μ μμ΅λλ€.
μμ‘΄μ± κ΄λ¦¬
λͺ¨λ Έλ ν¬ λ΄ λͺ¨λ νλ‘μ νΈμ μμ‘΄μ±μ μ μ€νκ² κ΄λ¦¬νμΈμ. λΆνμν μμ‘΄μ±μ νΌνκ³ μΆ©λμ λ°©μ§νκΈ° μν΄ μμ‘΄μ± λ²μ μ μΌκ΄λκ² μ μ§νμΈμ. μμ‘΄μ± μ€μΉ λ° κ΄λ¦¬λ₯Ό μ΅μ ννκΈ° μν΄ μν¬μ€νμ΄μ€ κΈ°λ₯μ μ§μνλ ν¨ν€μ§ λ§€λμ (μ: pnpm, Yarn)λ₯Ό μ¬μ©νμΈμ.
νλ°νΈμλ λͺ¨λ Έλ ν¬ λꡬ
νλ°νΈμλ λͺ¨λ Έλ ν¬λ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νλ λ° λμμ΄ λλ λͺ κ°μ§ κ°λ ₯ν λκ΅¬κ° μμ΅λλ€. μ΄λ¬ν λꡬλ μμ‘΄μ± κ΄λ¦¬, μμ μ€ν, λΉλ μ΅μ ν λ° μ½λ μμ±κ³Ό κ°μ κΈ°λ₯μ μ 곡ν©λλ€.
ν¨ν€μ§ λ§€λμ : pnpm, Yarn, npm
pnpm (Performant npm): pnpmμ μ½ν μΈ μ£Όμ μ§μ νμΌ μμ€ν μ μ¬μ©νμ¬ ν¨ν€μ§λ₯Ό μ μ₯νλ λΉ λ₯΄κ³ ν¨μ¨μ μΈ ν¨ν€μ§ λ§€λμ μ λλ€. μ΄λ λμ€ν¬ κ³΅κ° μ¬μ©λμ μ€μ΄κ³ μ€μΉ μκ°μ κ°μ ν©λλ€. pnpmμ λν μν¬μ€νμ΄μ€λ₯Ό κΈ°λ³Έμ μΌλ‘ μ§μνμ¬ λͺ¨λ Έλ ν¬ κ΄λ¦¬μ μ΄μμ μ λλ€. λΉνν(non-flat) `node_modules` ν΄λλ₯Ό μμ±νμ¬ μ λ Ή μμ‘΄μ±(phantom dependencies)μ λ°©μ§ν©λλ€.
Yarn: Yarnμ μν¬μ€νμ΄μ€λ₯Ό μ§μνλ λ λ€λ₯Έ μΈκΈ° μλ ν¨ν€μ§ λ§€λμ μ λλ€. Yarn μν¬μ€νμ΄μ€λ₯Ό μ¬μ©νλ©΄ λ¨μΌ `yarn.lock` νμΌμμ μ¬λ¬ νλ‘μ νΈμ μμ‘΄μ±μ κ΄λ¦¬ν μ μμ΅λλ€. λΉ λ₯΄κ³ μμ μ μΈ μμ‘΄μ± μ€μΉλ₯Ό μ 곡ν©λλ€.
npm: npmλ λ²μ 7λΆν° μν¬μ€νμ΄μ€λ₯Ό μ§μν©λλ€. μλΉν κ°μ μ΄ μμμ§λ§, μ±λ₯κ³Ό κΈ°λ₯ λλ¬Έμ μΌλ°μ μΌλ‘ λͺ¨λ Έλ ν¬ κ΄λ¦¬μλ pnpmκ³Ό Yarnμ΄ μ νΈλ©λλ€.
μμ: pnpm μν¬μ€νμ΄μ€ μ€μ νκΈ°
λͺ¨λ Έλ ν¬μ 루νΈμ `pnpm-workspace.yaml` νμΌμ λ§λμΈμ:
packages: - 'apps/*' - 'libs/*'
μ΄λ pnpmμκ² `apps`μ `libs` μλμ λͺ¨λ λλ ν 리λ₯Ό μν¬μ€νμ΄μ€ λ΄μ ν¨ν€μ§λ‘ μ·¨κΈνλλ‘ μ§μν©λλ€.
νμ€ν¬ λ¬λ: Nx, Turborepo
Nx: Nxλ μ΅μκΈ λͺ¨λ Έλ ν¬ μ§μμ μ 곡νλ κ°λ ₯ν λΉλ μμ€ν μ λλ€. μ¦λΆ λΉλ, μΊμ±, μμ‘΄μ± κ·Έλν μκ°νμ κ°μ κΈ°λ₯μ μ 곡ν©λλ€. Nxλ λͺ¨λ Έλ ν¬μ μμ‘΄μ± κ·Έλνλ₯Ό λΆμνμ¬ μ΅κ·Ό λ³κ²½ μ¬νμ μν₯μ λ°μ νλ‘μ νΈλ§ λΉλνκ³ ν μ€νΈν μ μμ΅λλ€. Nxλ λν μλ‘μ΄ νλ‘μ νΈμ μ»΄ν¬λνΈλ₯Ό λΉ λ₯΄κ² μμ±νλ μ½λ μμ± λꡬλ₯Ό μ 곡ν©λλ€.
Turborepo: Turborepoλ λͺ¨λ Έλ ν¬λ₯Ό μν΄ νΉλ³ν μ€κ³λ λ λ€λ₯Έ μΈκΈ° μλ λΉλ λꡬμ λλ€. λΉλ κ²°κ³Όλ¬Όμ μΊμ±νκ³ νμν κ²λ§ λ€μ λΉλν¨μΌλ‘μ¨ μλμ ν¨μ¨μ±μ μ€μ μ λ‘λλ€. Turborepoλ μ€μ μ΄ μ½κ³ κΈ°μ‘΄ μν¬νλ‘μ°μ ν΅ν©νκΈ° μ’μ΅λλ€.
μμ: Nxλ₯Ό μ¬μ©νμ¬ μμ μ€ννκΈ°
Nx μ€μΉ:
npm install -g nx
Nx μν¬μ€νμ΄μ€ μμ±:
nx create-nx-workspace my-monorepo
Nxλ λΉλ, ν μ€νΈ, λ¦°ν μ μν μ¬μ ꡬμ±λ μμ κ³Ό ν¨κ» κΈ°λ³Έ μν¬μ€νμ΄μ€ ꡬ쑰λ₯Ό μμ±ν©λλ€.
Lerna: λ²μ κ΄λ¦¬ λ° κ²μ
Lernaλ μ¬λ¬ ν¨ν€μ§λ₯Ό κ°μ§ μλ°μ€ν¬λ¦½νΈ νλ‘μ νΈλ₯Ό κ΄λ¦¬νλ λꡬμ λλ€. λͺ¨λ Έλ ν¬μμ ν¨ν€μ§μ λ²μ κ΄λ¦¬, κ²μ λ° λ¦΄λ¦¬μ€ νλ‘μΈμ€λ₯Ό μλνν©λλ€. Lernaλ μ»€λ° νμ€ν 리λ₯Ό λΆμνκ³ λ³κ²½ μ¬νμ λ°λΌ μ λ°μ΄νΈκ° νμν ν¨ν€μ§λ₯Ό κ²°μ ν©λλ€.
μμ: Lernaλ₯Ό μ¬μ©νμ¬ ν¨ν€μ§ λ²μ κ΄λ¦¬ λ° κ²μνκΈ°
Lerna μ€μΉ:
npm install -g lerna
Lerna μ΄κΈ°ν:
lerna init
μ»€λ° λ©μμ§(Conventional Commits νμ€ μ€μ)μ λ°λΌ ν¨ν€μ§ λ²μ μ μλμΌλ‘ μ λ°μ΄νΈνλ €λ©΄ Lerna versionμ μ€ννμΈμ:
lerna version
μ λ°μ΄νΈλ ν¨ν€μ§λ₯Ό npmμ κ²μνλ €λ©΄ Lerna publishλ₯Ό μ€ννμΈμ:
lerna publish from-package
λΉλ μμ€ν : Webpack, Rollup, esbuild
νλ°νΈμλ λͺ¨λ Έλ ν¬μμ λΉλ μκ°κ³Ό λ²λ€ ν¬κΈ°λ₯Ό μ΅μ ννλ €λ©΄ μ¬λ°λ₯Έ λΉλ μμ€ν μ μ ννλ κ²μ΄ μ€μν©λλ€.
Webpack: Webpackμ μ½λ λΆν , λͺ¨λ λ²λ€λ§, μ μ κ΄λ¦¬ λ± λ€μν κΈ°λ₯μ μ§μνλ κ°λ ₯νκ³ λ€μ¬λ€λ₯ν λΉλ μμ€ν μ λλ€. Webpackμ κ΅¬μ± κ°λ₯μ±μ΄ λμ λͺ¨λ Έλ ν¬μ νΉμ μꡬ μ¬νμ λ§κ² μ¬μ©μ μ μν μ μμ΅λλ€.
Rollup: Rollupμ λΌμ΄λΈλ¬λ¦¬ λ° μ ν리μΌμ΄μ μ μν κ³ λλ‘ μ΅μ νλ λ²λ€μ μμ±νλ λ° μ€μ μ λ λͺ¨λ λ²λ€λ¬μ λλ€. Rollupμ νΉν λ€λ₯Έ νλ‘μ νΈμμ μλΉλ λΌμ΄λΈλ¬λ¦¬λ₯Ό λΉλνλ λ° μ ν©ν©λλ€.
esbuild: esbuildλ Goλ‘ μμ±λ λ§€μ° λΉ λ₯Έ μλ°μ€ν¬λ¦½νΈ λ²λ€λ¬ λ° μΆμκΈ°μ λλ€. esbuildλ Webpackκ³Ό Rollupλ³΄λ€ ν¨μ¬ λΉ λ₯΄λ―λ‘ λΉλ μ±λ₯μ΄ μ€μν νλ‘μ νΈμ μ’μ μ νμ λλ€.
λ¦°ν λ° ν¬λ§·ν : ESLint, Prettier
λ¦°ν λ° ν¬λ§·ν λꡬλ₯Ό μ¬μ©νμ¬ λͺ¨λ Έλ ν¬ μ λ°μ κ±Έμ³ μΌκ΄λ μ½λ μ€νμΌκ³Ό νμ§μ κ°μ νμΈμ.
ESLint: ESLintλ μ½λμμ λ°κ²¬λ λ¬Έμ μλ ν¨ν΄μ μλ³νκ³ λ³΄κ³ νλ μλ°μ€ν¬λ¦½νΈ λ¦°ν°μ λλ€. ESLintλ νΉμ μ½λ© νμ€κ³Ό λͺ¨λ² μ¬λ‘λ₯Ό κ°μ νλλ‘ κ΅¬μ±ν μ μμ΅λλ€.
Prettier: Prettierλ μ½λλ₯Ό μΌκ΄λ μ€νμΌλ‘ μλ ν¬λ§·νλ λ μ μ μΈ(opinionated) μ½λ ν¬λ§·ν°μ λλ€. Prettierλ ESLintμ ν΅ν©νμ¬ ν¬λ§·ν λ¬Έμ λ₯Ό μλμΌλ‘ μμ ν μ μμ΅λλ€.
μμ: ESLint λ° Prettier ꡬμ±νκΈ°
ESLint λ° Prettier μ€μΉ:
npm install eslint prettier --save-dev
ESLint κ΅¬μ± νμΌ(`.eslintrc.js`) μμ±:
module.exports = {
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
'prettier'
],
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
root: true,
rules: {
// Add your custom rules here
}
};
Prettier κ΅¬μ± νμΌ(`.prettierrc.js`) μμ±:
module.exports = {
semi: false,
singleQuote: true,
trailingComma: 'all'
};
CI/CD ν΅ν©
λΉλ, ν μ€νΈ, λ°°ν¬λ₯Ό μλννκΈ° μν΄ λͺ¨λ Έλ ν¬λ₯Ό CI/CD νμ΄νλΌμΈκ³Ό ν΅ν©νμΈμ. GitHub Actions, GitLab CI λλ Jenkinsμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ κ°λ° νλ‘μΈμ€μ κ° λ¨κ³μ λν μν¬νλ‘μ°λ₯Ό μ μνμΈμ.
μ΅κ·Ό λ³κ²½ μ¬νμ μν₯μ λ°μ νλ‘μ νΈλ§ λΉλνκ³ ν μ€νΈνλλ‘ CI/CD νμ΄νλΌμΈμ ꡬμ±νμΈμ. μ΄λ λΉλ μκ°μ ν¬κ² μ€μ΄κ³ νμ΄νλΌμΈμ ν¨μ¨μ±μ ν₯μμν¬ μ μμ΅λλ€.
νλ°νΈμλ λͺ¨λ Έλ ν¬ κ΄λ¦¬λ₯Ό μν λͺ¨λ² μ¬λ‘
- λͺ νν κ°μ΄λλΌμΈ μ립: μ½λ μ€νμΌ, λλ ν 리 ꡬ쑰 λ° μμ‘΄μ± κ΄λ¦¬μ λν λͺ νν κ°μ΄λλΌμΈκ³Ό κ·μΉμ μ μνμΈμ.
- λͺ¨λ κ² μλν: λΉλ, ν μ€νΈ, λ¦°ν , ν¬λ§·ν , λ°°ν¬ λ± κ°λ° νλ‘μΈμ€μ κ°λ₯ν λ§μ λΆλΆμ μλννμΈμ.
- μ½λ 리뷰 μ¬μ©: λͺ¨λ Έλ ν¬ μ λ°μ κ±Έμ³ μ½λ νμ§κ³Ό μΌκ΄μ±μ 보μ₯νκΈ° μν΄ μ½λ 리뷰λ₯Ό μννμΈμ.
- μ±λ₯ λͺ¨λν°λ§: λͺ¨λ Έλ ν¬μ μ±λ₯μ λͺ¨λν°λ§νκ³ κ°μ ν λΆλΆμ μλ³νμΈμ.
- λͺ¨λ κ² λ¬Έμν: κ°λ°μκ° νλ‘μ νΈλ₯Ό μ΄ν΄νκ³ κΈ°μ¬νλ λ° λμμ΄ λλλ‘ λͺ¨λ Έλ ν¬ μν€ν μ², λꡬ λ° μν¬νλ‘μ°λ₯Ό λ¬ΈμννμΈμ.
- μ΅μ μμ‘΄μ± μ μ§: λ²κ·Έ μμ , 보μ ν¨μΉ, μ±λ₯ κ°μ μ μ΄μ μ λ리기 μν΄ μ κΈ°μ μΌλ‘ μμ‘΄μ±μ μ λ°μ΄νΈνμΈμ.
- Conventional Commits μ±ν: Conventional Commitsλ₯Ό μ¬μ©νλ©΄ λ²μ κ΄λ¦¬λ₯Ό μλννκ³ λ¦΄λ¦¬μ€ λ ΈνΈλ₯Ό μμ±νλ λ° λμμ΄ λ©λλ€.
- κΈ°λ₯ νλκ·Έ μμ€ν ꡬν: κΈ°λ₯ νλκ·Έ μμ€ν μ μ¬μ©νλ©΄ μ¬μ©μ μΌλΆμκ² μλ‘μ΄ κΈ°λ₯μ 릴리μ€νμ¬ νλ‘λμ νκ²½μμ ν μ€νΈνκ³ λΉ λ₯΄κ² λ°λ³΅ν μ μμ΅λλ€.
κ²°λ‘
νλ°νΈμλ λͺ¨λ Έλ ν¬ κ΄λ¦¬λ ν¬κ³ 볡μ‘ν νλ‘μ νΈμ μλΉν μ΄μ μ μ 곡νλ©°, μ½λ 곡μ , λ¨μνλ μμ‘΄μ± κ΄λ¦¬, ν₯μλ νμ μ κ°λ₯νκ² ν©λλ€. μ μ μλ μν¬μ€νμ΄μ€ κ΅¬μ± μ λ΅μ μ±ννκ³ κ°λ ₯ν λꡬλ₯Ό νμ©ν¨μΌλ‘μ¨ κ°λ°μλ μν¬νλ‘μ°λ₯Ό κ°μννκ³ λΉλ μκ°μ μ΅μ ννλ©° μ½λ νμ§μ 보μ₯ν μ μμ΅λλ€. μ΄λ €μμ΄ μ‘΄μ¬νμ§λ§, μ κ΄λ¦¬λ λͺ¨λ Έλ ν¬μ μ΄μ μ λΉμ©μ ν¨μ¬ λ₯κ°νλ―λ‘ νλ νλ°νΈμλ κ°λ°μ μμ΄ κ°μΉ μλ μ κ·Ό λ°©μμ λλ€.