Vue.js ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ๋„๊ตฌ 3๊ฐ€์ง€

๋“ค์–ด๊ฐ€๋ฉฐ

์‹ค๋ฌด์—์„œ ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค ๋ณด๋ฉด ๋Š˜ ํšจ์œจ๊ณผ ์ƒ์‚ฐ์„ฑ์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํŒ€ ์ „์ฒด๊ฐ€ ์ผ๊ด€๋œ ํ˜•์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„์ง€, ๋งค๋ฒˆ ๋ฐ˜๋ณต์ ์œผ๋กœ ์น˜๋Š” ์ฝ”๋“œ๋“ค์„ ์ค„์ผ ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•˜์ฃ .

์˜ค๋Š˜์€ ์ด๋Ÿฐ ๊ณ ๋ฏผ๋“ค์„ ํ•ด๊ฒฐํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋„๊ตฌ๋ฅผ ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ESLint, Prettier, Vue VSCode Snippets ์ž…๋‹ˆ๋‹ค. ๋„๊ตฌ๋“ค์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ์— ๋ฐ”๋กœ ์ ์šฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ด๋“œ๋ฅผ ์งง์€ ํ˜ธํก์œผ๋กœ ์ ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด ๊ธ€์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ์—…๋ฌด ์‹œ๊ฐ„์„ ์ค„์—ฌ์ค„ ์ˆ˜ ์žˆ๊ธธ ๋ฐ”๋ผ๋ฉฐ..

Enjoy your coding!

Prettier

ํ”„๋ฆฌํ‹ฐ์–ด(Prettier)๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ •๋ฆฌํ•ด์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ESLint์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข€ ๋” ๊ฐœ์ธ ์ทจํ–ฅ์— ๋งž๋Š” ์ฝ”๋“œ ์Šคํƒ€์ผ๋กœ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. VSCode(Visual Studio Code), Atom, Sublime ๋“ฑ ๋Œ€์ค‘์ ์ธ ํ…์ŠคํŠธ ํŽธ์ง‘๊ธฐ์—์„œ ์ด๋ฏธ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•ํƒœ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ VSCode์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ™•์žฅ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

prettier on vscode

Prettier ์ ์šฉํ•˜๊ธฐ

ํ”„๋ฆฌํ‹ฐ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. VSCode ๊ธฐ์ค€์œผ๋กœ ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์‚ฌ์šฉ์ž ์„ค์ • ํŒŒ์ผ์ธ settings.json ํŒŒ์ผ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

{
  "editor.formatOnSave": true,
  "editor.formatOnType": true
}

์œ„ ์†์„ฑ์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ €์žฅ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•ด์ค๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด์ฃ .

prettier ๋™์ž‘ ํ™”๋ฉด

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

ESLint์™€ ํ”„๋ฆฌํ‹ฐ์–ด๋ฅผ ํ•จ๊ป˜ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค๋‹ค์Œ ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ESLint ์†Œ๊ฐœ

๋ฆฐํŠธ(ESLint)๋Š” ์ž˜๋ชป๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ๋กœ ์ธํ•ด ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๊ฒŒ ์ฝ”๋“œ ๋ฌธ๋ฒ•์„ ์žก์•„์ฃผ๋Š” ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ๊ธฐ์ž…๋‹ˆ๋‹ค. ๋ฌธ์žฅ ๋’ค์— ์ž๋™์œผ๋กœ ์„ธ๋ฏธ์ฝœ๋ก , ์ฝค๋งˆ๋ฅผ ๋ถ™์—ฌ์ฃผ๊ธฐ๋„ ํ•˜๊ณ  ์˜๋ฏธ ์—†๋Š” ๋ณ€์ˆ˜, API ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๊ฒฝ๊ณ ํ•ด์ฃผ๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜์— ๋Œ€ํ•ด์„œ ๋ฏธ๋ฆฌ ์•Œ๋ ค์ฃผ์ฃ . ๊ฐ€๊ธ‰์  ๋œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฒ„๊ทธ๋„ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋น„์Šค ํ’ˆ์งˆ์„ ๋†’์ด๋Š”๋ฐ๋„ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

ESLint์™€ Prettier๋ฅผ ๋ทฐ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ

์ผ๋‹จ Vue CLI 3.x ๋ฒ„์ „์—์„œ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ESLint์™€ Prettier๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด์ฃ .

Vue CLI 3.x๋กœ ESLint & Prettier ์„ค์ •ํ•˜๊ธฐ

ํ•˜์ง€๋งŒ ์ด๋ฏธ ๋ทฐ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ง„ํ–‰ ์ค‘์ด์‹  ๋ถ„๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

1.๋…ธ๋“œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(NPM)๋กœ ๋ฆฐํŠธ ๋ฐ ํ”„๋ฆฌํ‹ฐ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

npm i eslint eslint-config-prettier eslint-plugin-prettier eslint-plugin-vue --save-dev

2.ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๋ ˆ๋ฒจ์— ๋ฆฐํŠธ ์„ค์ • ํŒŒ์ผ์ธ .eslintrc.js๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

// .eslintrc.js
module.exports = {
  // ํ˜„์žฌ eslintrc ํŒŒ์ผ์„ ๊ธฐ์ค€์œผ๋กœ ESLint ๊ทœ์น™์„ ์ ์šฉ
  root: true,
  // ์ถ”๊ฐ€์ ์ธ ๊ทœ์น™๋“ค์„ ์ ์šฉ
  extends: [
    'eslint:recommended',
    'plugin:vue/essential',
    'prettier',
    'plugin:prettier/recommended',
  ],
  // ์ฝ”๋“œ ์ •๋ฆฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€
  plugins: ['prettier'],
  // ์‚ฌ์šฉ์ž ํŽธ์˜ ๊ทœ์น™ ์ถ”๊ฐ€
  rules: {
    'prettier/prettier': [
      'error',
      // ์•„๋ž˜ ๊ทœ์น™๋“ค์€ ๊ฐœ์ธ ์„ ํ˜ธ์— ๋”ฐ๋ผ prettier ๋ฌธ๋ฒ• ์ ์šฉ
      // https://prettier.io/docs/en/options.html
      {
        singleQuote: true,
        semi: true,
        useTabs: true,
        tabWidth: 2,
        trailingComma: 'all',
        printWidth: 80,
        bracketSpacing: true,
        arrowParens: 'avoid',
      },
    ],
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
  },
};

๊ฐ ์ฃผ์š” ์†์„ฑ์— ๋Œ€ํ•ด์„œ ๊ฐ„๋žตํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • root: ํ˜„์žฌ ํด๋” ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜์œ„์˜ ํŒŒ์ผ์— ๋ฆฐํŠธ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒ์œ„ ํด๋”์— ๋ฆฐํŠธ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • extends: ๋ฆฐํŠธ์˜ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ ๊ทœ์น™ ์ด์™ธ์— ์ถ”๊ฐ€์ ์ธ ๊ทœ์น™๋“ค์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ๋ˆ„๊ตฐ๊ฐ€์— ์˜ํ•ด ์ •ํ•ด์ง„ ๋ช‡ ๊ฐœ์˜ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • plugins: NPM์œผ๋กœ ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ๋Œ€์ค‘์ ์ธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฆฐํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • rules: ๋ฆฐํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜๋กœ ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒ€์‚ฌ์—์„œ ์ œ์™ธ ๋˜๋Š” ์ถ”๊ฐ€ํ•˜๋Š” ์†์„ฑ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ๋ฆฐํŠธ ์„ค์ • ํŒŒ์ผ ๋Œ€์‹ ์— package.json ํŒŒ์ผ์— eslintConfig ์†์„ฑ์„ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ ๊ทœ์น™ ์ ์šฉ์— ๋Œ€ํ•œ ์šฐ์„ ์ˆœ์œ„๋Š” ๋ฆฐํŠธ ์„ค์ • ํŒŒ์ผ์ด ๋” ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์„ค์ • ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

3. NPM ์„ค์ • ํŒŒ์ผ์ธ package.json ํŒŒ์ผ์— ์•„๋ž˜์˜ NPM ์ปค์Šคํ…€ ๋ช…๋ น์–ด๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

{
  "lint": "eslint --ext .js,.vue src"
}

์ฝ˜์†” ์ฐฝ์—์„œ ์œ„ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด src ํด๋” ๋ฐ‘์˜ js, vue ํŒŒ์ผ์— ๋Œ€ํ•ด์„œ ๋ฆฐํŠธ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•ž์—์„œ ๋ฆฐํŠธ ์„ค์ •์— ํ”„๋ฆฌํ‹ฐ์–ด ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฐํŠธ์˜ ๊ธฐ๋ณธ ๊ทœ์น™๊ณผ ํ•จ๊ป˜ rules์— ์„ค์ •ํ•œ ํ”„๋ฆฌํ‹ฐ์–ด ๊ทœ์น™๋„ ํ•จ๊ป˜ ์ ์šฉ๋˜์–ด ๊ฒ€์‚ฌ๋ฉ๋‹ˆ๋‹ค.

4.๋งˆ์ง€๋ง‰์œผ๋กœ ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ์ฝ”๋“œ์˜ ํ”„๋ฆฌํ‹ฐ์–ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ณ  settings.json ํŒŒ์ผ์— ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

{
  ...
  "editor.formatOnSave": false,
  "editor.codeActionsOnSave": {
      "source.fixAll.eslint": true
  },
  "eslint.alwaysShowStatus": true,
  "eslint.workingDirectories": [
      {"mode": "auto"}
  ],
  "eslint.validate": [
      "javascript",
      "typescript"
  ],
}

ํ”„๋ฆฌํ‹ฐ์–ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด VSCode์˜ Formatter ๊ธฐ๋Šฅ๊ณผ ๋ฆฐํŠธ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ์ด ๊ฒน์น˜๊ฒŒ ๋˜์–ด ์ฝ”๋“œ๊ฐ€ ์ผ๊ด€๋˜๊ฒŒ ์ •๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ผญ ํ”„๋ฆฌํ‹ฐ์–ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ์œผ๋กœ ์„ค์ •ํ•˜๊ณ  VSCode์˜ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์— ์žˆ๋Š” Formatting์„ X๋กœ ์ „ํ™˜ํ•ด์ฃผ์„ธ์š”.

VSCode์˜ Formatting ๊ธฐ๋Šฅ ๋„๊ธฐ

Vue VSCode Snippets

๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ดํŽด๋ณผ ๋„๊ตฌ๋Š” Vue VSCode Snippets์ด๋ผ๋Š” VSCode ํ™•์žฅ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. Vue์˜ ์ฝ”์–ดํŒ€ ๋ฉค๋ฒ„์ด์ž ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž์ธ Sarah Drasner๊ฐ€ ์ œ์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์Šค๋‹ˆํŽซ์€ vdata, vimport, vmethods ์ •๋„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ด€์‹ฌ ์žˆ์œผ์‹  ๋ถ„๋“ค์€ ์•„๋ž˜ ๋งํฌ๋กœ ์ ‘์†ํ•ด์„œ ์‚ดํŽด๋ณด์„ธ์š”.

Vue VSCode Snippets

Vue VSCode Snippets Demonstration

๋งˆ๋ฌด๋ฆฌ

์•„๋ฌด๋ž˜๋„ ์ด๋ฒˆ ๊ธ€์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ๊ณผ ๊ด€๋ จ๋œ ๊ธ€์ด๋‹ค๋ณด๋‹ˆ ๋”ฐ๋ผ์„œ ์ ์šฉํ•˜์‹œ๋Š”๊ฒŒ ์‰ฝ์ง„ ์•Š๊ฒ ์ง€๋งŒ ๊ทธ๋ž˜๋„ ๊ตฌ์„ฑํ•˜์‹œ๋Š”๋ฐ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž˜ ๊ตฌ์„ฑํ•˜์…”์„œ ์žฌ๋ฐŒ๊ณ  ํŽธํ•˜๊ฒŒ ์ฝ”๋”ฉํ•˜์„ธ์š”! :)

๊ธ€๋ณด๋‹ค ๋” ์‰ฝ๊ฒŒ ๋ฐฐ์šฐ๋Š” ์˜จ๋ผ์ธ ๊ฐ•์˜

์ข€ ๋” ์นœ์ ˆํ•˜๊ณ  ์ƒ์„ธํ•œ ์„ค๋ช…์„ ์›ํ•˜์‹ ๋‹ค๋ฉด ์•„๋ž˜ ๊ฐ•์ขŒ๋ฅผ ์ด์šฉํ•ด๋ณด์‹œ๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿ˜„

์ธํ”„๋Ÿฐ ์˜จ๋ผ์ธ ๊ฐ•์ขŒ : Vue.js ์—”๋“œ๊ฒŒ์ž„