λ¦°ν λ° ν¬λ§·ν μ ν΅ν΄ νλ‘ νΈμλ μ½λ νμ§μ ν₯μμν€μΈμ. μ½λ μ€νμΌ μ μ©μ μλννκ³ , μ μΈκ³ κ°λ°νμμ μΌκ΄λκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μ½λλ₯Ό 보μ₯νλ λ°©λ²μ μμ보μΈμ.
νλ‘ νΈμλ μ½λ νμ§: μΌκ΄λ κ°λ°μ μν λ¦°ν λ° ν¬λ§·ν
λΉ λ₯΄κ² λ³ννλ νλ‘ νΈμλ κ°λ° μΈκ³μμ κΈ°λ₯μ μΈ μ½λλ₯Ό λΉ λ₯΄κ² μ 곡νλ κ²μ΄ μ°μ μλλ κ²½μ°κ° λ§μ΅λλ€. κ·Έλ¬λ μ½λ νμ§μ μνν νλ©΄ μ¬λ¬ κ°μ§ λ¬Έμ κ° λ°μν μ μμ΅λλ€. μ΄λ¬ν λ¬Έμ μλ μ μ§ κ΄λ¦¬ λΉμ© μ¦κ°, ν μμ°μ± κ°μ, κ°λ°μ κ²½ν μ ν λ±μ΄ μμ΅λλ€. κ³ νμ§ νλ‘ νΈμλ μ½λμ μ΄μμ μΌκ΄λ μ€νμΌκ³Ό λͺ¨λ² μ¬λ‘ μ€μμ΄λ©°, μ΄λ λ¦°ν λ° ν¬λ§·ν λꡬλ₯Ό ν΅ν΄ ν¨κ³Όμ μΌλ‘ λ¬μ±ν μ μμ΅λλ€. μ΄ κΈ°μ¬μμλ νλ‘ νΈμλ νλ‘μ νΈμμ λ¦°ν λ° ν¬λ§·ν μ μ΄ν΄νκ³ κ΅¬ννκΈ° μν ν¬κ΄μ μΈ κ°μ΄λλ₯Ό μ 곡νμ¬, μ μΈκ³μ μΌλ‘ λΆμ°λ νμμ μΌκ΄λκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μ½λλ² μ΄μ€λ₯Ό 보μ₯ν©λλ€.
νλ‘ νΈμλ μ½λ νμ§μ΄ μ€μν μ΄μ λ 무μμΌκΉμ?
λ¦°ν λ° ν¬λ§·ν μ ꡬ체μ μΈ λ΄μ©μ λ€μ΄κ°κΈ° μ μ νλ‘ νΈμλ μ½λ νμ§μ΄ μ κ·Έλ κ² μ€μνμ§ μ΄ν΄λ³΄κ² μ΅λλ€.
- μ μ§ κ΄λ¦¬ μ©μ΄μ±: κΉ¨λνκ³ μ ν¬λ§·λ μ½λλ μ΄ν΄νκ³ μμ νκΈ° μ¬μ°λ―λ‘ μ μ§ κ΄λ¦¬κ° κ°μνλκ³ μ λ°μ΄νΈ μ€ λ²κ·Έ λ°μ μνμ΄ μ€μ΄λλλ€. μΈλ λ°©κ°λ‘λ₯΄μ κ°λ°μκ° μκ΅ λ°λμ λλ£κ° μμ±ν μ½λλ₯Ό μ½κ² μ΄ν΄νλ€κ³ μμν΄ λ³΄μΈμ.
- κ°λ μ±: μΌκ΄λ μ½λ© μ€νμΌμ κ°λ μ±μ ν₯μμμΌ κ°λ°μκ° μ½λμ λ Όλ¦¬μ λͺ©μ μ λΉ λ₯΄κ² νμ ν μ μλλ‘ ν©λλ€. μ΄λ μλ‘μ΄ νμμ μ¨λ³΄λ©νκ±°λ μμ°¨μ λλ₯μ λμ΄ νλ‘μ νΈμμ νμ ν λ νΉν μ€μν©λλ€.
- νμ : νμ€νλ μ½λ μ€νμΌμ νμ κΈ°λ³Έ μ€μ μ λν μ£Όκ΄μ μΈ λ Όμμ μμ κ³ κ°λ° ν λ΄μμ μνν νμ μ μ΄μ§ν©λλ€. μ΄λ λλ©΄ μμ¬ μν΅μ΄ μ νλ μ μλ λΆμ°λ νμ λ§€μ° μ€μν©λλ€.
- μ€λ₯ κ°μ: λ¦°ν°λ λ°νμ μ μ μ μ¬μ μΈ μ€λ₯μ μν° ν¨ν΄μ μλ³νμ¬ λ²κ·Έλ₯Ό λ°©μ§νκ³ μ ν리μΌμ΄μ μ μ λ°μ μΈ μμ μ±μ ν₯μμν¬ μ μμ΅λλ€. κ°λ¨ν ꡬ문 μ€λ₯λ₯Ό μ‘°κΈ°μ λ°κ²¬νλ©΄ λλ²κΉ μκ°μ μ μ½ν μ μμ΅λλ€.
- μ±λ₯ ν₯μ: νμ μ§μ μ μΈ κ΄λ ¨μ±μ μμ§λ§ μ½λ νμ§ κ΄νμ μ’ μ’ λ³΄λ€ ν¨μ¨μ μ΄κ³ μ΅μ νλ μ½λλ₯Ό μμ±νλλ‘ μ₯λ €νμ¬ μ ν리μΌμ΄μ μ±λ₯μ ν₯μμν΅λλ€.
- μ¨λ³΄λ© ν¨μ¨μ±: μλ‘μ΄ νμμ μΌκ΄λ μ€νμΌμ΄ μ μ©λλ©΄ μ½λλ² μ΄μ€μ λΉ λ₯΄κ² μ μν μ μμ΅λλ€. μ΄λ νμ΅ κ³‘μ μ μ€μ¬ λ 빨리 ν¨κ³Όμ μΌλ‘ κΈ°μ¬ν μ μλλ‘ ν©λλ€.
- μ§μ 곡μ : νμ€νλ μ½λλ₯Ό μ¬μ©νλ©΄ νλ‘μ νΈ λ° ν μ 체μμ μ½λ μ€λν«κ³Ό λΌμ΄λΈλ¬λ¦¬λ₯Ό λ μ 곡μ ν μ μμ΅λλ€.
λ¦°ν λ° ν¬λ§·ν μ΄λ 무μμΌκΉμ?
λ¦°ν λ° ν¬λ§·ν μ μ½λ νμ§μ κΈ°μ¬νλ λ κ°μ λ³κ°μ΄μ§λ§ μνΈ λ³΄μμ μΈ νλ‘μΈμ€μ λλ€.
λ¦°ν
λ¦°ν μ μ μ¬μ μΈ μ€λ₯, μ€νμΌ μλ° λ° μμ¬μ€λ¬μ΄ ꡬ문μ μν΄ μ½λλ₯Ό λΆμνλ νλ‘μΈμ€μ λλ€. λ¦°ν°λ 미리 μ μλ κ·μΉμ μ¬μ©νμ¬ ν립λ λͺ¨λ² μ¬λ‘ λ° μ½λ© κ·μΉμμ λ²μ΄λλ λΆλΆμ μλ³ν©λλ€. λ€μκ³Ό κ°μ κ΄λ²μν λ¬Έμ λ₯Ό κ°μ§ν μ μμ΅λλ€.
- ꡬ문 μ€λ₯
- μ μΈλμ§ μμ λ³μ
- μ¬μ©νμ§ μλ λ³μ
- μ μ¬μ μΈ λ³΄μ μ·¨μ½μ
- μ€νμΌ μλ°(μ: μΌκ΄μ± μλ λ€μ¬μ°κΈ°, λͺ λͺ κ·μΉ)
- μ½λ 볡μ‘μ± λ¬Έμ
λ리 μ¬μ©λλ νλ‘ νΈμλ λ¦°ν°λ λ€μκ³Ό κ°μ΅λλ€.
- ESLint: κ΄λ²μν μ¬μ©μ μ§μ λ° νλ¬κ·ΈμΈ μ§μμ μ 곡νλ JavaScript λ° JSXμ©μΌλ‘ λ리 μ¬μ©λλ λ¦°ν°μ λλ€. κ³ λλ‘ κ΅¬μ± κ°λ₯νλ©° λ€μν μ½λ© μ€νμΌμ μ μ©ν μ μμ΅λλ€.
- Stylelint: μΌκ΄λ μ€νμΌλ§κ³Ό λͺ¨λ² μ¬λ‘ μ€μλ₯Ό 보μ₯νλ CSS, SCSS λ° κΈ°ν μ€νμΌλ§ μΈμ΄μ© κ°λ ₯ν λ¦°ν°μ λλ€.
- HTMLHint: ꡬ쑰μ λ¬Έμ μ μ κ·Όμ± λ¬Έμ λ₯Ό μλ³νλ λ° λμμ΄ λλ HTMLμ© λ¦°ν°μ λλ€.
ν¬λ§·ν
ν¬λ§·ν (μ½λ λ―ΈνλΌκ³ λ ν¨)μ 미리 μ μλ νμ€μ λ§κ² μ½λμ λ μ΄μμκ³Ό μ€νμΌμ μλμΌλ‘ μ‘°μ νλ νλ‘μΈμ€μ λλ€. ν¬λ§·ν°λ λ€μκ³Ό κ°μ μΈ‘λ©΄μ μ²λ¦¬ν©λλ€.
- λ€μ¬μ°κΈ°
- μ€ κ°κ²©
- μ€ λ°κΏ
- λ°μ΄ν μ€νμΌ
- μΈλ―Έμ½λ‘ μ¬μ©
λ리 μ¬μ©λλ νλ‘ νΈμλ ν¬λ§·ν°λ λ€μκ³Ό κ°μ΅λλ€.
- Prettier: JavaScript, TypeScript, CSS, HTML λ° JSONμ ν¬ν¨ν κ΄λ²μν μΈμ΄λ₯Ό μ§μνλ λ λ¨μ μΈ μ½λ ν¬λ§·ν°μ λλ€. Prettierλ μ¬μ μ μλ μ€νμΌμ λ§κ² μ½λλ₯Ό μλμΌλ‘ λ€μ ν¬λ§·νμ¬ μ£Όκ΄μ μΈ ν¬λ§·ν λ Όμμ μμ±λλ€.
νλ‘ νΈμλ νλ‘μ νΈλ₯Ό μν΄ ESLint λ° Prettier μ€μ νκΈ°
μ νμ μΈ νλ‘ νΈμλ νλ‘μ νΈμμ ESLint λ° Prettierλ₯Ό μ€μ νλ κ³Όμ μ μ΄ν΄λ³΄κ² μ΅λλ€. JavaScript/React νλ‘μ νΈμ μ€μ μ λκ² μ§λ§, μμΉμ λ€λ₯Έ νλ μμν¬μ μΈμ΄μλ μ μ©λ©λλ€.
μ¬μ μꡬ μ¬ν
- Node.js λ° npm(λλ yarn) μ€μΉ
- νλ‘ νΈμλ νλ‘μ νΈ(μ: React μ ν리μΌμ΄μ )
μ€μΉ
λ¨Όμ ESLint, Prettier λ° νμν νλ¬κ·ΈμΈμ κ°λ° μ’ μμ±μΌλ‘ μ€μΉν©λλ€.
npm install eslint prettier eslint-plugin-react eslint-plugin-react-hooks eslint-config-prettier --save-dev
ν¨ν€μ§ μ€λͺ :
- eslint: ν΅μ¬ ESLint λΌμ΄λΈλ¬λ¦¬.
- prettier: Prettier μ½λ ν¬λ§·ν°.
- eslint-plugin-react: React κ°λ°κ³Ό κ΄λ ¨λ ESLint κ·μΉ.
- eslint-plugin-react-hooks: React Hooks λͺ¨λ² μ¬λ‘λ₯Ό μ μ©νκΈ° μν ESLint κ·μΉ.
- eslint-config-prettier: Prettierμ μΆ©λνλ ESLint κ·μΉμ λΉνμ±νν©λλ€.
ꡬμ±
νλ‘μ νΈ λ£¨νΈμ ESLint κ΅¬μ± νμΌ(.eslintrc.js λλ .eslintrc.json)μ λ§λλλ€. λ€μμ μν ꡬμ±μ λλ€.
module.exports = {
env: {
browser: true,
es2021: true,
node: true,
},
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react-hooks/recommended',
'prettier',
],
parserOptions: {
ecmaFeatures: {
jsx: true,
},
ecmaVersion: 'latest',
sourceType: 'module',
},
plugins: [
'react',
],
rules: {
'react/react-in-jsx-scope': 'off',
},
};
μ΄ κ΅¬μ±μ μ£Όμ μΈ‘λ©΄:
env
: μ½λκ° μ€νλ νκ²½(λΈλΌμ°μ , Node.js, ES2021)μ μ μν©λλ€.extends
: μμν 미리 μ μλ κ΅¬μ± μΈνΈλ₯Ό μ§μ ν©λλ€.eslint:recommended
: κΆμ₯λλ ESLint κ·μΉ μ§ν©μ νμ±νν©λλ€.plugin:react/recommended
: Reactμ κΆμ₯λλ ESLint κ·μΉμ νμ±νν©λλ€.plugin:react-hooks/recommended
: React Hooksμ κΆμ₯λλ ESLint κ·μΉμ νμ±νν©λλ€.prettier
: Prettierμ μΆ©λνλ ESLint κ·μΉμ λΉνμ±νν©λλ€.parserOptions
: ESLintμμ μ¬μ©νλ JavaScript νμλ₯Ό ꡬμ±ν©λλ€.plugins
: μ¬μ©ν νλ¬κ·ΈμΈ λͺ©λ‘μ μ§μ ν©λλ€.rules
: κ°λ³ ESLint κ·μΉμ μ¬μ©μ μ§μ ν μ μμ΅λλ€. μ΄ μμμλ μ΅μ React νλ‘μ νΈμμ λͺ¨λ μ»΄ν¬λνΈ νμΌμ Reactλ₯Ό κ°μ Έμ¬ νμκ° μμΌλ―λ‘ `react/react-in-jsx-scope` κ·μΉμ λΉνμ±ννκ³ μμ΅λλ€.
νλ‘μ νΈ λ£¨νΈμ Prettier κ΅¬μ± νμΌ(.prettierrc.js, .prettierrc.json λλ .prettierrc.yaml)μ λ§λλλ€. λ€μμ μν ꡬμ±μ λλ€.
module.exports = {
semi: false,
trailingComma: 'all',
singleQuote: true,
printWidth: 120,
tabWidth: 2,
};
μ΄ κ΅¬μ±μ λ€μκ³Ό κ°μ Prettier μ΅μ μ μ§μ ν©λλ€.
semi
: λ¬Έμ₯ λμ μΈλ―Έμ½λ‘ μ μΆκ°ν μ§ μ¬λΆ(`false`λ μΈλ―Έμ½λ‘ μμ).trailingComma
: μ¬λ¬ μ€μ κ°μ²΄ λ° λ°°μ΄μ νν μΌνλ₯Ό μΆκ°ν μ§ μ¬λΆ(`all`μ κ°λ₯ν κ²½μ° μΆκ°).singleQuote
: λ¬Έμμ΄μ λν΄ ν°λ°μ΄ν λμ μμλ°μ΄νλ₯Ό μ¬μ©ν μ§ μ¬λΆ.printWidth
: Prettierκ° μ½λλ₯Ό λννκΈ° μ μ μ΅λ μ€ κΈΈμ΄.tabWidth
: λ€μ¬μ°κΈ°μ μ¬μ©ν 곡백 μ.
μ νΈνλ μ½λ© μ€νμΌμ λ§κ² μ΄λ¬ν μ΅μ μ μ¬μ©μ μ§μ ν μ μμ΅λλ€. μ¬μ© κ°λ₯ν λͺ¨λ μ΅μ λͺ©λ‘μ Prettier μ€λͺ μλ₯Ό μ°Έμ‘°νμΈμ.
IDEμ ν΅ν©νκΈ°
ESLint λ° Prettierλ₯Ό μ΅λν νμ©νλ €λ©΄ IDEμ ν΅ν©νμΈμ. κ°μ₯ μΈκΈ° μλ IDE(μ: VS Code, WebStorm, Sublime Text)μλ μ λ ₯νλ λλ‘ μ€μκ° λ¦°ν λ° ν¬λ§·ν μ μ 곡νλ νμ₯ λλ νλ¬κ·ΈμΈμ΄ μμ΅λλ€. μλ₯Ό λ€μ΄ VS Codeλ μ μ₯ μ μ½λλ₯Ό μλμΌλ‘ ν¬λ§·ν μ μλ ESLint λ° Prettier νμ₯μ μ 곡ν©λλ€. μ΄λ μ½λ νμ§μ μλννλ λ° μ€μν λ¨κ³μ λλ€.
npm μ€ν¬λ¦½νΈ μΆκ°νκΈ°
package.json
νμΌμ npm μ€ν¬λ¦½νΈλ₯Ό μΆκ°νμ¬ λͺ
λ Ήμ€μμ ESLint λ° Prettierλ₯Ό μ½κ² μ€νν μ μμ΅λλ€.
"scripts": {
"lint": "eslint . --ext .js,.jsx",
"format": "prettier --write .",
"lint:fix": "eslint . --ext .js,.jsx --fix",
"format:check": "prettier --check ."
}
μ€ν¬λ¦½νΈ μ€λͺ :
lint
: νλ‘μ νΈμ λͺ¨λ.js
λ°.jsx
νμΌμμ ESLintλ₯Ό μ€νν©λλ€.format
: Prettierλ₯Ό μ€ννμ¬ νλ‘μ νΈμ λͺ¨λ νμΌμ ν¬λ§·ν©λλ€. `--write` νλκ·Έλ Prettierκ° νμΌμ μ§μ μμ νλλ‘ μ§μν©λλ€.lint:fix
: `--fix` νλκ·Έλ₯Ό μ¬μ©νμ¬ ESLintλ₯Ό μ€ννμ¬ μμ κ°λ₯ν λͺ¨λ λ¦°ν μ€λ₯λ₯Ό μλμΌλ‘ μμ ν©λλ€.format:check
: Prettierλ₯Ό μ€ννμ¬ λͺ¨λ νμΌμ΄ ꡬμ±μ λ°λΌ ν¬λ§·λμλμ§ νμΈν©λλ€. μ΄λ CI/CD νμ΄νλΌμΈμ μ μ©ν©λλ€.
μ΄μ λͺ λ Ήμ€μμ μ΄λ¬ν μ€ν¬λ¦½νΈλ₯Ό μ€νν μ μμ΅λλ€.
npm run lint
npm run format
npm run lint:fix
npm run format:check
νμΌ λ¬΄μνκΈ°
λ¦°ν λ° ν¬λ§·ν μμ νΉμ νμΌ λλ λλ ν 리λ₯Ό μ μΈν μ μμ΅λλ€(μ: node_modules, λΉλ λλ ν 리). νλ‘μ νΈ λ£¨νΈμ .eslintignore λ° .prettierignore νμΌμ λ§λ€μ΄ μ΄λ¬ν μ μΈ μ¬νμ μ§μ ν©λλ€. μλ₯Ό λ€μ΄:
.eslintignore
:
node_modules/
dist/
build/
.prettierignore
:
node_modules/
dist/
build/
CI/CDλ‘ μ½λ νμ§ μλννκΈ°
μ 체 κ°λ° νμμ μΌκ΄λ μ½λ νμ§μ 보μ₯νλ €λ©΄ λ¦°ν λ° ν¬λ§·ν μ CI/CD νμ΄νλΌμΈμ ν΅ν©ν©λλ€. μ΄λ κ² νλ©΄ μ½λκ° μ£Ό λΆκΈ°μ λ³ν©λκΈ° μ μ μ½λ μ€νμΌ μλ° λ° μ μ¬μ μ€λ₯κ° μλμΌλ‘ νμΈλ©λλ€.
GitHub Actions μν¬νλ‘μ ESLint λ° Prettierλ₯Ό ν΅ν©νλ λ°©λ²μ μλ λ€μκ³Ό κ°μ΅λλ€.
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Use Node.js 16
uses: actions/setup-node@v3
with:
node-version: 16
- name: Install dependencies
run: npm install
- name: Run linters
run: npm run lint
- name: Run format check
run: npm run format:check
μ΄ μν¬νλ‘λ λ€μ λ¨κ³λ₯Ό μνν©λλ€.
- μ½λλ₯Ό 체ν¬μμν©λλ€.
- Node.jsλ₯Ό μ€μ ν©λλ€.
- μ’ μμ±μ μ€μΉν©λλ€.
- ESLintλ₯Ό μ€νν©λλ€.
- Prettierλ₯Ό νμΈ λͺ¨λλ‘ μ€νν©λλ€.
ESLint λλ Prettierκ° μ€λ₯λ₯Ό κ°μ§νλ©΄ μν¬νλ‘κ° μ€ν¨νμ¬ μ½λκ° λ³ν©λμ§ μλλ‘ ν©λλ€.
λ¦°ν λ° ν¬λ§·ν λͺ¨λ² μ¬λ‘
λ¦°ν λ° ν¬λ§·ν μ ꡬνν λ λ°λΌμΌ ν λͺ κ°μ§ λͺ¨λ² μ¬λ‘κ° μμ΅λλ€.
- μΌκ΄λ μ½λ© μ€νμΌ ν립: νλ‘μ νΈμ λν λͺ ννκ³ μΌκ΄λ μ½λ© μ€νμΌ κ°μ΄λλ₯Ό μ μν©λλ€. μ¬κΈ°μλ λ€μ¬μ°κΈ°, μ€ κ°κ²©, λͺ λͺ κ·μΉ λ° μ£Όμ κ΄νκ³Ό κ°μ μΈ‘λ©΄μ΄ ν¬ν¨λμ΄μΌ ν©λλ€. Airbnbμ JavaScript Style Guideμ κ°μ΄ λ리 μ±νλ μ€νμΌ κ°μ΄λλ₯Ό μμμ μΌλ‘ μ¬μ©νλ κ²μ κ³ λ €ν΄ λ³΄μΈμ.
- νλ‘μΈμ€ μλν: κ°λ° μν¬νλ‘ λ° CI/CD νμ΄νλΌμΈμ λ¦°ν λ° ν¬λ§·ν μ ν΅ν©ν©λλ€. μ΄λ κ² νλ©΄ λͺ¨λ μ½λκ° ν립λ μ€νμΌ μ§μΉ¨μ μ€μνλλ‘ λ³΄μ₯λ©λλ€.
- κ·μΉ μ¬μ©μ μ§μ : νλ‘μ νΈμ νΉμ μꡬ μ¬ν λ° κΈ°λ³Έ μ€μ μ λ§κ² ESLint λ° Prettier κ·μΉμ μ‘°μ ν©λλ€. κ΄λ ¨μ΄ μκ±°λ μ½λ© μ€νμΌκ³Ό μΆ©λνλ κ·μΉμ λΉνμ±ννλ κ²μ λλ €μνμ§ λ§μΈμ.
- νΈμ§κΈ° ν΅ν© μ¬μ©: μ€μκ° νΌλλ°±μ μν΄ λ¦°ν° λ° ν¬λ§·ν°λ₯Ό IDEμ μ§μ ν΅ν©ν©λλ€. μ΄λ κ² νλ©΄ μ€λ₯λ₯Ό μ‘°κΈ°μ νμ νκ³ μ€νμΌμ μΌκ΄λκ² μ μ©ν μ μμ΅λλ€.
- ν κ΅μ‘: λͺ¨λ νμμ΄ λ¦°ν λ° ν¬λ§·ν κ·μΉμ μκ³ μκ³ λꡬ μ¬μ© λ°©λ²μ μ΄ν΄νλλ‘ ν©λλ€. νμμ λ°λΌ κ΅μ‘ λ° λ¬Έμλ₯Ό μ 곡ν©λλ€.
- ꡬμ±μ μ κΈ°μ μΌλ‘ κ²ν : ESLint λ° Prettier ꡬμ±μ μ κΈ°μ μΌλ‘ κ²ν νμ¬ μ¬μ ν κ΄λ ¨μ±μ΄ μκ³ ν¨κ³Όμ μΈμ§ νμΈν©λλ€. νλ‘μ νΈκ° λ°μ ν¨μ λ°λΌ μλ‘μ΄ λͺ¨λ² μ¬λ‘ λλ μ½λ© κ·μΉμ λ°μνλλ‘ κ·μΉμ μ‘°μ ν΄μΌ ν μ μμ΅λλ€.
- κΈ°λ³Έκ°μΌλ‘ μμνμ¬ μ μ°¨μ μΌλ‘ μ¬μ©μ μ§μ : ESLint λ° Prettierμ κΆμ₯λκ±°λ κΈ°λ³Έ ꡬμ±μΌλ‘ μμν©λλ€. νμ κΈ°λ³Έ μ€μ λ° νλ‘μ νΈ μꡬ μ¬νμ λ§κ² κ·μΉκ³Ό μ€μ μ μ μ°¨μ μΌλ‘ μ¬μ©μ μ§μ ν©λλ€.
- μ κ·Όμ± κ³ λ €: μΌλ°μ μΈ μ κ·Όμ± λ¬Έμ λ₯Ό κ°λ° νλ‘μΈμ€ μ΄κΈ°μ νμ νκΈ° μν΄ μ κ·Όμ± λ¦°ν κ·μΉμ ν΅ν©ν©λλ€. μ΄λ κ² νλ©΄ μ₯μ κ° μλ μ¬λμ΄ μ ν리μΌμ΄μ μ μ¬μ©ν μ μλλ‘ λ³΄μ₯νλ λ° λμμ΄ λ©λλ€.
- μ»€λ° νν¬ μ¬μ©: μ»€λ° νν¬λ₯Ό μ¬μ©νμ¬ Git μν¬νλ‘μ λ¦°ν λ° ν¬λ§·ν μ ν΅ν©ν©λλ€. μ΄λ κ² νλ©΄ κ° μ»€λ° μ μ μ½λλ₯Ό μλμΌλ‘ νμΈνκ³ μ€νμΌ μ§μΉ¨μ μλ°νλ μ½λλ₯Ό 컀λ°νμ§ λͺ»νλλ‘ ν μ μμ΅λλ€. Husky λ° lint-stagedμ κ°μ λΌμ΄λΈλ¬λ¦¬λ μ΄ νλ‘μΈμ€λ₯Ό μλννλ λ° λμμ΄ λ μ μμ΅λλ€.
- κΈ°μ λΆμ±λ₯Ό μ μ§μ μΌλ‘ ν΄κ²°: κΈ°μ‘΄ νλ‘μ νΈμ λ¦°ν λ° ν¬λ§·ν μ λμ ν λ κΈ°μ λΆμ±λ₯Ό μ μ§μ μΌλ‘ ν΄κ²°ν©λλ€. λ¨Όμ μ μ½λμ μ§μ€νκ³ μ μ°¨μ μΌλ‘ κΈ°μ‘΄ μ½λλ₯Ό 리ν©ν°λ§νμ¬ μ€νμΌ μ§μΉ¨μ μ€μν©λλ€.
κ³Όμ λ° κ³ λ € μ¬ν
λ¦°ν λ° ν¬λ§·ν μ μλΉν μ΄μ μ μ 곡νμ§λ§ μΌλμ λμ΄μΌ ν λͺ κ°μ§ κ³Όμ μ κ³ λ € μ¬νλ μμ΅λλ€.
- μ΄κΈ° μ€μ λ° κ΅¬μ±: νΉν 볡μ‘ν νλ‘μ νΈμ κ²½μ° ESLint λ° Prettierλ₯Ό μ€μ νλ λ° μκ°μ΄ μ€λ 걸릴 μ μμ΅λλ€. νΉμ μꡬ μ¬νμ λ§κ² μ μ€ν ꡬμ±κ³Ό μ¬μ©μ μ§μ μ ν΄μΌ ν©λλ€.
- νμ΅ κ³‘μ : κ°λ°μλ μλ‘μ΄ λꡬμ μ½λ© κ·μΉμ λ°°μμΌ ν μ μμΌλ©°, μ΄ κ³Όμ μλ μκ°κ³Ό λ Έλ ₯μ΄ νμν©λλ€.
- μ μ¬μ μΈ μΆ©λ: ESLint λ° Prettierλ λλλ‘ μλ‘ μΆ©λνμ¬ μκΈ°μΉ μμ λμμ λ°©μ§νκΈ° μν΄ μ μ€ν ꡬμ±μ΄ νμν©λλ€.
- μ μ©: λκ·λͺ¨ κ°λ° ν, νΉν μ μΈκ³μ μΌλ‘ λΆμ°λ νκ²½μμ λ¦°ν λ° ν¬λ§·ν κ·μΉμ μΌκ΄λκ² μ μ©νλ κ²μ μ΄λ €μΈ μ μμ΅λλ€. λͺ νν μμ¬ μν΅, κ΅μ‘ λ° μλνλ κ²μ¬κ° νμμ μ λλ€.
- κ³Όλν μ¬μ©μ μ§μ : κ·μΉμ κ³Όλνκ² μ¬μ©μ μ§μ νμ§ λ§μΈμ. κ³Όλν μ¬μ©μ μ§μ μ κ²½μ§λκ³ μ μ°νμ§ μμ μ½λ© μ€νμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€. κ°λ₯ν κ²½μ° λ리 μμ©λλ λͺ¨λ² μ¬λ‘μ μ½λ© κ·μΉμ κ³ μνμΈμ.
- μ±λ₯ μν₯: λ¦°ν λ° ν¬λ§·ν μ νΉν λκ·λͺ¨ νλ‘μ νΈμμ μ½κ°μ μ±λ₯ μν₯μ λ―ΈμΉ μ μμ΅λλ€. μ΄ μν₯μ μ΅μννλλ‘ κ΅¬μ± λ° μν¬νλ‘λ₯Ό μ΅μ ννμΈμ.
κ²°λ‘
λ¦°ν λ° ν¬λ§·ν μ νΉν μ μΈκ³μ λΆμ°λ νκ³Ό ν¨κ» μμ ν λ κ³ νμ§ νλ‘ νΈμλ μ½λλ₯Ό μ μ§νλ λ° νμμ μΈ κ΄νμ λλ€. μ½λ μ€νμΌ μ μ©μ μλννκ³ μ μ¬μ μΈ μ€λ₯λ₯Ό μ‘°κΈ°μ μλ³ν¨μΌλ‘μ¨ μ½λ κ°λ μ±, μ μ§ κ΄λ¦¬ μ©μ΄μ± λ° νμ μ κ°μ ν μ μμ΅λλ€. κ³ λ €ν΄μΌ ν λͺ κ°μ§ κ³Όμ κ° μμ§λ§ λ¦°ν λ° ν¬λ§·ν μ μ΄μ μ΄ λ¨μ μ ν¨μ¬ λ₯κ°ν©λλ€. μ΄ κΈ°μ¬μ μ€λͺ λ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ ν ꡬμ±μμ μμΉμ κ΄κ³μμ΄ μΌκ΄λ μ½λ© μ€νμΌμ ν립νκ³ , μ€λ₯λ₯Ό μ€μ΄λ©°, νλ‘ νΈμλ μ ν리μΌμ΄μ μ μ λ°μ μΈ νμ§μ κ°μ ν μ μμ΅λλ€.
μ½λ νμ§μ ν¬μνλ κ²μ νλ‘μ νΈμ μ₯κΈ°μ μΈ μ±κ³΅κ³Ό κ°λ° νμ μμ°μ±μ ν¬μνλ κ²μ λλ€. κ°λ° μν¬νλ‘μ μΌλΆλ‘ λ¦°ν λ° ν¬λ§·ν μ μμ©νκ³ λ κΉ¨λνκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μ½λλ² μ΄μ€μ μ΄μ μ λ리μΈμ.