안녕하세요, 똑똑한개발자에서 프론트엔드 개발을 하는 이호균입니다.

들여쓰기가 맞지 않아도, 변수를 선언하고 사용하지 않아도, 모든 곳에 any 타입을 사용하여도 어플리케이션은 동작합니다. 동작하니까 문제가 없는 것 같아보이지만 사실 문제가 있습니다. 가독성도 나쁘고, 유지보수가 어렵습니다. any를 남발하였으니 compile time 잡을 수 있었던 문제들이 runtime까지 갑니다.

프로젝트에 ESLint와 prettier를 추가하여 최소한의 코드 품질과 일관된 코드 스타일을 보장하는 방법을 알아봅니다.

프로젝트 생성

// 생성
npx create-next-app <MY-AWESOME-APP>

// config 파일 생성
touch tsconfig.json

// 프로젝트 실행
npm run dev

// typescript를 설치하라는 다음과 같은 메시지가 출력됩니다.
// Please install typescript and @types/react by running: npm install --save-dev typescript @types/react

// @types/react-dom, @types/node를 추가하여 설치합니다.
npm install --save-dev typescript @types/react @types/react-dom @types/node

// 프로젝트 실행 및 정상 작동 확인
npm run dev

tsconfig.json

절대경로 임포트를 위하여 baseUrl를 .(root)로 설정, strict를 true 설정하여 더 빡빡한 type checking으로 변경합니다. 이외 나머지 설정은 개인 및 팀의 의견에 맞춰서 변경하면 될 것 같습니다.

{
  "compilerOptions": {
    "baseUrl": ".",
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve"
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
  "exclude": ["node_modules"]
}

ESLint와 Prettier 설정

모든 세팅이 끝나면 ESLint가 linting을 담당하여 코드에서 문제점을 검사하고 고쳐줍니다. 그리고 Prettier는 formatting을 담당하여 일관된 코드 스타일을 따르도록 변환해줍니다.

ESLint

아래 명령을 실행하면 ESLint 셋팅을 어떻게 할 것인지 묻는 질문들이 나타납니다. 차례대대로 완료하면 .eslintrc.js 파일을 생성해줍니다.

npx eslint --init

? How would you like to use ESLint? …
  To check syntax only
❯ To check syntax and find problems
  To check syntax, find problems, and enforce code style

차례대로 다음과 같은 응답을 선택하여 진행합니다.

✔ How would you like to use ESLint? · problems
✔ What type of modules does your project use? · esm
✔ Which framework does your project use? · react
✔ Does your project use TypeScript? · Yes
✔ Where does your code run? · browser, node
✔ What format do you want your config file to be in? · JavaScript

Local ESLint installation not found.
The config that you've selected requires the following dependencies: eslint-plugin-react@latest @typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest eslint@latest

✔ Would you like to install them now with npm? · Yes

이렇게 생성된 .eslintrc.js 파일에 설정을 추가, 삭제하여 사용할 수 있습니다. 제 설정은 다음과 같습니다. 각 항목에 대해서 간단한 설명을 추가하였으니 본인에게 알맞게 수정하시면 됩니다.

// .eslintrc.js
module.exports = {
  env: {
    // 전역 변수 사용을 정의합니다. 추가하지 않으면 ESLint 규칙에 걸리게 됩니다.
    browser: true,
    es6: true,
    node: true,
  },
  extends: [
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:@typescript-eslint/recommended", // 해당 플러그인의 권장 규칙을 사용합니다.
  ],
  parser: "@typescript-eslint/parser", // ESLint 파서를 지정합니다.
  parserOptions: {
    ecmaFeatures: {
      jsx: true, // JSX를 파싱할 수 있습니다.
    },
    ecmaVersion: 12, // Modern ECMAScript를 파싱할 수 있습니다.
    sourceType: "module", // import, export를 사용할 수 있습니다.
  },
  plugins: ["react", "@typescript-eslint"],
  rules: {
    // ESLint 규칙을 지정합니다. extends에서 지정된 규칙을 덮어 쓸수도 있습니다.
    "react/react-in-jsx-scope": "off",
    "react/prop-types": "off",
  },
  settings: {
    react: {
      version: "detect", // 현재 사용하고 있는 react 버전을 eslint-plugin-react가 자동으로 감지합니다.
    },
  },
};

Prettier

.prettierrc.js 파일을 생성하고 원하는 설정을 추가합니다. 제 설정은 다음과 같습니다.

module.exports = {
  semi: true,
  trailingComma: "all",
  singleQuote: true,
  printWidth: 160,
  tabWidth: 2,
};

ESLint와 Prettier를 함께 사용하기 위해서 다음과 같이 설치를 합니다.

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

eslint-config-prettier는 Prettier와 충돌할 수 있는 ESLint 규칙들을 꺼줍니다. eslint-plugin-prettier는 Prettier가 ESLint의 규칙으로써 동작하도록 만들어줍니다.

다음과 같이 규칙을 추가합니다.

{
  extends: [
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:@typescript-eslint/recommended", // 해당 플러그인의 권장 규칙을 사용합니다.
    "plugin:prettier/recommended", // plugin과 eslint-config-prettier 설정을 한번에 합니다.
  ],
};

eslint-config-prettier v8.0.0부터 prettier/react와 같은 추가적인 exclusion이 필요 없어졌습니다.

VS Code에서 자동으로 코드를 고치는 법

앞의 설정을 모두다 했다고해서 eslint가 자동으로 코드를 고쳐주지는 않습니다. 개발자가 일일히 손으로 고치는 것은 너무 번거로운 일이니 vscode의 도움을 받아 이를 자동화하겠습니다. settings.json 파일을 열고 다음과 같이 추가합니다.

{
  "editor.codeActionsOnSave": { "source.fixAll.eslint": true },
  "files.autoSave": "onFocusChange"
}

이제 코드를 저장할때 마다 eslint가 동작합니다. cmd + s를 누르는 것도 번거로우니 자동 저장 옵션을 추가합니다. 모든 설정이 끝났습니다.

추가하면 더 좋은 설정

husky와 lint-staged를 이용하여 staged 상태의 파일들을 commit하기 전에 eslint를 강제하여 문제있는 코드는 remote repo에 올릴 수 없게 만들 수 있습니다. 여럿이 함께하는 프로젝트라면 확실히 도움이 됩니다.

husky v4와 v6의 설정이 다릅니다. 공식문서를 확인하세요.

마지막으로 제가 사용하는 프로젝트 설정을 공유합니다.

hokyun.rhee's profile image

hokyun.rhee

2021-05-14 18:30

Read more posts by this author