ESLint, Prettier에 대하여

date
Apr 4, 2023
slug
eslint;prettier
author
status
Public
tags
ESLint
Prettier
summary
type
Post
thumbnail
eslint.png
category
💻 Develop
updatedAt
May 10, 2023 02:02 AM

ESLint와 Prettier 차이


다들 이 두개의 조합을 같이 사용한다.. 왜?
두개를 합친 익스텐션은 없는걸까;;
🚧
“ESLint는 코드 퀄리티를 보장하도록 도와주고, Prettier는 코드 스타일을 깔끔하게 혹은 통일되도록 도와준다.”
라고 하는데 잘 모르겠고 먼저 뜻부터 알아보자.
 
  • ESLint : ES는 Javascript를 의미 Lint는 에러가 있는 코드에 표시를 달아놓는것
  • Prettier: 코드 정리 규칙을 세부적으로 설정해놓으면, 정해놓은 규칙에 맞게 자동으로 정렬해서 가독성을 높이고 코드 스타일을 통일할 수 있는 플러그인.
 
아직도 잘 모르겠다;; 예시를 들면서 얘기해보겠다.

예시(ESLint)

// ESLint 적용 전
a = 2;
console.log(a) // 2
var a = 3;
console.log(a) // 3
javascript는 언어 자체의 문제이기도 하나 느슨한 체계?를 갖추고 있다. a를 변수에 선언하지 않아도 에러가 없이 콘솔에 찍히고 있다. 코드가 적을땐 문제가 되지 않지만 코드량이 많아 질수록 가독성과 문제가 생겼을 경우 찾기 쉽지않다.
 
// ESLint 적용 후
a = 2;  // 'a' is not defined.
console.log(a) // 'a' is not defined.
var b = 3; // 'b' is assigned a value but never used.
에러를 배출함. a가 변수로 선언되지 않았고, 선언되지 않은 변수를 콘솔에 찍은것에 대한 에러, b는 선언은 하였으나 사용되지 않았다는 경고를 띄움
 

예시(Prettier)

// a개발자가 작성한 코드
const test = () => {
----alert('테스트를 진행 중입니다.') // tabSize 4, no semi 
}
// b개발자가 작성한 코드
const test2 = () => {
  alert("두번째 테스트를 진행중입니다."); // tabSize 2, semi
};
협업을 할때 개발자마다 코드를 작성하는 스타일이 다르다. a개발자는 탭사이즈가 4이고 코드 마지막에 세미콜론으로 종료를 알리지 않았다.
반대로 b개발자는 탭사이즈가 2이고 코드 마지막에 세미콜론으로 종료를 알렸다.
사람마다 코드 작성 스타일이 다르기 때문에 코드가 길어질 경우 가독성에 대한 문제가 많아 질 수 있다.
 
// 탭사이즈 2, 코드 종료시 세미콜론 작성으로 Prettier 설정
// a개발자가 작성한 코드
const test = () => {
----alert('테스트를 진행 중입니다.')
}
// Prettier 검사 후
const test2 = () => {
  alert("두번째 테스트를 진행중입니다.");
};
이처럼 Prettier는 코드 구현 방식이 아닌 줄 바꿈, 공백, 들여쓰기등을 일관되게 작성되도록 도와주는 것이다.
 
이 둘의 차이를 보았으니 이제 프로젝트 환경에 어떻게 세팅되는건지 알아보겠다.
 

ESLint 세팅


ESLint를 쓰려면 당연히 ESLint를 설치해야 한다.
notion image
  • 참고: npm뒤에 -D 를 붙이는 이유는 -dev 약자로 개발용 패키지로 설치한다는 뜻이다. 자세히
 
ESLint만 설치했다고 해서 바로 사용할 수 있는 것이 아니라, eslint extension을 무조건 설치 해주어야 한다.
notion image
ESLint Extension의 설명에도 보면, 해당 워크스페이스(여기서는 해당 프로젝트)에서 eslint가 설치되어 있는지 확인해보고, 없으면 글로벌 eslint를 참조한다고 나와있다. 그리고 필요에 따라 .eslintrc 파일이 필요할 수도 있다고 설명되어 있다.
그렇다.. eslint가 프로젝트 코드 단에서 사용하는 것이 아니라, 해당 VSCode라는 에디터에 적용해서 사용하는 것이다 보니, eslint를 사용하려면 eslint extension만 설치하거나, eslint library만 설치하는 것이 아니라, 둘 다 설치 및 세팅이 되어 있어야 하는 것이다.
이제 이 eslint를 제대로 설치해주었으면, .eslintrc 파일을 통해서 lint rule을 세팅해주어야 한다.
 

.eslintrc

우선 eslint Doc에 나와있는 example은 아래와 같다.
{
    "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
우선 plugin 종류는 여러 가지 있는데, 예를 들어
  • eslint-config-airbnb-base: 에어비엔비 린트 플러그인
  • eslint-config-next: Next.js 전용 린트 플러그인
  • eslint-plugin-react: 리액트 전용 플러그인
  • eslint-plugin-prettier: 린트 위에 사용할 프리티어 플러그인
  • eslint-config-prettier: 요건 린트 설정과 중복되는 부분이 있으면 프리티어 룰에서 제외하는 플러그인
  • @typescript-eslint/eslint-plugin: : 타입스크립트 전용 린트
대충 이러한 플러그인들이 있다. 이것들 말고도 종류는 훨씬 많다.
프로젝트에 필요로 한 각 플러그인은 npm이나 yarn을 통해서 설치하면 된다.
만약 위에 @typescript-eslint/eslint-plugin을 쓸 거면, eslintrc 파일의 plugins 배열에 해당 모듈에서 제공하는 @typescript-eslint를 장착시키면 되고, 다른 모듈도 같이 쓸 거면 배열에 같이 추가하면 된다.
 
parser
각 코드 파일을 검사할 파서를 설정하는 부분이다. 기본 설정은 espree이고, 특정 @typescript-eslint/eslint-plugin처럼 특정 플러그인을 사용한다면 해당 플러그인에서 제공하는 parser를 장착하면 된다.
 
extends
eslint rule 설정이 저장되어 있는 외부 file을 extends 하는 부분이다. 위에 .eslintrc처럼 extends에 eslint:recommended, plugin:@typescript-eslint/recommended를 장착시켜주면, 사용하려는 해당 플러그인에서 기본적으로 제공하는 rule set이 적용된다.
변경하고 싶은 부분이 있다면 rules 쪽에서 커스터마이징 하면 된다.
 
rules
이쪽은 직접 lint rule을 적용하는 부분이다.extends로 자동으로 설정된 rules 중에, 특정 rule을 끄거나, erorr를 warning으로 나오도록 변경하는 등 설정을 바꿀 수 있다.
 

Prettier

Prettier를 세팅하는 방법은 2 가지가 있다.
  1. 별도의 prettier 관련 플러그인을 npm, yarn으로 설치하지 않고 VSCode의 extension을 설치.
  1. prettier 플러그인을 직접 설치 후 eslintrc에 세팅.
 
1 번째 방법은 프로젝트 자체에 prettier 룰을 세팅하는 것이 아니라, eslint처럼 현재 내가 쓰고 있는 VSCode 에디터 자체에 prettier rule을 세팅하는 것이다. 따라서 내 환경의 VSCode에서만 해당 prettier 방식이 적용되는 것이다.
반대로 2번째는 프로젝트 자체에 prettier rule을 세팅한 것으로, 해당 프로젝트를 다른 환경에서 돌려도 동일하게 prettier rule을 적용해서 사용할 수 있는 방식이다.
 
상대적으로 쉬운 첫번째 방법부터 알아보자

Prettier Extension 설치

notion image
 
Prettier-code formatter는 설치하는 순간 바로 적용된다.
해당 prettier에 대한 상세 설정 방식은 docs에 들어가면 설명이 아주 잘 나와있다.
command + shift + p를 누르면 나타나는 검색 창에, Open User Settings로 들어가서 prettier를 검색하면, prettier 관련 설정할 수 있는 리스트들이 나타난다. 여기서 여러분들 입맛에 맞게 설정하면 적용된다.
 
notion image
 
어느 글에서는 VSCode의 settings에서 설정하라고 하고, 어디에서는 .prettierrc 파일을 만들라고 되어있는데, 요건 또 어떻게 다른 걸까?
우선 VSCode Settings는 현재 내 PC의 VSCode 환경에 대한 세팅이기 때문에, VSCode Extension으로 설치한 prettier 플러그인에만 적용이 가능하고, npm이나 yarn으로 설치해서 세팅한 prettier 플러그인에는 적용되지 않는다.따라서 yarn, npm으로 prettier를 설치했다면, .prettierrc 파일을 꼭 이용해야 한다.
그리고 적용 우선순위가 다른데, Prettier를 VSCode Extension으로 설치했다면, VSCode Settings의 prettier에서도 설정할 수 있고, .prettierrc 파일로도 설정이 가능하지만, .prettierrc 파일이 있으면 VSCode Settings의 설정은 무시되고 .prettierrc 파일로 룰이 적용된다.
 

Prettier 직접 설치

이번엔 Prettier 플러그인을 직접 npm, yarn으로 설치 후 세팅하는 방법을 알아보자. 요것도 역시나 prettier Docs를 보면 사용법이 상세하게 나와있다.
우선 prettier를 설치하자.
$ npm install -D prettier
// or
$ yarn add -D prettier
 
Docs를 보면, eslint를 사용하면, eslint-config-prettier 를 설치해서 세팅하라고 알려주고 있다.
eslint-config-prettier가 무엇을 하는 녀석인지 확인해보자.
notion image
 
eslint-config-prettier
notion image
 
이 글로만 읽으면 정확히 무엇을 하는 친구인지 이해하기 힘든데, 우선 eslint와 중복되는 규칙을 prettier 쪽에서 알아서 꺼주는 역할을 한다고 한다.
notion image
해당 플러그인이 eslint 모듈 중 어떤 부분과 관련된 부분을 끄는지 보여준다. 그런데 아래에 eslint-plugin-prettier라는 게 있다?
 
 
eslint-plugin-prettier
notion image
 
코드 내에서 prettier에 걸린 부분들을 린트 에러로 걸린 것으로 보고하도록 하는 플러그인인 것을 알 수 있다.
정확히는 모르겠지만 아마 prettier 룰에 맞지 않는 부분을 에러로 파악하기 위한 설정 같다.
notion image
 
.eslintrc 파일에 어떻게 설정해야할지 자세히 설명해주고 있다.
"plugin:prettier/recommended"를 extends하면, 아래처럼 확장 설정이 되는 것을 알 수 있었다.
// .eslintrc
{
  "extends": ["prettier"],
  "plugins": ["prettier"],
  "rules": {
    "prettier/prettier": "error",
    "arrow-body-style": "off",
    "prefer-arrow-callback": "off"
  }
}
 
  • "extends": ["prettier"]: eslint-config-prettier를 실제로 활성화시켜서 중복되는 룰을 끄도록 하는 설정.
  • "plugins": ["prettier"]: prettier 플러그인 등록하는 설정.
  • prettier/prettier: "error": eslint 내에서 prettier가 돌아갈 때, prettier 규칙에 맞지 않는 요소들을 error로 판단하도록 하는 설정.
  • "arrow-body-style": "off", "prefer-arrow-callback": "off": eslint와 같이 사용하는 부분에 있어, 내부적인 이슈가 있어서, 임의로 두 설정을 꺼야 함.
 
위 설정들을 하나하나 해줄 필요 없이, 아래처럼 한 번에 설정하면 된다.
// .eslintrc
{
  "extends": ["plugin:prettier/recommended"]
}
이제 상세한 prettier rule 세팅은 root 디렉토리의 .prettierrc 파일이 있는지를 찾고, 해당 파일의 rule을 이용하게 된다.
(.eslintrc 자체에도 선언할 수 는 있으나, 가독성을 위해 .prettierrc로 분리해서 하는 것을 권장.)