[VSCODE] ESlint/Prettier ์„ค์ •ํ•˜๊ธฐ

์‚ฌ๋žŒ๋“ค์ด ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์—๋””ํ„ฐ์ธ Visual Studio Code(VSCODE)์— ๋‹ค๊ฐ€ ์ฝ”๋“œ ํฌ๋งทํ„ฐ์ธ Prettier์™€
ES๋ฌธ๋ฒ• ์ฒดํฌ์ธ Eslint๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ๋ฒ•๊ฒ€์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ •์„ ์žก์•„๋ณด๋ ค ํ•œ๋‹ค.

์ฝ”๋“œ๊ฐ€ ๊ทœ์น™์„ฑ์—†์ด ์ž‘์„ฑํ•œ๊ฑธ ์‹ซ์–ดํ•˜๋Š” ๋‚˜๋กœ์จ ์ด ๋‘๊ฐœ๋ฅผ ์„ค์ •ํ•œ๋’ค ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒŒ ๋งˆ์Œ์˜ ํŽธ์•ˆํ•จ์„ ๊ฐ€์งˆ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ผ๋‹จ VSCODE๋Š” ์„ค์น˜๋˜์—ˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ฒ ๋‹ค.

1. VSCODE Extensions๋ฅผ ํ†ตํ•ด์„œ ๋จผ์ € Prettier ๊ณผ ESlint๋ฅผ ์„ค์น˜ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

Prettier ESlint

2. ํ•„์š”ํ•œ Npm ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์•ผ ํ•œ๋‹ค.

์ผ๋‹จ Npm ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ๋ณธ๋‹ค.

// -y๋Š” init์„ ํ•˜๋ฉด ๋ฌผ์–ด๋ณด๋Š” ์งˆ๋ฌธ์— ๋ชจ๋‘ Yes๋ฅผ ์ž๋™์ ์œผ๋กœ ํ•ด์ค€๋‹ค.
npm init -y

๊ทธ๋Ÿฌ๋ฉด ๋””๋ ‰ํ† ๋ฆฌ์— package.json๋ผ๋Š” ํŒŒ์ผ์ด ์ƒ๊ฒผ์„๊ฒƒ์ด๋‹ค.

์ด์ œ ํ•„์š”ํ•œ Npm ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋ฐ›์•„์•ผ ํ•œ๋‹ค.

๊ณตํ†ต์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋ฐ›๋Š”๋‹ค.

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

๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์ด์ œ ES6์— ๊ด€ํ•œ ๊ทœ์น™์ด ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ๋ณธ์ธ์€ ๊ทธ์ค‘์—์„œ ๊ฐ€์žฅ ๋ณดํŽธ์ ์œผ๋กœ
์‚ฌ์šฉ๋˜๋Š” airbnb์„ ์‚ฌ์šฉํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค.

์—ฌ๊ธฐ์„œ ํ•œ๊ฐ€์ง€ airbnb์—๋Š” airbnb๊ณผ airbnb-base๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ airbnb-base๋Š” React๊ด€๋ จ ๊ทœ์น™์ด ๋น ์ ธ์žˆ๋‹ค.
๋‚˜๋Š” ์ง€๊ธˆ์€ ๊ฐ„๋‹จํ•œ jsํŒŒ์ผ์„ ์ž‘์„ฑํ•ด์„œ ํ…Œ์ŠคํŠธ ํ•ด๋ณผ์˜ˆ์ •์ด๊ธฐ ๋•Œ๋ฌธ์— airbnb-base๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ฒ ๋‹ค.

airbnb-base ๋‹ค์šด๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ทธ์— ๊ด€๋ จ๋œ ํŒจํ‚ค์ง€๋“ค์„ ๋ชจ๋‘ ๋‹ค์šด๋ฐ›์•„์•ผํ•˜๋Š”๋ฐ ํ•ด๋‹น ๋ฌธ์žฅ์„ ํ†ตํ•ด ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

npm info "eslint-config-airbnb-base@latest" peerDependencies

// ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค. airbnb์„ ์‚ฌ์šฉํ•˜์…จ๋˜ ๋ถ„์€ React๊ด€๋ จ๋œ๊ฒƒ ๊นŒ์ง€ ์ข€ ๋” ๋งŽ์ด ๋‚˜์˜จ๋‹ค.
{ eslint: '^5.16.0 || ^6.1.0',
  'eslint-plugin-import': '^2.18.2' }

๋…ธ๋“œ 5+ ์ด์ƒ์„ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๋ถ„์ด๋ผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด npx๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๊ด€๋ จ ํŒจํ‚ค์ง€๊นŒ์ง€ ์ „๋ถ€ ํ•œ๋ฒˆ์— ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

npx install-peerdeps --dev eslint-config-airbnb-base

๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜ค๋ฉด ์ •์ƒ์ ์œผ๋กœ ๋ชจ๋‘ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ์™„๋ฃŒ๋œ๊ฒƒ์ด๋‹ค.

"devDependencies": {
  "eslint": "^6.1.0",
  "eslint-config-airbnb-base": "^14.0.0",
  "eslint-config-prettier": "^6.5.0",
  "eslint-plugin-import": "^2.18.2",
  "eslint-plugin-prettier": "^3.1.1",
  "prettier": "^1.18.2"
}

์ž ์ด์ œ ๊ฑฐ์˜ ๋‹ค์™”๋‹ค. Root๋””๋ ‰ํ† ๋ฆฌ์— ํ•ด๋‹น ๋‘๊ฐœ์˜ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ๋ณต์‚ฌํ•˜์—ฌ์ค€๋‹ค.
์•„๋ž˜์˜ ๋‘๊ฐœ์˜ ํŒŒ์ผ์€ ๋ณธ์ธ์˜ ์ž…๋ง›์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ผ๋‹จ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์„ค์ •๋งŒ ํ•ด๋‘” ์ƒํƒœ์ด๋‹ค.

Prettier, ESlint ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ์„ค์ •์„ ๋” ๋‹ค์–‘ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
Prettier
ESlint

.eslintrc.json

{
  "extends": ["airbnb-base", "plugin:prettier/recommended"],
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error"
  }
}

.prettierrc

{
  "printWidth": 150
}

ํ…Œ์ŠคํŠธํ•ด๋ณผ ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•ด๋ณผ๊ฑฐ๋‹ค. index.js๋ฅผ Root ๋””๋ ‰ํ† ๋ฆฌ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฌธ๋ฒ•๊ณผ ์ •๋ ฌ์ด ๋งž์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค.

index.js

var a = 2;
const b = 3;
let c = '1';

๊ทธ๋ฆฌ๊ณค Shift + Alt + F๋ฅผ ๋ˆŒ๋Ÿฌ๋ณด์ž. ์•„๋ž˜์™€ ๊ฐ™์ด ์ž๋™์ ์œผ๋กœ โ€™->โ€œ๋กœ ๋ณ€๊ฒฝ ๋ณ€์ˆ˜ ์„ ์–ธ ์‚ฌ์ด์— ๋„์–ด์“ฐ๊ธฐ ์ค„๋งž์ถค ๋“ฑ ์ž๋™์ ์œผ๋กœ ์ฝ”๋“œ ์ •๋ ฌ์ด ๋์„๊ฒƒ์ด๋‹ค.

var a = 2;
const b = 3;
let c = '1';

์ด๊ฒƒ์„ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์ €์žฅํ• ๋•Œ๋งˆ๋‹ค ์ž๋™์ ์œผ๋กœ ์ฝ”๋“œ์ •๋ ฌ์ด ์ด๋ค„์ง€๊ฒŒ ์„ค์ •ํ• ๊ฑฐ๋‹ค.
VSCODE์˜ ์™ผ์ชฝ ์ƒ๋‹จ File -> Preferences -> Settings (๋‹จ์ถ•ํ‚ค๋กœ๋Š” Ctrl + ,)

Setting

์˜ค๋ฅธ์ชฝ ์œ„ Open Settings (JSON) ํด๋ฆญํ•˜์—ฌ "editor.formatOnSave"๋ฅผ true๋กœ ๋ฐ”๊ฟ” ์ฃผ๋ฉด ๋œ๋‹ค.
๋‚˜๋Š” true๋กœ ๋˜์–ด์žˆ๋„ค?? false์ด๊ฑฐ๋‚˜ ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์—†์œผ์‹ ๋ถ„์€ ๋„ฃ์–ด์ฃผ์‹œ๋ฉด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ €์žฅํ• ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋Š” ์•Œ์•„์„œ ์ •๋ ฌ์ด ๋œ๋‹ค.

    "[javascript]": {
        "editor.defaultFormatter": "esbenp.prettier-vscode",
        "editor.formatOnSave": true,
    },

์ž ์ด์ œ ESlint๋ฅผ ๋ณผ๊ฒƒ์ด๋‹ค ๋ถ„๋ช… ๋‚ด๊ฐ€ index.js๋ฅผ ์ž‘์„ฑํ•˜๋ผํ–ˆ์„๋•Œ ์–ด๋Š์ •๋„ ๋ˆˆ์น˜์ฑ„์‹ ๋ถ„๋“ค๋„ ์žˆ์„๊ฒƒ์ด๋‹ค.

INDEX.JS

์•„๋ž˜์™€ ๊ฐ™์ด ๋นจ๊ฐ„์ค„๊ณผ ํ•จ๊ป˜ ๋ฌธ๋ฒ•์ฒดํฌ๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์ง€๋งŒ ๊ทธ๋™์•ˆ ํ•ด์™”๋˜ ํ”„๋กœ์ ํŠธ์— ์ ์šฉ์„ ํ•˜๋ฉด ๋ถ„๋ช… ์ด๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋งŽ์€ ๋ฌธ๋ฒ•์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚ ๊ฑฐ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋ชจ๋‘ ์ง€ํ‚ค๋ฉด ์ข‹๊ฒ ์ง€๋งŒ ์ด๊ฒŒ ์‚ฌ์‹ค ํ•œ๋ฒˆ์— ๋ฐ”๊พธ๊ธฐ๊ฐ€ ์‰ฝ์ง€์•Š๋‹ค. ๊ทธ๋ž˜์„œ ๋ณธ์ธ์ด ํŒ๋‹จํ•˜์— ์ง€ํ‚ค๊ณ  ์‹ถ์ง€์•Š๋Š” ๋ฌธ๋ฒ•์ด
์กด์žฌํ•˜๋ฉด ์•„๋ž˜์™€๊ฐ™์ด .eslintrc.json์— ๋ฃฐ์„ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๋‚˜๋Š” no-var๋Š” ์—๋Ÿฌ๊ฐ€ ์•„๋‹Œ ๊ฒฝ๊ณ ํ‘œ์‹œ๋กœ ๋‚˜๋จธ์ง€ no-unused-vars, prefer-const๋Š” ์•„์˜ˆ ์ฒดํฌ ์•ˆํ•จ์œผ๋กœ ๋ฐ”๊ฟ”๋ณด๊ฒ ๋‹ค.

{
  "extends": ["airbnb-base", "plugin:prettier/recommended"],
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error",
    "no-var": "warn",
    "no-unused-vars": "off",
    "prefer-const": "off"
  }
}

์œ„์™€ ๊ฐ™์ด ๋ฐ”๊พธ๊ณ  ๋‹ค์‹œ index.js๋กœ ๊ฐ€๋ณด์ž.

INDEX.JS_2

๋‚ด๊ฐ€ ์›ํ•˜๋Š”๋Œ€๋กœ ๊ฒฝ๊ณ ํ‘œ์‹œ์™€ ๊ธฐ์กด์—์žˆ๋˜ ์—๋Ÿฌ๋Š” ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค.

๊น”๋”ํ•œ ์ฝ”๋“œ์ •๋ ฌ๊ณผ ์˜ฌ๋ฐ”๋ฅธ ๋ฌธ๋ฒ•์‚ฌ์šฉ์€ ์œ ์ง€๋ณด์ˆ˜์—์„œ๋„ ํŽธ๋ฆฌํ•จ๊ณผ ํผํฌ๋จผ์Šค์ชฝ์—์„œ๋„ ์œ ๋ฆฌํ•˜๊ฒŒ
์ž‘๋™ํ• ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

๊ผญ ์‚ฌ์šฉ์„ ํ•˜๋ผ๋Š”๊ฑด ์•„๋‹ˆ์ง€๋งŒ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜๋ฉด์„œ ์ด๋ ‡๊ฒŒ ๋‚ด๊ฐ€ ์ค€๋น„ํ–ˆ๋˜ ํฌ์ŠคํŒ…์„ ๋งˆ์น˜๋ ค ํ•œ๋‹ค.

๋‹ค๋ฅธ ๊ธ€ ์ฝ์–ด๋ณด๊ธฐ โฌ‡๏ธ