๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT

ํ”„๋ก ํŠธ์—”๋“œ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ: ESLint, Prettier, Husky, lint-staged

by ๐Ÿ’ฒ๐ŸŽตโœ–๏ธโœ”๏ธโ˜ผ 2024. 2. 7.
728x90

1. ESLint์™€ Prettier ์„ค์ •

1.1 ESLint ์„ค์น˜ ๋ฐ ์ดˆ๊ธฐํ™”:

npm install eslint --save-dev
npx eslint --init

1.2 ESLint ์„ค์ • ํŒŒ์ผ ์˜ˆ์ œ:

// .eslintrc.json
{
  "extends": ["eslint:recommended", "plugin:react/recommended"],
  "plugins": ["react"],
  "rules": {
    "react/prop-types": 0,
    // ์—ฌ๊ธฐ์— ์›ํ•˜๋Š” ๊ทœ์น™ ์„ค์ • ์ถ”๊ฐ€
  }
}

1.3 Prettier ์„ค์น˜ ๋ฐ ์„ค์ •:

npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier

.prettierrc.json์— Prettier ์„ค์ • ์ถ”๊ฐ€:

// .prettierrc.json
{
  "singleQuote": true,
  "semi": false,
  "tabWidth": 2
}

1.4 ESLint์— Prettier ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€:

// .eslintrc.json
{
  "extends": [
    "eslint:recommended",
    "plugin:react/recommended",
    "prettier"
  ],
  "plugins": ["react", "prettier"],
  "rules": {
    "react/prop-types": 0,
    "prettier/prettier": "error"
    // ์—ฌ๊ธฐ์— ์›ํ•˜๋Š” ๊ทœ์น™ ์„ค์ • ์ถ”๊ฐ€
  }
}

2. Husky์™€ lint-staged ์„ค์ •

2.1 Husky ์„ค์น˜ ๋ฐ ์„ค์ •:

npm install husky --save-dev

package.json์— Husky ์„ค์ • ์ถ”๊ฐ€:

// package.json
{
  "husky": {
    "hooks": {
      "pre-commit": "npm test",   // ์ปค๋ฐ‹ ์ „์— ํ…Œ์ŠคํŠธ ์‹คํ–‰
      "pre-push": "npm run lint"   // ํ‘ธ์‹œ ์ „์— lint ์ž‘์—… ์‹คํ–‰
    }
  }
}

2.2 lint-staged ์„ค์น˜ ๋ฐ ์„ค์ •:

npm install lint-staged --save-dev

package.json์— lint-staged ์„ค์ • ์ถ”๊ฐ€:

// package.json
{
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write", "git add"]
  }
}

3. TypeScript ์„ค์ • (์˜ต์…˜)

3.1 TypeScript ๋ฐ ๊ด€๋ จ ํŒจํ‚ค์ง€ ์„ค์น˜:

npm install typescript @types/react @typescript-eslint/eslint-plugin @typescript-eslint/parser --save-dev

3.2 TypeScript ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ (tsconfig.json):

// tsconfig.json
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "moduleResolution": "node",
    "jsx": "react",
    "strict": true,
    "esModuleInterop": true
  },
  "include": ["src/**/*"]
}

3.3 ESLint TypeScript ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€:

npm install eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin --save-dev

.eslintrc.json์— TypeScript ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€:

// .eslintrc.json
{
  "extends": [
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended",
    "prettier"
  ],
  "plugins": ["react", "prettier", "@typescript-eslint"],
  "parser": "@typescript-eslint/parser",
  "rules": {
    "react/prop-types": 0,
    "prettier/prettier": "error"
    // ์—ฌ๊ธฐ์— TypeScript์— ๊ด€๋ จ๋œ ๊ทœ์น™ ์ถ”๊ฐ€
  }
}

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด ํ”„๋กœ์ ํŠธ์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปค๋ฐ‹ ์‹œ ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ์™€ ์ฝ”๋“œ ์Šคํƒ€์ผ ๊ฒ€์‚ฌ๊ฐ€ ์ด๋ค„์ง€๋ฉฐ, TypeScript๋ฅผ ํฌํ•จํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์— ์ ํ•ฉํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€