JavaScript

ESLint, Prettier Setting ์ดํ•ดํ•˜๋ฉฐ ์ •๋ฆฌ

martinooo 2022. 11. 30. 11:45

๐Ÿคณ ESLint & Prettier ์ •ํ™•ํ•œ ์ฐจ์ด?


ESLint ์™€ Prettier๋Š” ๋‘˜๋‹ค ์ฝ”๋“œ ์ปจ๋ฒค์…˜์„ ๋„์™€์ฃผ๋Š” ์—ญํ™œ์„ ํ•œ๋‹ค. 

๋‘˜์ค‘์— ํ•˜๋‚˜๋งŒ ์จ๋„ ๋˜๋Š”๋ฐ ์™œ ๋‘˜์„ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

ESLint ์™€ Prettier ๋‹ค๋ฅธ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜์„ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

 

"eslint๋Š” ์ฝ”๋“œ ํ€„๋ฆฌํ‹ฐ๋ฅผ ๋ณด์žฅํ•˜๋„๋ก ๋„์™€์ฃผ๊ณ , prettier๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๊น”๋”ํ•˜๊ฒŒ ํ˜น์€ ํ†ต์ผ๋˜๋„๋ก ๋„์™€์ค€๋‹ค."

 

๊ทธ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.


โŒจ ESLint


๊ฐœ๋ฐœ์ค‘ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ํ• ๋•Œ, ํ•œ๊ฐœ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ๋ฐฉ์‹๋“ค์ด ์žˆ๋‹ค. 

// function ํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
function foo() {
 ...
}

// arrow function ์‚ฌ์šฉ
const foo = () => {
 ...
}
const Temps = [1,2,3,4,5];

// for๋ฌธ ์‚ฌ์šฉ
for(let i = 0; i < Temps.length; i++){
 ...
}

// Array ๋‚ด์žฅ ํ•จ์ˆ˜ ์‚ฌ์šฉ
Temps.forEach((temp) => {
 ...
})

์œ„์— ์˜ˆ๋“ค ์ฒ˜๋Ÿผ function ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , arrow function๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , for๋ฌธ์œผ๋กœ ๋ฐฐ์—ด์€ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๊ณ , forEach, map๋“ฑ Array ๋‚ด์žฅํ•จ๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ์ž ๋งˆ๋‹ค ์Šคํƒ€์ผ์ด ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์— ํ†ต์ผ์„ฑ๊ณผ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด ESLint๊ฐ€ ํ•˜๋Š” ์—ญํ™œ์ด๋‹ค. 

์ฝ”๋“œํ€„๋ฆฌํ‹ฐ ์ฆ‰ ์ฝ”๋“œ ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์ผ๊ด€์„ฑ์žˆ๊ณ  ํ†ต์ผ์„ฑ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” Javascript ๋ฌธ๋ฒ• ๋„๊ตฌ์ด๋‹ค.


โŒจ Prettier


Prettier๋Š” ESLint์ฒ˜๋Ÿผ ์ฝ”๋“œ ๊ตฌํ˜„ ๋ฐฉ์‹์ด ์•„๋‹Œ, ์ค„ ๋ฐ”๊ฟˆ, ๊ณต๋ฐฑ, ๋“ค์—ฌ ์“ฐ๊ธฐ ๋“ฑ ๋ฐ์ดํ„ฐ์—์„œ ํ…์ŠคํŠธ๋ฅผ ์ผ๊ด€๋˜๊ฒŒ ์ž‘์„ฑ๋˜๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. 

const foo = () => {
  const a = [1, 2, 3];  // ์Šค์ฝ”ํ”„ ๋‚ด๋ถ€ ์ž‘์„ฑ ์‹œ ๋‘ ๊ณต๋ฐฑ ๋“ค์—ฌ์“ฐ๊ธฐ
}
   // <= ๋นˆ ์ค„์ด ํ•œ ์ค„ ์ด์ƒ ์•ˆ๋จ.
foo();

์˜ˆ์ œ์ฒ˜๋Ÿผ ์ค„๋ฐ”๊ฟˆ ๊ณต๋ฐฑ, ๋“ค์—ฌ ์“ฐ๊ธฐ๋“ฑ์„ ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋„์™€์ฃผ๋Š” ์—ญํ™œ์„ ํ•œ๋‹ค.


โœจ ESLint ์…‹ํŒ…


์šฐ์„  ESLint๋ฅผ ์“ฐ๋ ค๋ฉด ๋‹น์—ฐํžˆ ESLint๋ฅผ ์„ค์น˜ํ•ด์•ผ ๋œ๋‹ค. 

$ npm install -D eslint
// or
$ yarn add -D eslint

npm ์„ค์น˜๋ฅผ ํ•˜๊ณ  VScode์—์„œ ESLint extension์„ ๋ฌด์กฐ๊ฑด ์„ค์น˜๋ฅผ ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.

ESLint Extension์˜ ์„ค๋ช…์—๋„ ๋ณด๋ฉด, ํ•ด๋‹น ์›Œํฌ์ŠคํŽ˜์ด์Šค(์—ฌ๊ธฐ์„œ๋Š” ํ•ด๋‹น ํ”„๋กœ์ ํŠธ)์—์„œ eslint๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ณ , ์—†์œผ๋ฉด ๊ธ€๋กœ๋ฒŒ eslint๋ฅผ ์ฐธ์กฐํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•„์š”์— ๋”ฐ๋ผ .eslintrc ํŒŒ์ผ์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.

๊ทธ๋ ‡๋‹ค . eslint๊ฐ€ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋‹จ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํ•ด๋‹น VSCode๋ผ๋Š” ์—๋””ํ„ฐ์— ์ ์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค ๋ณด๋‹ˆ, eslint๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด eslint extension๋งŒ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜, eslint library๋งŒ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‘˜ ๋‹ค ์„ค์น˜ ๋ฐ ์„ธํŒ…์ด ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด์ œ ์ด eslint๋ฅผ ์ œ๋Œ€๋กœ ์„ค์น˜ํ•ด์ฃผ์—ˆ์œผ๋ฉด, .eslintrc ํŒŒ์ผ์„ ํ†ตํ•ด์„œ lint rule์„ ์„ธํŒ…ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

.eslintrc ํŒŒ์ผ ์ƒ์„ฑ *ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ „์šฉ ๋ฆฐํŠธ 

{
    "root": true,
    "plugins": [
        "@typescript-eslint"
    ],
    "extends": [
        "eslint:recommended",
        "plugin:@typescript-eslint/recommended"
    ],
    "parser": "@typescript-eslint/parser",
    "rules": {
        "@typescript-eslint/strict-boolean-expressions": [
            2,
            {
                "allowString" : false,
                "allowNumber" : false
            }
        ]
    }
}
  • root
    • default๋Š” true์ธ๋ฐ, ์ด ๊ฐ’์ด true๊ฐ€ ์•„๋‹ˆ๋ฉด, eslintrc ํŒŒ์ผ์„ ์ฐพ์„ ๋•Œ, ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๋ฟ ์•„๋‹ˆ๋ผ, ๋‚ด PC์˜ root ํŒŒ์ผ ์‹œ์Šคํ…œ root ๋””๋ ‰ํ† ๋ฆฌ๊นŒ์ง€ eslint๋ฅผ ์ฐพ๋Š”๋‹ค
  • plugins ์ข…๋ฅ˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
    • eslint-config-airbnb-base: ์—์–ด๋น„์—”๋น„ ๋ฆฐํŠธ ํ”Œ๋Ÿฌ๊ทธ์ธ
    • eslint-config-next: Next.js ์ „์šฉ ๋ฆฐํŠธ ํ”Œ๋Ÿฌ๊ทธ์ธ
    • eslint-plugin-react: ๋ฆฌ์•กํŠธ ์ „์šฉ ํ”Œ๋Ÿฌ๊ทธ์ธ
    • eslint-plugin-prettier: ๋ฆฐํŠธ ์œ„์— ์‚ฌ์šฉํ•  ํ”„๋ฆฌํ‹ฐ์–ด ํ”Œ๋Ÿฌ๊ทธ์ธ
    • eslint-config-prettier: ์š”๊ฑด ๋ฆฐํŠธ ์„ค์ •๊ณผ ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ํ”„๋ฆฌํ‹ฐ์–ด ๋ฃฐ์—์„œ ์ œ์™ธํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ
    • @typescript-eslint/eslint-plugin: : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ „์šฉ ๋ฆฐํŠธ

์ž์‹ ์˜ ํ”„๋กœ์ ํŠธ์— ๋งž์ถฐ์„œ ์˜ต์…˜๋“ค์„ ์„ค์ •ํ•ด์„œ ESLint๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.  

 

๋” ๋งŽ์€ ์ •๋ณด๋Š” ์•„๋ž˜์˜ ESLint ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

https://typescript-eslint.io/docs/

 

Getting Started | TypeScript ESLint

Quickstart

typescript-eslint.io


โœจ Prettier ์…‹ํŒ…


Prettier ์…‹ํŒ…์€ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  • ๋ณ„๋„์˜ Prettier ๊ด€๋ จ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ npm, yarn์œผ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  VScode์˜ extension์„ ์„ค์น˜. 
  • Prettier ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ง์ ‘ ์„ค์น˜ ํ›„ eslintrc์— ์…‹ํŒ….

Prettier ๋‹ค์šด๋กœ๋“œ

Prettier-code formatter๋Š” ์„ค์น˜ํ•˜๋Š” ์ˆœ๊ฐ„ ๋ฐ”๋กœ ์ ์šฉ๋œ๋‹ค.
ํ•ด๋‹น prettier์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค์ • ๋ฐฉ์‹์€ docs์— ๋“ค์–ด๊ฐ€๋ฉด ์„ค๋ช…์ด ์•„์ฃผ ์ž˜ ๋‚˜์™€์žˆ๋‹ค.

 

crtl + shift + p๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒ€์ƒ‰ ์ฐฝ์—, Open User Settings๋กœ ๋“ค์–ด๊ฐ€์„œ prettier๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด, prettier ๊ด€๋ จ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๋“ค์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ์—ฌ๊ธฐ์„œ ์—ฌ๋Ÿฌ๋ถ„๋“ค ์ž…๋ง›์— ๋งž๊ฒŒ ์„ค์ •ํ•˜๋ฉด ์ ์šฉ๋œ๋‹ค.

VScode extension์—๋งŒ ์„ค์ •์„ ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  .prettierrc ํŒŒ์ผ์— ์…‹ํŒ…์„ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์—๋Š” prettier ์„ค์น˜ํ•˜๊ณ  ์…‹ํŒ…์„ ํ•ด์ฃผ๋ฉด๋œ๋‹ค. 

$ npm install -D prettier
// or
$ yarn add -D prettier

.prettierrc ์ƒ์„ฑํ›„ ์•„๋ž˜์˜ ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

https://github.com/prettier/eslint-config-prettier

 

GitHub - prettier/eslint-config-prettier: Turns off all rules that are unnecessary or might conflict with Prettier.

Turns off all rules that are unnecessary or might conflict with Prettier. - GitHub - prettier/eslint-config-prettier: Turns off all rules that are unnecessary or might conflict with Prettier.

github.com


โœจ VSCode Settings.json ์…‹ํŒ…

 


์ฝ”๋“œ ์ž‘์ •ํ›„ ctrl + s ์ €์žฅ์‹œ ๋ฆฐํŠธ๋ฅผ ์žก์•„์ฃผ๋Š” ๊ธฐ๋Šฅ์„ VScode ์—๋””ํ„ฐ๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

VSCode Setting์—์„œ ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ctrl+shift+p๋กœ ๋‚˜์˜จ ๊ฒ€์ƒ‰์ฐฝ์— Open Settings.json(JSON)์„ ์„ ํƒํ•˜๋ฉด Settings ์„ค์ •์ด JSON ํ˜•์‹์œผ๋กœ ๋‚˜์˜จ๋‹ค.


settings.json์— ์˜ต์…˜์„ ์…‹ํŒ…ํ•œ๋‹ค.

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

์ฝ๋Š” ๊ทธ๋Œ€๋กœ saveํ•  ๋•Œ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋‹ค. 

์ฆ‰ save ํ• ๋•Œ Prettier ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๋Š” ์˜ต์…˜์ด๋‹ค.


โœจ ESLint & Prettier & Settings.jon

  • ESLint
    • ๊ธฐ๋Šฅ ์ž์ฒด๋Š” VScode ์—๋””ํ„ฐ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ, VScode extension๋ฅผ ๊ผญ ์„ค์น˜๋˜์–ด์•ผ ํ•œ๋‹ค. 
  • Prettier
    • Prettier ์…‹ํŒ… ๋ฐฉ์‹์€ ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. 
      • ESLint์ฒ˜๋Ÿผ VScode์—๋””ํ„ฐ ์ž์ฒด์— ์ ์šฉํ•˜๋„๋ก VScode extension ์„ค์น˜ํ•˜๋Š” ๋ฐฉ์‹ 
      • Prettier ํ”Œ๋กœ๊ทธ์ธ์„ ์„ค์น˜ํ›„ eslint ํ™˜๊ฒฝ์— ์ ‘๋ชฉ ์‹œํ‚ค๋Š” ๋ฐฉ์‹
    • Settings.json
      • format on Save ์ €์žฅ์‹œ ์•Œ์•„์„œ ์ˆ˜์ •ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ 
      • Settings.json ์…‹ํŒ…์„ ํ•ด์ฃผ๋ฉด ์ €์žฅ์‹œ ๋™์ž‘ํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.