๐ ESLint ๊ท์น ์ปค์คํฐ๋ง์ด์ง์ผ๋ก ์ฝ๋ ํ์ง ํฅ์ํ๊ธฐ ๐

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ๊ฐ๋ฐ์๋ค์ ํ์ ์น๊ตฌ, ESLint์ ๋ํด ๊น์ด ํํค์ณ๋ณผ ๊ฑฐ์์. ํนํ ESLint ๊ท์น์ ์ปค์คํฐ๋ง์ด์งํด์ ์ฐ๋ฆฌ์ ์ฝ๋ ํ์ง์ ํ ๋จ๊ณ ์ ๊ทธ๋ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ๋๋๋ค. ์ฌ๋ฅ๋ท์ 'JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ฑ ์ด์ธ๋ฆฌ๋ ์ฃผ์ ์ฃ ? ใ ใ
์, ์ด์ ์์ํด๋ณผ๊น์? ์ค๋น๋์ จ๋์? ๊ทธ๋ผ ๊ณ ๊ณ ์ฝ~! ๐โโ๏ธ๐จ
๐ค ESLint๊ฐ ๋ญ๊ธธ๋?
ESLint๋ผ๊ณ ํ๋ฉด ๋ญ๊ฐ ๋ ์ค๋ฅด์๋์? '์๋ฌ ์ก์์ฃผ๋ ๋๊ตฌ?' '์ฝ๋ ์คํ์ผ ์ง์ผ์ฃผ๋ ์น๊ตฌ?' ๋ค, ๋ง์์! ํ์ง๋ง ๊ทธ๊ฒ ๋ค๊ฐ ์๋๋๋๋ค.
ESLint๋ JavaScript ์ฝ๋์์ ๋ฐ๊ฒฌ ๋ ๋ฌธ์ ํจํด์ ์๋ณํ๊ณ ๋ณด๊ณ ํ๋ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ์์. ์ฝ๊ฒ ๋งํด, ์ฐ๋ฆฌ๊ฐ ์ฝ๋ฉํ ๋ ์ค์๋ก ๋์น ์ ์๋ ๋ถ๋ถ๋ค์ ๋ฏธ๋ฆฌ ์ฒดํฌํด์ฃผ๋ ๋๋ํ ์น๊ตฌ๋ผ๊ณ ๋ณผ ์ ์์ฃ .
ESLint๋ ์ฐ๋ฆฌ์ ์ฝ๋๋ฅผ ๊ฒ์ฌํ๋ฉด์ ์ด๋ฐ ๊ฒ๋ค์ ์ฒดํฌํด์ค์:
- ๋ฌธ๋ฒ ์ค๋ฅ ๐ซ
- ์ ์ฌ์ ์ธ ๋ฒ๊ทธ ๐
- ์ฝ๋ฉ ์คํ์ผ ๋ถ์ผ์น ๐จ
- ์ํฐ ํจํด ์ฌ์ฉ โ ๏ธ
๊ทธ๋ฐ๋ฐ ๋ง์ด์ฃ , ESLint๊ฐ ์ ๋ง ๋๋จํ ์ด์ ๋ ๋ฐ๋ก ์ด๊ฑฐ์์. ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋๋ก ๊ท์น์ ์ปค์คํฐ๋ง์ด์งํ ์ ์๋ค๋ ๊ฑฐ! ๐
์๋ฅผ ๋ค์ด, ์ฌ๋ฌ๋ถ์ด ์ธ๋ฏธ์ฝ๋ก ์ ๊ผญ ์จ์ผ ํ๋ค๊ณ ์๊ฐํ์๋์? ์๋๋ฉด ์ ์จ๋ ๋๋ค๊ณ ์๊ฐํ์๋์? ESLint๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๊ท์น์ ํ์ด๋ ํ๋ก์ ํธ์ ๋ง๊ฒ ์ค์ ํ ์ ์์ด์. ์์ ๊ฟ์ด์ฃ ? ๐ฏ
์ด์ ESLint๊ฐ ๋ญ์ง ๋์ถฉ ๊ฐ์ด ์ค์์ฃ ? ๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ESLint ๊ท์น์ ์ปค์คํฐ๋ง์ด์งํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ๊น์? ๋ ์ธ ๊ณ ~! ๐
๐ ๏ธ ESLint ์ค์นํ๊ณ ์ค์ ํ๊ธฐ
์, ์ด์ ESLint๋ฅผ ์ค์นํ๊ณ ์ค์ ํด๋ณผ ๊ฑฐ์์. ๊ฑฑ์ ๋ง์ธ์, ์ด๋ ต์ง ์์์! ๊ทธ๋ฅ ์ ๊ฐ ํ๋ ๋๋ก ๋ฐ๋ผ์ค์๋ฉด ๋ฉ๋๋ค. ๐
1. ESLint ์ค์นํ๊ธฐ
๋จผ์ , ํฐ๋ฏธ๋์ ์ด๊ณ ํ๋ก์ ํธ ํด๋๋ก ์ด๋ํด์ฃผ์ธ์. ๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณผ๊น์?
npm install eslint --save-dev
์ด ๋ช ๋ น์ด๋ ESLint๋ฅผ ๊ฐ๋ฐ ์์กด์ฑ์ผ๋ก ์ค์นํด์. ๋ญ ์๋ฆฌ๋๊ณ ์? ์ฝ๊ฒ ๋งํด์, ์ด ๋๊ตฌ๋ ๊ฐ๋ฐํ ๋๋ง ํ์ํ๊ณ ์ค์ ํ๋ก๋์ ํ๊ฒฝ์์๋ ํ์ ์๋ค๋ ๋ป์ด์์.
2. ESLint ์ด๊ธฐํํ๊ธฐ
ESLint๋ฅผ ์ค์นํ๋ค๋ฉด, ์ด์ ์ด๊ธฐํ๋ฅผ ํด์ค์ผ ํด์. ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด์ฃผ์ธ์:
npx eslint --init
์ค, ๋ญ๊ฐ ์ง๋ฌธ๋ค์ด ๋์ค๋ค์! ๐ฎ ๊ฑฑ์ ๋ง์ธ์, ํ๋์ฉ ์ฒ์ฒํ ์ดํด๋ณผ๊ฒ์.
- How would you like to use ESLint? - ๋ณดํต์ "To check syntax, find problems, and enforce code style"์ ์ ํํด์.
- What type of modules does your project use? - ํ๋ก์ ํธ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง, ์์ฆ์ ์ฃผ๋ก "JavaScript modules (import/export)"๋ฅผ ๋ง์ด ์ฌ์ฉํด์.
- Which framework does your project use? - React, Vue, None of these ์ค์ ์ ํํ๋ฉด ๋ผ์.
- Does your project use TypeScript? - TypeScript ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ์ ํํด์ฃผ์ธ์.
- Where does your code run? - Browser, Node ๋ฑ ์ฝ๋๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ์ ํํด์.
- How would you like to define a style for your project? - "Use a popular style guide"๋ฅผ ์ ํํ๋ฉด ์ข์์.
- Which style guide do you want to follow? - Airbnb, Standard, Google ์ค์ ์ ํํ ์ ์์ด์. ์ ๋ Airbnb๋ฅผ ์ข์ํด์!
- What format do you want your config file to be in? - JavaScript, YAML, JSON ์ค์ ์ ํํ ์ ์์ด์. ์ ๋ JSON์ ์ ํธํด์.
์ฐ์~ ์ด์ .eslintrc.json ํ์ผ์ด ์๊ฒผ์ด์! ๐ ์ด ํ์ผ์ด ๋ฐ๋ก ESLint์ ์ค์ ํ์ผ์ด์์. ์ด์ ์ด ํ์ผ์ ์์ ํด์ ์ฐ๋ฆฌ๋ง์ ๊ท์น์ ๋ง๋ค์ด๋ณผ ๊ฑฐ์์!
์, ์ด์ ESLint๋ฅผ ์ค์นํ๊ณ ์ด๊ธฐ ์ค์ ์ ๋ง์ณค์ด์. ๋ค์ ์น์ ์์๋ ์ด ์ค์ ํ์ผ์ ์ด๋ป๊ฒ ์์ ํ๋์ง ์์๋ณผ ๊ฑฐ์์. ๊ธฐ๋๋์ง ์๋์? ๐
๐จ ESLint ๊ท์น ์ปค์คํฐ๋ง์ด์งํ๊ธฐ
์, ์ด์ ์ง์ง ์ฌ๋ฏธ์๋ ๋ถ๋ถ์ด ์์ด์! ESLint ๊ท์น์ ์ฐ๋ฆฌ ์ ๋ง๋๋ก ๋ฐ๊ฟ๋ณผ ๊ฑฐ์์. ๋ญ๊ฐ ์๋ฆฌํ๋ ๊ฒ ๊ฐ์ง ์๋์? ๐ณ
1. .eslintrc.json ํ์ผ ์ด๊ธฐ
๋จผ์ , ํ๋ก์ ํธ ๋ฃจํธ ํด๋์ ์๋ .eslintrc.json ํ์ผ์ ์ด์ด์ฃผ์ธ์. ๋ญ๊ฐ ์ด๋ฐ ๋ชจ์์ผ ๊ฑฐ์์:
{
"env": {
"browser": true,
"es2021": true
},
"extends": "airbnb-base",
"parserOptions": {
"ecmaVersion": 12,
"sourceType": "module"
},
"rules": {
}
}
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์ฃผ๋ชฉํ ๋ถ๋ถ์ ๋ฐ๋ก "rules" ๊ฐ์ฒด์์. ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ง์ ๊ท์น์ ์ถ๊ฐํ ์ ์์ด์!
2. ๊ท์น ์ถ๊ฐํ๊ธฐ
์, ์ด์ ๋ช ๊ฐ์ง ๊ท์น์ ์ถ๊ฐํด๋ณผ๊น์? ์๋ฅผ ๋ค์ด, ์ธ๋ฏธ์ฝ๋ก ์ ๊ฐ์ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ ๊ฒ ํ ์ ์์ด์:
{
// ... ๋ค๋ฅธ ์ค์ ๋ค
"rules": {
"semi": ["error", "always"]
}
}
์ด ๊ท์น์ ์ธ๋ฏธ์ฝ๋ก ์ ํญ์ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํด์. ๋ง์ฝ ์ธ๋ฏธ์ฝ๋ก ์ ๋นผ๋จน์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ ๋ป์ด์ฃ .
๋ ๋ค๋ฅธ ์๋ฅผ ๋ค์ด๋ณผ๊น์? ๋ค์ฌ์ฐ๊ธฐ๋ฅผ 2์นธ์ผ๋ก ๊ฐ์ ํ๊ณ ์ถ๋ค๋ฉด:
{
// ... ๋ค๋ฅธ ์ค์ ๋ค
"rules": {
"semi": ["error", "always"],
"indent": ["error", 2]
}
}
์ด๋ ๊ฒ ํ๋ฉด ๋ค์ฌ์ฐ๊ธฐ๋ฅผ 2์นธ์ผ๋ก ํ์ง ์์ผ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํด์. ๊น๋ํ ์ฝ๋๋ฅผ ์ํด์์ฃ ! โจ
3. ๊ท์น ์ปค์คํฐ๋ง์ด์ง ์์
์ด์ ์ข ๋ ๋ค์ํ ๊ท์น๋ค์ ์ดํด๋ณผ๊น์? ์ฌ๋ฌ๋ถ์ ์ฝ๋ฉ ์คํ์ผ์ ๋ง๊ฒ ๊ท์น์ ์ค์ ํ ์ ์์ด์.
{
// ... ๋ค๋ฅธ ์ค์ ๋ค
"rules": {
"semi": ["error", "always"],
"indent": ["error", 2],
"quotes": ["error", "single"],
"no-console": "warn",
"max-len": ["error", { "code": 80 }],
"no-unused-vars": "error",
"camelcase": "error"
}
}
์ด ์ค์ ์ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ์ ์ฉํด์:
- ์ธ๋ฏธ์ฝ๋ก ํ์
- ๋ค์ฌ์ฐ๊ธฐ 2์นธ
- ๋ฌธ์์ด์ ์์๋ฐ์ดํ ์ฌ์ฉ
- console.log() ์ฌ์ฉ ์ ๊ฒฝ๊ณ
- ํ ์ค ์ต๋ 80์
- ์ฌ์ฉํ์ง ์๋ ๋ณ์ ๊ธ์ง
- ๋ณ์๋ช ์ ์นด๋ฉ์ผ์ด์ค ์ฌ์ฉ
์~ ์ด์ ์ฐ๋ฆฌ๋ง์ ์ฝ๋ฉ ์คํ์ผ์ด ์์ฑ๋์ด์! ๐
์ด๋ ๊ฒ ๊ท์น์ ์ค์ ํ๋ฉด, ์ฌ๋ฌ๋ถ์ ์ฝ๋๊ฐ ํจ์ฌ ๋ ์ผ๊ด์ฑ ์๊ณ ๊น๋ํด์ง ๊ฑฐ์์. ๋ง์น ์ ์์ฌ๊ฐ ์ ์์ ๊ฐ๊พธ๋ฏ์ด, ์ฐ๋ฆฌ๋ ์ฝ๋๋ฅผ ๊ฐ๊ฟ ์ ์๋ต๋๋ค. ๐ฑ
ํ์ง๋ง ์ฃผ์ํ์ธ์! ๋๋ฌด ๋ง์ ๊ท์น์ ํ ๋ฒ์ ์ ์ฉํ๋ฉด ์คํ๋ ค ์ฝ๋ฉ์ด ํ๋ค์ด์ง ์ ์์ด์. ํ์๋ค๊ณผ ์์ํด์ ์ ์ ํ ๊ท์น์ ์ ํ๋ ๊ฒ ์ข๋ต๋๋ค.
๋ค์ ์น์ ์์๋ ์ด๋ ๊ฒ ์ค์ ํ ๊ท์น์ ์ด๋ป๊ฒ ์ ์ฉํ๊ณ ํ์ธํ๋์ง ์์๋ณผ ๊ฑฐ์์. ๊ธฐ๋๋์ง ์๋์? ๐
๐ ESLint ๊ท์น ์ ์ฉํ๊ณ ํ์ธํ๊ธฐ
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ์ค์ ํ ๋ฉ์ง ๊ท์น๋ค์ ์ค์ ๋ก ์ ์ฉํด๋ณผ ์๊ฐ์ด์์! ๋ง์น ์ ์ท์ ์ ์ด๋ณด๋ ๊ฒ์ฒ๋ผ ์ค๋ ์ง ์๋์? ๐
1. ESLint ์คํํ๊ธฐ
ํฐ๋ฏธ๋์ ์ด๊ณ , ํ๋ก์ ํธ ํด๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณผ๊น์?
npx eslint .
์ด ๋ช ๋ น์ด๋ ํ์ฌ ํด๋์ ๊ทธ ํ์ ํด๋์ ๋ชจ๋ JavaScript ํ์ผ์ ๊ฒ์ฌํด์. ์์ฐ, ๋ญ๊ฐ ๋ง์ด ๋์ค์ฃ ? ๐
2. ์๋ฌ ํ์ธํ๊ธฐ
ESLint๋ฅผ ์คํํ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ค์ ํ ๊ท์น์ ์๋ฐํ ๋ถ๋ถ๋ค์ด ํ์๋ผ์. ์๋ฅผ ๋ค์ด ์ด๋ฐ ์์ผ๋ก์:
/Users/username/project/src/index.js
5:1 error Expected indentation of 2 spaces but found 4 indent
7:21 error Missing semicolon semi
9:1 warn Unexpected console statement no-console
์ด๋ฐ ๋ฉ์์ง๊ฐ ๋ณด์ด๋ฉด ๋นํฉํ์ง ๋ง์ธ์! ์ด๊ฑด ์ฐ๋ฆฌ ์ฝ๋๊ฐ ๋ ์ข์์ง ์ ์๋ค๋ ์ ํธ์์. ๋ง์น ์ ์๋์ด ์์ ๋ฅผ ์ฑ์ ํด์ฃผ๋ ๊ฒ์ฒ๋ผ์. ๐
3. ์๋์ผ๋ก ๊ณ ์น๊ธฐ
์ผ์ผ์ด ์์ ํ๊ธฐ ๊ท์ฐฎ์ฃ ? ESLint๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ๊ณ ์ณ์ค ์ ์์ด์. ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด๋ณด์ธ์:
npx eslint . --fix
์! ๋ง๋ฒ์ฒ๋ผ ๋ง์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ฃ ? ๐ฉโจ ํ์ง๋ง ๋ชจ๋ ๋ฌธ์ ๊ฐ ์๋์ผ๋ก ํด๊ฒฐ๋์ง ์์์. ์ผ๋ถ๋ ์ฐ๋ฆฌ๊ฐ ์ง์ ์์ ํด์ผ ํด์.
4. IDE์ ESLint ์ฐ๋ํ๊ธฐ
๋งค๋ฒ ํฐ๋ฏธ๋์์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ ๊ฑด ๊ท์ฐฎ์ฃ ? ๋คํํ ๋๋ถ๋ถ์ ํ๋์ ์ธ IDE๋ ESLint๋ฅผ ์ง์ํด์. VS Code๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ESLint ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ค์นํด๋ณด์ธ์.
์ค์นํ๊ณ ๋๋ฉด ์ฝ๋๋ฅผ ์์ฑํ๋ ๋์ ์ค์๊ฐ์ผ๋ก ESLint ๊ฒฝ๊ณ ์ ์๋ฌ๋ฅผ ๋ณผ ์ ์์ด์. ๋ง์น ์์์ ์ฝ์น๊ฐ ์กฐ์ธํด์ฃผ๋ ๊ฒ ๊ฐ์ฃ ? ๐จโ๐ซ
์ด๋ ๊ฒ IDE์ ์ฐ๋ํ๋ฉด ์ค์๊ฐ์ผ๋ก ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์์ด์. ์ฝ๋๋ฅผ ์์ฑํ๋ฉด์ ๋์์ ๋ฐฐ์ธ ์ ์๋ ๊ฑฐ์ฃ . ์์ ์ผ์์ด์กฐ ์๋๊ฐ์? ๐
5. Git Hooks ์ฌ์ฉํ๊ธฐ
ํ ํ๋ก์ ํธ๋ฅผ ํ๊ณ ์๋ค๋ฉด, Git Hooks๋ฅผ ์ฌ์ฉํด๋ณด๋ ๊ฒ๋ ์ข์์. ์ปค๋ฐํ๊ธฐ ์ ์ ์๋์ผ๋ก ESLint๋ฅผ ์คํํ๋๋ก ์ค์ ํ ์ ์๊ฑฐ๋ ์.
Husky๋ผ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ์ค์ ํ ์ ์์ด์. ์ด๋ ๊ฒ ํ๋ฉด ์ค์๋ก ๋ฆฐํธ ์๋ฌ๊ฐ ์๋ ์ฝ๋๋ฅผ ์ปค๋ฐํ๋ ์ผ์ ๋ฐฉ์งํ ์ ์์ฃ . ๋ง์น ๋ฌธ์ง๊ธฐ๊ฐ ์ง์ผ์ฃผ๋ ๊ฒ์ฒ๋ผ์! ๐ง
ํ: Git Hooks๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์ ์ฒด์ ์ฝ๋ ํ์ง์ ์ผ๊ด๋๊ฒ ์ ์งํ ์ ์์ด์. ํ์ง๋ง ์ฒ์์๋ ์กฐ๊ธ ๊ท์ฐฎ๊ฒ ๋๊ปด์ง ์ ์์ผ๋, ํ์๋ค๊ณผ ์ถฉ๋ถํ ์์ํ ํ์ ๋์ ํ๋ ๊ฒ ์ข์์!
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ์ค์ ํ ESLint ๊ท์น์ ์ ์ฉํ๊ณ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์์๋ดค์ด์. ์ด๋์? ์๊ฐ๋ณด๋ค ์ด๋ ต์ง ์์ฃ ? ๐
๋ค์ ์น์ ์์๋ ESLint๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ๋ค์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ESLint๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ง๋ง, ์๋ชป ์ฌ์ฉํ๋ฉด ์คํ๋ ค ๋ ์ด ๋ ์ ์๊ฑฐ๋ ์. ๊ทธ๋ผ ๊ณ์ ๊ฐ๋ณด์๊ณ ์! ๐โโ๏ธ๐จ
โ ๏ธ ESLint ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
ESLint๋ ์ ๋ง ์ ์ฉํ ๋๊ตฌ์ง๋ง, ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ๋ค์ด ์์ด์. ๋ง์น ๋ ์นด๋ก์ด ์นผ์ฒ๋ผ, ์ ์ฐ๋ฉด ์๋ฆฌ์ฌ์ ์๊ธธ์ด ๋์ง๋ง ์๋ชป ์ฐ๋ฉด ๋ค์น ์ ์์ฃ . ๊ทธ๋ผ ์ด๋ค ์ ๋ค์ ์กฐ์ฌํด์ผ ํ ๊น์? ๐ค
1. ๊ณผ๋ํ ๊ท์น ์ค์ ์ฃผ์
๊ท์น์ ๋ง์ผ๋ฉด ๋ง์์๋ก ์ข๋ค๊ณ ์๊ฐํ์๋์? ์... ๊ทธ๋ ์ง ์์์! ๐
์ฃผ์: ๋๋ฌด ๋ง์ ๊ท์น์ ์ค์ ํ๋ฉด ์คํ๋ ค ๊ฐ๋ฐ ์๋๊ฐ ๋๋ ค์ง ์ ์์ด์. ์ฝ๋๋ฅผ ์์ฑํ ๋๋ง๋ค ์๋ง์ ๊ฒฝ๊ณ ์ ์๋ฌ์ ์๋ฌ๋ฆฌ๊ฒ ๋ ์ ์๊ฑฐ๋ ์.
ํ์๋ค๊ณผ ์์ํด์ ์ ๋ง ํ์ํ ๊ท์น๋ง ์ ๋ณ์ ์ผ๋ก ์ ์ฉํ๋ ๊ฒ ์ข์์. ๋ง์น ์ท์ฅ ์ ๋ฆฌํ ๋ ์ ๋ง ํ์ํ ์ท๋ง ๋จ๊ธฐ๋ ๊ฒ์ฒ๋ผ์! ๐๐
2. ํ๋ก์ ํธ ํน์ฑ ๊ณ ๋ คํ๊ธฐ
๋ชจ๋ ํ๋ก์ ํธ์ ๋๊ฐ์ ESLint ์ค์ ์ ์ฌ์ฉํ๋ ๊ฑด ์ข์ง ์์์. ํ๋ก์ ํธ๋ง๋ค ํน์ฑ์ด ๋ค๋ฅด๋๊น์.
์๋ฅผ ๋ค์ด, ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ค๋ฃจ๋ ํ๋ก์ ํธ๋ผ๋ฉด ๋๋ฌด ์๊ฒฉํ ๊ท์น์ ์ ์ฉํ๋ฉด ์คํ๋ ค ๋ฌธ์ ๊ฐ ๋ ์ ์์ด์. ๋ฐ๋ฉด์ ์๋ก ์์ํ๋ ํ๋ก์ ํธ๋ผ๋ฉด ์ฒ์๋ถํฐ ์๊ฒฉํ ๊ท์น์ ์ ์ฉํด๋ ๊ด์ฐฎ๊ฒ ์ฃ .
3. ํ์๋ค๊ณผ์ ์ํต
ESLint ๊ท์น์ ์ค์ ํ ๋๋ ๋ฐ๋์ ํ์๋ค๊ณผ ์์ํด์ผ ํด์. ์๋๊ณ ์? ๐คทโโ๏ธ
- ๋ชจ๋ ํ์์ด ๋์ํ์ง ์๋ ๊ท์น์ ๊ฐ๋ฑ์ ์์ธ์ด ๋ ์ ์์ด์.
- ์ผ๋ถ ๊ท์น์ ํน์ ํ์์ ์์ฐ์ฑ์ ํฌ๊ฒ ๋จ์ด๋จ๋ฆด ์ ์์ด์.
- ๋๋ฌด ์๊ฒฉํ ๊ท์น์ ์ฐฝ์์ฑ์ ์ ํํ ์ ์์ด์.
๊ทธ๋ฌ๋๊น ESLint ์ค์ ์ ํ์ 'ํ๋ฒ'๊ฐ์ ๊ฑฐ์์. ๋ชจ๋๊ฐ ๋์ํ๊ณ ๋ฐ๋ฅผ ์ ์๋ ๊ท์น์ ๋ง๋ค์ด์ผ ํด์! ๐ฅ
4. ๊ท์น ๋ฌด์ํ๊ธฐ (ํ์ง๋ง ์กฐ์ฌํ!)
๋๋ก๋ ESLint ๊ท์น์ ๋ฌด์ํด์ผ ํ ๋๋ ์์ด์. ์๋ฅผ ๋ค์ด, ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํธํ์ฑ ๋ฌธ์ ๋ก ํน์ ๊ท์น์ ์ด๊ฒจ์ผ ํ ์๋ ์์ฃ .
์ด๋ด ๋๋ ์ฃผ์์ ์ฌ์ฉํด ํน์ ์ค์ด๋ ํ์ผ์์ ๊ท์น์ ๋ฌด์ํ ์ ์์ด์:
// eslint-disable-next-line no-console
console.log('์ด ์ค์ ESLint ๊ท์น์ ๋ฌด์ํด์!');
/* eslint-disable */
// ์ด ๋ธ๋ก ์์ ๋ชจ๋ ์ฝ๋๋ ESLint ๊ท์น์ ๋ฌด์ํด์
/* eslint-enable */
ํ์ง๋ง ์ฃผ์ํ์ธ์! ์ด๋ฐ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋๋ฌด ์์ฃผ ์ฌ์ฉํ๋ฉด ESLint๋ฅผ ์ฌ์ฉํ๋ ์๋ฏธ๊ฐ ์์ด์ ธ์. ๊ผญ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๋๋ก ํด์. ๐จ
5. ์ ๊ธฐ์ ์ธ ๊ท์น ๋ฆฌ๋ทฐ
ESLint ๊ท์น์ ํ ๋ฒ ์ค์ ํ๊ณ ๋๋๋ ๊ฒ ์๋์์. ์ ๊ธฐ์ ์ผ๋ก ํ์๋ค๊ณผ ํจ๊ป ๊ท์น์ ๋ฆฌ๋ทฐํ๊ณ ํ์ํ๋ค๋ฉด ์์ ํด์ผ ํด์.
ํ: ๋ถ๊ธฐ๋ง๋ค ํ ๋ฒ์ฉ 'ESLint ๊ท์น ๋ฆฌ๋ทฐ ๋ฐ์ด'๋ฅผ ๊ฐ์ ธ๋ณด๋ ๊ฑด ์ด๋จ๊น์? ํ์๋ค๊ณผ ํจ๊ป ํ์ฌ ๊ท์น์ ์ฅ๋จ์ ์ ๋ ผ์ ํ๊ณ ํ์ํ ๋ณ๊ฒฝ์ฌํญ์ ๊ฒฐ์ ํ ์ ์์ด์. ์ด๋ ๊ฒ ํ๋ฉด ESLint ๊ท์น์ด ํญ์ ํ์ ํ์ฌ ์ํฉ๊ณผ ๋์ฆ์ ๋ง๊ฒ ์ ์ง๋ ์ ์๋ต๋๋ค.
์, ์ด์ ESLint๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ๋ค์ ๋ํด ์์๋ดค์ด์. ์ด๋ฐ ์ ๋ค์ ์ ๊ธฐ์ตํ๊ณ ์ค์ฒํ๋ค๋ฉด, ESLint๋ ์ฌ๋ฌ๋ถ์ ์ฝ๋ ํ์ง์ ๋์ด๋ ๊ฐ๋ ฅํ ๋๋ฐ์๊ฐ ๋ ๊ฑฐ์์! ๐
๋ค์ ์น์ ์์๋ ESLint๋ฅผ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๊ฟํ๋ค์ ์๊ฐํด๋๋ฆด๊ฒ์. ๊ธฐ๋๋์ง ์๋์? ๐
๐ฏ ESLint ํ์ฉ ๊ฟํ
ESLint๋ฅผ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๊ฟํ์ ์๋ ค๋๋ฆด๊ฒ์. ์ด ํ๋ค์ ํ์ฉํ๋ฉด ESLint๋ฅผ ๋ง์คํฐํ ์ ์์ ๊ฑฐ์์! ๐
1. ํ๋ฆฌ์ ํ์ฉํ๊ธฐ
๋งค๋ฒ ๊ท์น์ ํ๋ํ๋ ์ค์ ํ๋ ๊ฒ ๊ท์ฐฎ๋ค๊ตฌ์? ๊ทธ๋ด ๋ ํ๋ฆฌ์ ์ ํ์ฉํด๋ณด์ธ์!
{
"extends": [
"eslint:recommended",
"plugin:react/recommended"
]
}
์ด๋ ๊ฒ ํ๋ฉด ESLint์์ ์ถ์ฒํ๋ ๊ธฐ๋ณธ ๊ท์น๊ณผ React ๊ด๋ จ ๊ท์น์ ํ ๋ฒ์ ์ ์ฉํ ์ ์์ด์. ํธ๋ฆฌํ์ฃ ? ๐
2. ์๋ํฐ ํ์ฅ ํ๋ก๊ทธ๋จ ์ฌ์ฉํ๊ธฐ
VS Code, WebStorm ๋ฑ ๋๋ถ๋ถ์ ํ๋์ ์ธ ์๋ํฐ๋ค์ ESLint ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ ๊ณตํด์. ์ด๊ฑธ ์ค์นํ๋ฉด ์ฝ๋๋ฅผ ์์ฑํ๋ ๋์ ์ค์๊ฐ์ผ๋ก ESLint ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์์ด์.
ํ: VS Code๋ฅผ ์ฌ์ฉํ๋ค๋ฉด "ESLint" ํ์ฅ ํ๋ก๊ทธ๋จ์ ์ค์นํด๋ณด์ธ์. ์ฝ๋์ ๋นจ๊ฐ ์ค์ด ๊ทธ์ด์ง๋ฉด ๋ง์ฐ์ค๋ฅผ ์ฌ๋ ค ESLint ๋ฉ์์ง๋ฅผ ํ์ธํ ์ ์์ด์!
3. ์๋ ์์ ๊ธฐ๋ฅ ํ์ฉํ๊ธฐ
ESLint์ --fix ์ต์ ์ ์ฌ์ฉํ๋ฉด ๋ง์ ๋ฌธ์ ๋ฅผ ์๋์ผ๋ก ์์ ํ ์ ์์ด์. ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํด๋ณด์ธ์:
npx eslint --fix .
์ด ๋ช ๋ น์ด๋ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ํ์ ๋๋ ํ ๋ฆฌ์ ๋ชจ๋ ํ์ผ์ ๋ํด ์๋ ์์ ์ ์๋ํด์. ๋ง๋ฒ์ฒ๋ผ ์ฝ๋๊ฐ ๊น๋ํด์ง ๊ฑฐ์์! โจ
4. ์ปค์คํ ๊ท์น ๋ง๋ค๊ธฐ
์ ๋ง ํน๋ณํ ๊ท์น์ด ํ์ํ๋ค๋ฉด, ์ง์ ๋ง๋ค ์๋ ์์ด์! ์๋ฅผ ๋ค์ด, ํน์ ํจ์ ์ด๋ฆ์ ๊ธ์งํ๊ณ ์ถ๋ค๋ฉด:
module.exports = {
create: function(context) {
return {
Identifier: function(node) {
if (node.name === "badFunction") {
context.report(node, "์ด ํจ์๋ ์ฌ์ฉํ์ง ๋ง์ธ์!");
}
}
};
}
};
์ด๋ ๊ฒ ๋ง๋ ๊ท์น์ ESLint ์ค์ ์ ์ถ๊ฐํ๋ฉด ๋ผ์. ์์ ํ๋ก ๊ฐ๋ฐ์ ๊ฐ์ฃ ? ๐
5. ์ฃผ์์ผ๋ก ๊ท์น ์ ์ดํ๊ธฐ
ํน์ ์ค์ด๋ ํ์ผ์์๋ง ๊ท์น์ ๋นํ์ฑํํ๊ณ ์ถ๋ค๋ฉด ์ฃผ์์ ์ฌ์ฉํ ์ ์์ด์:
// eslint-disable-next-line no-console
console.log('๋๋ฒ๊น
์ฉ ๋ก๊ทธ');
/* eslint-disable */
// ์ด ๋ธ๋ก ๋ด์์๋ ๋ชจ๋ ESLint ๊ท์น์ด ๋ฌด์๋ฉ๋๋ค
/* eslint-enable */
ํ์ง๋ง ์ด ๊ธฐ๋ฅ์ ๊ผญ ํ์ํ ๋๋ง ์ฌ์ฉํ์ธ์. ๋จ์ฉํ๋ฉด ESLint์ ํจ๊ณผ๊ฐ ๋จ์ด์ง ์ ์์ด์!
6. Git Hooks ์ฌ์ฉํ๊ธฐ
Git Hooks๋ฅผ ์ฌ์ฉํ๋ฉด ์ปค๋ฐ์ด๋ ํธ์ ์ ์ ์๋์ผ๋ก ESLint๋ฅผ ์คํํ ์ ์์ด์. Husky๋ผ๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ์ค์ ํ ์ ์๋ต๋๋ค.
{
"husky": {
"hooks": {
"pre-commit": "eslint ."
}
}
}
์ด๋ ๊ฒ ํ๋ฉด ESLint ๊ฒ์ฌ๋ฅผ ํต๊ณผํ์ง ๋ชปํ ์ฝ๋๋ ์ปค๋ฐ๋์ง ์์์. ํ์ ์ฝ๋ ํ์ง์ ์งํค๋ ์ํธ์ฒ์ฌ ์ญํ ์ ํ๋ ๊ฑฐ์ฃ ! ๐ผ
์ด๋ฐ ๊ฟํ๋ค์ ํ์ฉํ๋ฉด ESLint๋ฅผ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์. ์ฝ๋ ํ์ง๋ ์ฌ๋ฆฌ๊ณ , ๊ฐ๋ฐ ์์ฐ์ฑ๋ ๋์ด๊ณ , ์ผ์์ด์กฐ๋ค์! ๐
์, ์ด์ ์ฐ๋ฆฌ๋ ESLint์ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ์์๋ดค์ด์. ESLint๋ฅผ ์ค์นํ๊ณ , ๊ท์น์ ์ปค์คํฐ๋ง์ด์งํ๊ณ , ์ ์ฉํ๋ ๋ฐฉ๋ฒ๋ถํฐ ์ฃผ์์ฌํญ๊ณผ ๊ฟํ๊น์ง! ์ฌ๋ฌ๋ถ์ ์ด์ ESLint ์ ๋ฌธ๊ฐ๊ฐ ๋ ๊ฑฐ๋ ๋ค๋ฆ์์ด์. ๐จโ๐๐ฉโ๐
ESLint๋ฅผ ํ์ฉํด ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ๋ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ ํด๋ณด์ธ์. ์ฌ๋ฌ๋ถ์ ์ฝ๋๊ฐ ๋น๋๋ ๋ณด์์ฒ๋ผ ์๋ฆ๋ค์์ง ๊ฑฐ์์! โจ
์ฝ๋ฉ ์ฆ๊ฒ๊ฒ ํ์ธ์! ๊ทธ๋ฆฌ๊ณ ESLint์ ํจ๊ป ๋ ๋์ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ๊ธธ ๋ฐ๋๊ฒ์. ํ์ดํ ! ๐ช๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ