Javascript 프로젝트

문법 검사와 코드 품질 관리

ESLint 를 사용하여 자동화하기

Youngbin Han (sukso96100@gmail.com)

여러 명에서 팀 프로젝트를 할 때...

  • 서로 다른 코딩 스타일
  • 서로 다른 디자인 패턴 선호
  • 서로 다른 문법 선호
  • 서로 다른 툴 사용
  • 서로 다른... 블라블라블라...

규칙을 좀 미리 정하자

안 그러면 나중에

분명히 옆 사진속의

사람들 처럼 싸운다.

그냥 정하기만 하지 말고

강제도 좀 해야한다.

  • 분명 규칙 실수로 어기는 사람 한두명 있다.
  • 분명 규칙 어긴 코드 그대로 커밋하는 사람 한두명 있다.
  • 분명 코드를 한번에 너무 많이 손봐서 규칙 체크 귀찮을 때 있다.
  • 분명 규칙 잘 지키는지 리뷰하기 귀찮을 때 있다.
  • 분명 육안으로 잡아내기 어려운 규칙 위반도 있다.
  • 그리고 분명히 지키기 귀찮아 하는 사람도... 한두명...

어떻게 하면 잘 지키게

할 수 있을까?

이런 귀찮은 것을 자동으로 체크하고 고쳐주는 도구를 사용해 보자.

Javascript Linter

  • ESLint - 본 발표에서 사용할 Linter
  • JSHint
  • JSLint

ESLint 를 선택한 이유?

  • 문서화가 잘 되어있음
  • 다양한 문법체크 기능 지원
  • 플러그인 활용하여 다양한 프로젝트에 적용
  • 널리 쓰이는 유명한 규칙을 플러그인으로 사용 가능.

설치

# npm 사용하여 global 모듈로 설치
npm install -g eslint
# npm 사용하여 devDependencies 로 설치
npm install --save-dev eslint
# yarn 사용하여 global 모듈로 설치
yarn global add eslint
# yarn 사용하여 devDependencies 로 설치
yarn add --dev eslint

설정파일 생성

# global 모듈로 설치한 경우
eslint --init
# devDependencies 로 설치한 경우
./node_modules/.bin/eslint --init

콘솔창에 나타나는 선택지를 선택하여 설정파일 생성

선택 예제

? How would you like to configure ESLint? Answer questions about your style
? Are you using ECMAScript 6 features? Yes
? Are you using ES6 modules? No
? Where will your code run? Node
? Do you use JSX? No
? What style of indentation do you use? Tabs
? What quotes do you use for strings? Double
? What line endings do you use? Unix
? Do you require semicolons? Yes
? What format do you want your config file to be in? YAML
Successfully created .eslintrc.yml file in /Users/youngbin/projects/skhu-backend

설정파일 예제

env:
  es6: true
  node: true
extends: 'eslint:recommended'
rules:
  indent:
    - error
    - tab
  linebreak-style:
    - error
    - unix
  quotes:
    - error
    - double
  semi:
    - error
    - always

env - ESLint 전역환경 값

extends - 기반으로 쓸 설정셋

rules - 코드 검사에 쓸 규칙

rules

  • indent - 들여쓰기 스타일 - tab/space
  • linebreak-style - 줄바꿈 스타일 - unix/windows
  • quotes - 문자열 선언시 쓰는 따옴표 - single/double
  • semi - 세미콜론 강제 여부 - always/never

검사 실행

# eslint 파일1 파일2 ... [명령줄 옵션]
eslint app.js routes/*
# eslint 파일1 파일2 ... [명령줄 옵션] + 자동수정
eslint app.js routes/* --fix

package.json 에 추가하여 사용

{
  ...
  "scripts": {
    ...
    "lint": "eslint *.js src/*", 
    "lint-fix": "eslint *.js src/* --fix"
  },
  ...
}
# 코드 검사 - npm
npm run lint
# 코드 검사 및 자동 수정 - npm
npm run lint-fix
# 코드 검사 - yarn
yarn run lint
# 코드 검사 및 자동 수정 - yarn
yarn run lint-fix

Travis CI / GitLab CI 연동

language: node_js # 언어는 Node.js 로
node_js:
  - "10" # 버전은 10.x
install: # 스크립트 실행 전 설치 작업
  - npm install # 스크립트 실행 전 의존성 설치
script: # CI 본 스크립트
  - npm run lint # package.json 에 정의해 둔 lint 명령 실행
image: node:latest # Docker Hub 의 node:latest 이미지 환경 기반으로 실행

lint: # lint 라는 작업 정의
  before_script: # 스크립트 실행 전 작업
    - npm install -g yarn # yarn 설치
    - yarn install # yarn 으로 의존성 설치
  script: # lint 작업의 CI 본 스크립트
    - yarn run lint # package.json 에 정의해 둔 lint 명령 실행

ESLint 에 Prettier

Code Formatter

같이 사용하기

Prettier 와 ESLint 용 플러그인을 Dev 의존성으로 설치

# Yarn 사용시
yarn add --dev prettier eslint-plugin-prettier

# npm 사용시
npm install --save-dev prettier eslint-plugin-prettier

ESLint 설정에 추가

...
plugins:
  - prettier
rules:
  ...
  prettier/prettier:
    - error
  ...
...

deck

By sukso96100

deck

  • 399