
๐ ๋ค์ด๊ฐ๋ฉฐ
๊ทธ๋์ ๋ง๊ฐ ๊ธฐํ์ด ์ด๋ฐํ ํ๋ก์ ํธ๋ค๋ก ํ๋ก ํธ์๋์ ์ ๋ฌธํ๋ค ๋ณด๋,
๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ๋ค์ ํ๋๋ ๋ชจ๋ฅธ์ฑ๋ก ๋์๊ฐ๊ธฐ๋ง ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๋ง ํ๋ ๊ฒ ๊ฐ๋ค.
๊ทธ๋์ ์ด๋ฒ์๋ ํ ๋ฒ์ฏค์ ์ ๋๋ก ์ง๊ณ ๊ฐ์ผ๊ฒ ๋ค๋ ์๊ฐ์ผ๋ก,
ESLint๋ TypeScript์ ๋ํด ๊ณต์ ๋ฌธ์๋ฅผ ์ง์ ์ฝ์ด๋ณด๊ธฐ๋ก ํ๋ค.
๊ทธ๋ฌ๋ .. ์ญ์ ๊ณต์ ๋ฌธ์ ๋ต๊ฒ ์์ด์ด๋ค ๋ณด๋๊น
๊ฐ๋ ์ด ํ ๋ฒ์ ์๋ฟ์ง๊ฐ ์์์ ์ฝ๋๋ฐ ๊ฝค๋ ํ๋ค์๋ค ..๐ต๐ซ
ํนํ ์์ฆ ์ํ๊ณ๊ฐ
- ESLint v9 + flat config
- typescript-eslint ๋จ์ผ ํจํค์ง
- defineConfig, extends, globalIgnores
์์ ๊ฐ์ ์๋ก์ด ํค์๋๋ค๋ก ๋น ๋ฅด๊ฒ ๋์ด๊ฐ๊ณ ์์ด์
๊ทธ๋์์ฒ๋ผ ๋ค๋ฅธ ์ฌ๋๋ค์ด ์์ฑํด๋ ๋ธ๋ก๊ทธ๋ ํ ํ๋ฆฟ์ ์ฐธ๊ณ ํด์
๊ฐ์ผ๋ก ์ธํ ํ๋ ๋ฐฉ์์ผ๋ก๋ ํ๊ณ๊ฐ ์์๋ค ..๐ญ
๊ทธ๋์ ์ด ํฌ์คํ ์๋ค๊ฐ ๋ด๊ฐ ์ค์ ๋ก ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ์ผ๋ฉด์ ์ดํดํ ๋ด์ฉ์
ํ๊ตญ์ด๋ก ๋ค์ ์ ๋ฆฌํด ๋๊ณ ์ ํ๋ค.
ํนํ ์๋์ ๋ด์ฉ๋ค์ ์ค์ฌ์ผ๋ก ํฌ์คํ ์ ์ ๋ฆฌํ๊ณ ์ ํ๋, ํฌ์คํ ์ ์ฝ๊ธฐ ์ ์ ์ฐธ๊ณ ํด๋๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
- ์ @typescript-eslint/parser์ eslint-plugin ๋์ ์ typescript-eslint ํจํค์ง ํ๋๋ก ์ ๋ฆฌ๋์๋๊ฐ
- ์๋ก์ด ๋ฐฉ์์ธ flat config๊ฐ ์ด๋ค ๊ฐ๋ ์ธ๊ฐ
- defineConfig๊ฐ ํ๋ ์ญํ ๊ณผ, ์์ ์ tseslint.config( ... )์์ ๊ด๊ณ๋ ๋ฌด์์ธ๊ฐ
- flat config์์ ๋ค์ ๋์์จ extends์ ์๋ฏธ์ ์ฌ์ฉ ํจํด์ ๋ฌด์์ธ๊ฐ
- .eslintignore ๋์ ์ค์ ํ์ผ ์์์ ์ฌ์ฉํ๋ galobalIgnores๋ ๋ฌด์์ธ๊ฐ
๐ฅ typescript-eslint๋
typescript-eslint | typescript-eslint
Tooling which enables you to use TypeScript with ESLint
typescript-eslint.io
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ESLint์ TypeScript๋ฅผ ํจ๊ป ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
ํ์ง๋ง ์ด ๋์ ์๋๋ถํฐ ์ ํตํ๋ ๊ด๊ณ๊ฐ ์๋์๋ค๊ตฌ ํ๋ค ๐ถ
ESLint๋ JavaScript ์ ์ฉ ๋ฆฐํฐ์๊ณ ,
TypeScript๋ JS์ ์์ ํ์ฅ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์
๋จ์ํ ESLint๋ง ์ค์นํด์๋ TS ๋ฌธ๋ฒ์ด๋ ํ์ ์ ๋ณด๋ฅผ ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ค.
๊ทธ๋์ ์์ ์๋ ์๋ ๋ ๊ฐ์ ํจํค์ง๋ฅผ ๋ฐ๋ก ์ค์นํด์ผ ํ๋ค๊ณ ํ๋ค.
- @typescript-eslint/parser ๐๐ป TS ์ฝ๋๋ฅผ ESLint๊ฐ ์ดํดํ ์ ์๋ JS AST๋ก ๋ฐ๊ฟ์ฃผ๋ ์ญํ
- @typescript-eslint/eslint-plugin ๐๐ป TS ์ ์ฉ ESLint ๊ท์น๋ค์ ์ถ๊ฐ๋ก ์ ๊ณตํ๋ ์ญํ
์ฆ, parser๊ฐ TS ์ฝ๋๋ฅผ ํด์ํด์ฃผ๋ ์ญํ ์ ํ๊ณ ,
plugin์ TS ๋ฌธ๋ฒ์ ๋ง๋ ๊ท์น ์ธํธ๋ฅผ ์ ๊ณตํ๋ ํ์ฅํฉ์ด์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๊ทธ๋ฌ๋ ์ต๊ทผ์๋ ์ด ๋ ํจํค์ง๋ฅผ ๋ณ๋๋ก ์ค์นํ์ง ์๊ณ ๋ ์ฌ์ฉํ ์ ์๋ค !-!
typescript-eslint๋ผ๋ ํตํฉ ํจํค์ง ํ๋์ ์๋์ ๊ตฌ์ฑ ์์๋ค์ด ๋ชจ๋ ๋ค์ด์๊ธฐ ๋๋ฌธ์ด๋ค ๐๐ป
- parser ๐๐ป TS ์ฝ๋๋ฅผ ESLint๊ฐ ์ดํดํ ์ ์๊ฒ ํ์ฑ
- plugin ๐๐ป TS ๊ด๋ จ ESLint ๊ท์น ์ธํธ ์ ๊ณต
- configs ๐๐ป ์ฌ๋ฌ ์ถ์ฒ ๊ท์น ์ธํธ๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด (tseslint.configs.recommended ๋ฑ)
- FlatConfig ๐๐ป flat config ๋ฐฉ์์์ ์ฌ์ฉํ๋ ํ์ ์ ์
(์ฐธ๊ณ ๋ก config ์ ํธ์ ์์ ๋ฐฉ์์ด๊ณ , ํ์ฌ๋ deprecated์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์๋๋ค.)
์ค์น ๋ช ๋ น๋ ํจ์ฌ ๊ฐ๋จํด์ก๋ค !
์์ ์๋ ์ด๋ ๊ฒ ๋ ๊ฐ๋ฅผ ๋ฐ๋ก ์ค์นํ๋ค๋ฉด,
npm install -D @typescript-eslint/parser @typescript-eslint/eslint-plugin
์ด์ ๋ ์ด๋ ๊ฒ๋ง ํด์ฃผ๋ฉด ๋๋ค.
npm install -D typescript-eslint
๐ง defineConfig( )์ tseslint.config( )์ ๊ด๊ณ
Evolving flat config with extends - ESLint - Pluggable JavaScript Linter
A pluggable and configurable linter tool for identifying and reporting on patterns in JavaScript. Maintain your code quality with ease.
eslint.org
ESLint๋ ์๋ .eslintrc ๋ฐฉ์์ ์ค์ ํ์ผ์ ์ฌ์ฉํ์ง๋ง,
ESLint v9 ๋ถํฐ๋ flat config ๊ตฌ์กฐ๊ฐ ๋์ ๋๋ฉด์
์ค์ ๋ฐฉ์์ ์ข ๋ ์ฝ๋ ์ค์ฌ + ํ์ ์์ ํ๊ฒ ๋ฐ๊พธ๊ฒ ๋์๋ค๊ณ ํ๋ค.
์ด๋, typescript-eslint๊ฐ flat config๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก
tseslint.config( ... )๋ผ๋ ํฌํผ ํจ์๋ฅผ ๋ฐ๋ก ์ ๊ณตํ์์ง๋ง,
์ด์ ๋ ESLint ์์ฒด์์ defineConfig( ... )๋ฅผ ๊ณต์ ์ง์ํ๊ฒ ๋๋ฉด์
์ด ๊ธฐ๋ฅ์ด ESLint ์ฝ์ด๋ก ์์ ํ ํตํฉ๋์๋ค๊ณ ํ๋ค.
์ฆ, ์์ ๋ฐฉ์์ ์๋์ฒ๋ผ ์ฌ๋ฌ ๊ฐ์ config object(์ค์ ๊ฐ์ฒด)๋ฅผ ๋ฐ์์
ํ ๋ฒ์ flatten(๋ณํฉ) ํด์ฃผ๋ ์ ํธ๋ฆฌํฐ์๋ค๋ฉด,
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
export default tseslint.config(
eslint.configs.recommended, // ๊ธฐ๋ณธ JS ๊ท์น
tseslint.configs.recommended, // TS์ฉ ์ถ์ฒ ๊ท์น
{
rules: {
'no-console': 'warn', // ์ปค์คํ
๊ท์น ์ถ๊ฐ
},
},
);
์ด์ ๋ ESLint ์ฝ์ด์์ defineConfig( )๋ผ๋ ํจ์๋ฅผ ๊ณต์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์
์๋์ ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
import eslint from '@eslint/js';
import { defineConfig } from 'eslint/config';
import tseslint from 'typescript-eslint';
export default defineConfig(
eslint.configs.recommended,
tseslint.configs.recommended,
{
rules: {
'no-console': 'warn',
},
},
);
์์์์ ๋ณผ ์ ์๋ฏ์ด ๊ทธ๋ฅ tseslint.config( ... )๊ฐ defineConfig( ... )๋ก ์ด๋ฆ๋ง ๋ฐ๊ผ๋ค๊ณ ๋ณด๋ฉด ๋๋ค ใ ใ
์ฐธ๊ณ ๋ก parser์ plugin ๋ฑ์ ์ง์ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์์ฑํด์ฃผ๋ฉด ๋๋ค.
import eslint from '@eslint/js';
import { defineConfig } from 'eslint/config';
import tseslint from 'typescript-eslint';
export default defineConfig({
plugins: {
'@typescript-eslint': tseslint.plugin,
},
languageOptions: {
parser: tseslint.parser,
parserOptions: {
projectService: true,
},
},
rules: {
'@typescript-eslint/no-floating-promises': 'error',
// ...
},
});
๐จ Flat Config์ ๋ฑ์ฅ๊ณผ ๋ณํ์ ๋ฐฐ๊ฒฝ
ESLint๋ ์ค๋ซ๋์ .eslintrc ํ์ผ์ ์ฌ์ฉํด์์ง๋ง,
v9 ๋ฒ์ ๋ถํฐ๋ Flat Config๋ผ๋ ์๋ก์ด ์ค์ ๊ตฌ์กฐ๊ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์๋ฆฌ์ก์๋ค.
์ด์ ์ .eslintrc๋ YAML/JSON ๊ธฐ๋ฐ์ผ๋ก
"extends"๋ "plugins" ๊ฐ์ ํค์๋๋ฅผ ์ค์ฒฉํด์ ์ฐ๋ ์ ํต์ ์ธ ๊ตฌ์กฐ์๋ค๋ฉด,
Flat Config๋ ๋ง ๊ทธ๋๋ก ํ๋์ ๋ฐฐ์ด ์์ ๋ชจ๋ ์ค์ ๊ฐ์ฒด๋ฅผ ๋์ดํ๋ ๊ตฌ์กฐ๋ก ๋ฐ๋ ๊ฒ์ด๋ค.
๊ตฌ์ฒด์ ์ธ ์์๋ก๋ ์์ ์๋ ์ด๋ฌํ ๋ฐฉ์์ด์๋ค๋ฉด,
// .eslintrc.js (์ด์ ๋ฐฉ์)
module.exports = {
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
],
};
Flat Config์์๋ ์ด์ฒ๋ผ ์ด๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
// eslint.config.js (Flat Config)
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';
import { defineConfig } from 'eslint/config';
export default defineConfig(
eslint.configs.recommended,
tseslint.configs.recommended,
);
์์ ๋ณด๋ค ํจ์ฌ ์ง๊ด์ ์ด๊ณ ์ฝ๋ ์นํ์ ์ผ๋ก ๋ฐ๋ ๊ฒ ๊ฐ๊ธด ํ์ง๋ง,
๋ฌธ์ ๋ ์ด๋ฌํ ๋ณํ๊ฐ ์๊ธฐ๋ฉด์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ํท๊ฐ๋ คํ๊ธฐ ์์ํ๋ค๊ณ ํ๋ค ๐คฃ
ํนํ Flat Config๊ฐ ์ฒ์ ๋์์ ๋ ์ฌ์ฉ์๋ค์ ํผ๋๋ฐฑ์ ๋ค์๊ณผ ๊ฐ์๋ค๊ณ ํ๋ค.
- TS์ ํจ๊ป ์ฐ๊ธฐ ๋ถํธํ๋ค.
๐๐ป flat config ๊ตฌ์กฐ์์ TS ๊ด๋ จ ์ค์ ์ด ๋๋ฌด ๋ณต์กํ๊ฒ ๋๊ปด์ก๋ค๊ณ ํ๋ค. - ๋ค๋ฅธ ์ค์ (config)์ ๊ฐ์ ธ์์ ํ์ฅํ๊ธฐ ์ด๋ ต๋ค.
๐๐ป plugin๋ง๋ค config๋ฅผ ๋ด๋ณด๋ด๋ ๋ฐฉ์์ด ์ ๊ฐ๊ฐ์ด๋ผ '์ด๊ฑธ ์ด๋ป๊ฒ ํฉ์น์ง?'๋ผ๋ ํผ๋์ด ๋ง์๋ค๊ณ ํ๋ค. - ignores๊ฐ ํท๊ฐ๋ฆฐ๋ค.
๐๐ป ์ด๋ค ๊ฒฝ์ฐ์๋ ์ ์ญ ignore์ฒ๋ผ, ์ด๋ค ๊ฒฝ์ฐ์๋ ๋ถ๋ถ ignore ์ฒ๋ผ ๋์ํ๋ค๊ณ ํ๋ค.
๊ทธ๋์ ์์ ๊ฐ์ ํผ๋๋ฐฑ์ ๋ฐํ์ผ๋ก ESLint ํ์ ํฌ๊ฒ ์๋์ ์ธ ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ฐ์ ํ๋ค๊ณ ํ๋ค.
- defineConfig( ) ๋์ ๐๐ป ์ค์ ์ ํ์ ์์ ํ๊ฒ ๋ฌถ๋ ํฌํผ
- extends ๋ถํ ๐๐ป ์ด์ ์ฒ๋ผ ์ค์ ํ์ฅ์ด ๊ฐ๋ฅํ๋๋ก ๋ณต๊ท
- globalIgnores( ) ๋์ ๐๐ป ์ ์ญ ๋ฌด์ ํจํด์ ๋ช ํํ ๊ตฌ๋ถ
์ด๋ฌํ ์ธ ๊ฐ์ง ๊ฐ์ ์ ์ ๋ณด๋ฉฐ flat config๋ฅผ ์ฌ์ฉํ๋๋ผ๋
๊ธฐ์กด .eslintrc์ ์ต์ํจ์ ์ ์งํ๋ ๊ฒ์ด ์ด๋ฒ ๋ณํ์ ํต์ฌ์ด์ง ์์๊น ์๊ฐํ๋ค.
๐ฉ Vite ํ ํ๋ฆฟ์ด ๋ง๋ค์ด์ค ๊ธฐ๋ณธ ESLint ์ค์ ๋ฏ์ด๋ณด๊ธฐ
Vite๋ก React + TypeScript ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ฉด,
์๋์ ๊ฐ์ด eslint.config.js ํ์ผ์ด ์๋์ผ๋ก ์์ฑ๋๋ค.
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
import { defineConfig, globalIgnores } from 'eslint/config'
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
js.configs.recommended,
tseslint.configs.recommended,
reactHooks.configs['recommended-latest'],
reactRefresh.configs.vite,
],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
},
])
์ง๊ธ๊น์ง์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ ์ค์ ์ ํ ์ค์ฉ ๋ฏ์ด๋ณด๋ฉด,
flat config + typescript-eslint + React ์ํ๊ณ๊ฐ ์ด๋ป๊ฒ ์ฝํ์ ๋์๊ฐ๋์ง ์ ๋ณด์ผ ๊ฒ์ด๋ค.
1. defineConfig + ๋ฐฐ์ด ๊ตฌ์กฐ ๐๐ป flat config์ ๊ธฐ๋ณธ ํ
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
// ...
},
])
์ด ๋ถ๋ถ์ ๋ณด๋ฉด, ESLint v9์์ ๋์ ๋ flat config๋ฅผ ํ์ ์์ ํ๊ฒ ์์ฑํ๊ธฐ ์ํ ๊ณต์ ํฌํผ์ธ defineConfig๊ฐ ์๊ณ ,
์ธ์๋ก ์ค์ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด์ ๋๊ธฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ , ์ด ๋ฐฐ์ด์ ๊ฐ ์์๊ฐ ์ด๋ค ํ์ผ์ ์ด๋ค ๊ท์น์ ์ ์ฉํ ์ง๋ฅผ ์ ์ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
์ ์ค์ ์ฝ๋์์๋ ํฌ๊ธฐ ๋ ๊ฐ์ง ์ค์ ๋ธ๋ญ์ด ์๋๋ฐ,
glabolIgnores(['dist'])๋ ์ ์ญ ignore ์ค์ ์ด๊ณ ,
{ files: ['**/*.{ts, tsx}'], ... }๋ TypeScript์ TSX ํ์ผ์ ์ ์ฉํ ์ค์ ๋กค ์ธํธ์ด๋ค.
์ด๋ ๊ฒ ์ค์ ํจ์ผ๋ก์จ dist ํด๋๋ ESLint ๊ฒ์ฌ ๋์์์ ์์ ๋น ์ง๊ฒ ๋๋ค.
์ฐธ๊ณ ๋ก, ์ค์ ํ๋ก์ ํธ์์๋ ๋ณดํต ์๋์ ๊ฐ์ด ํ์ฅํด์ ์ฐ๋ ๊ฒฝ์ฐ๋ ๋ง๋ค๊ณ ํ๋ค.
globalIgnores(['dist', 'node_modules']),
์ด์ฐจํผ node_modules๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฝ๋๋ค์ด๋ผ
๊ตณ์ด ๋ฆฐํธ ๋์์ผ๋ก ์ผ์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
2. extends ๐๐ป ์ฌ๋ฌ ์ถ์ฒ ์ค์ ์ ํ ๋ฒ์ ๋ง์์ฐ๊ธฐ
extends: [
js.configs.recommended,
tseslint.configs.recommended,
reactHooks.configs['recommended-latest'],
reactRefresh.configs.vite,
],
์ฌ๊ธฐ๊ฐ ์ ์ค์ ์ฝ๋์ ํต์ฌ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
ํ ์ค์ฉ ์ดํด๋ณด๋ฉด,
js.configs.recommended
์ด ๋ถ๋ถ์ @eslint/js ํจํค์ง๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ณธ์ ์ธ JS ์ถ์ฒ ๊ท์น ์ธํธ๋ก,
JS ์ ๋ฐ์์ '์ด ์ ๋๋ ์งํค์' ์์ค์ ๋ฃฐ๋ค์ด ๋ชจ์ฌ ์๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
๋ค์์ผ๋ก,
tseslint.configs.recommended
์ด ๋ถ๋ถ์ ์์์ ๋งํ๋ฏ์ด TS ์ ์ฉ ์ถ์ฒ ๊ท์น ์ธํธ์ด๋ค.
์ด ์ค์ ์ ํตํด์ TS ๋ฌธ๋ฒ์ ์ดํดํ๋ parser์ plugin์ด ๊ฐ์ด ํ์ฑํ ๋๊ณ ,
TS ํ์ ๊ด๋ จ ๋ฃฐ๋ค (ex. @typescript-eslint/no-unused-vars ๋ฑ)์ด ์ผ์ง๋ค.
๊ทธ ๋ค์์ผ๋ก,
reactHooks.configs['recommended-latest']
์ด ๋ถ๋ถ์ eslint-plugin-react-hooks์์ ์ ๊ณตํ๋ React Hooks ์ ์ฉ ๊ท์น ์ธํธ๋ก,
์ด ์ค์ ๋๋ถ์ useEffect ์์กด์ฑ์ ๋น ๋จ๋ฆฌ๊ฑฐ๋,
useState๋ฅผ ์กฐ๊ฑด๋ฌธ ์์์ ํธ์ถํ๋ ค๋ ์ค์ ๋ฑ์ ์๋์ผ๋ก ์ก์์ค ์ ์๊ฒ ๋๋ค.
๋ง์ง๋ง์ผ๋ก,
reactRefresh.configs.vite
์ด ๋ถ๋ถ์ eslint-plugin-react-refresh์ Vite์ฉ ์ค์ ์ผ๋ก,
React Fast Refresh(ํซ ๋ฆฌ๋ก๋)์ ๊ด๋ จ๋ ์ ์ฝ์ ์ฒดํฌํด์ค๋ค๊ณ ํ๋ค.
(์ด ๋ถ๋ถ์ ๋ญ์ง ์์ง ์ ๋ชจ๋ฅด๊ฒ ์ด์ ์ถํ ๊ณต๋ถํ๊ณ ๋ค์ ํฌ์คํ ํ ์์ ์ด๋ค.)
3. languageOptions ๐๐ป JS ๋ฌธ๋ฒ ๋ฒ์ + ๋ธ๋ผ์ฐ์ ์ ์ญ ๋ณ์
์์ ์ค์ ํ์ผ ์ค ์ด ๋ถ๋ถ์ ์ดํด๋ณด์.
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
์ฌ๊ธฐ์์ ์ฒซ ์ค์ ESLint๊ฐ ์ด๋ ๋ฒ์ ์ JS ๋ฌธ๋ฒ๊น์ง ์ดํดํ ์ง๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๊ณ ,
๋ ๋ฒ์งธ ์ค์ globals ํจํค์ง์์ ๊ฐ์ ธ์จ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ ์ ์ญ ๋ณ์ ์ธํธ๋ฅผ ํ์ฑํํ๋ ๊ฒ์ด๋ค.
๐ฆ ์ฒ์ ๋์ก๋ ๋ค์ฏ ๊ฐ์ง ์ง๋ฌธ์ ๋ต
์ด ๊ธ์ ๋งจ ์ฒ์์ ์๋์ ๋ค์ฏ ๊ฐ์ง๋ฅผ ์ค์ฌ์ผ๋ก ์ ๋ฆฌํ๊ฒ ๋ค๊ณ ํ์์ผ๋,
์ด์ ํฌ์คํ ๋ง์ผ๋ก๋ ํ ์๋ฟ์ง ์๋ ๋ถ๋ค์ ์ํด ๊น๋ํ๊ฒ ๋ต์ ์ ๋ฆฌํด๋๊ณ ์ ํ๋ค.
- ์ @typescript-eslint/parser์ eslint-plugin ๋์ ์ typescript-eslint ํจํค์ง ํ๋๋ก ์ ๋ฆฌ๋์๋๊ฐ
- ์์ ์๋ TS ์ฝ๋ ํด์์ ๋ด๋นํ๋ parser์ TS์ฉ ๊ท์น ์ธํธ์ธ plugin์ ๋ฐ๋ก ์ค์นํด์ผ ํ์ง๋ง,
์ด์ ๋ ์ด ๋์ด ํตํฉ๋ typescript-eslint ํจํค์ง ํ๋๋ก ๋ชจ๋ ์ ๊ณต๋๋ค.
๐๐ป ์ฆ, parser, plugin, configs ๋ฑ TS ๊ด๋ จ ๋๊ตฌ๋ค์ ํ ๋ฒ์ ํฌํจํ๋ ํตํฉ ์ํธ๋ฆฌ ํฌ์ธํธ๋ก ์ ๋ฆฌ๋ ๊ฒ์ด๋ค. - ์ด๋ ๊ฒ ์ ๋ฆฌํ ์ด์ ๋ ์ด์ฐจํผ ์์ ์ฒ๋ผ parser์ plugin์ด ๋๋์ด ์๋ ๊ตฌ์กฐ์์๋ ์ด์ฐจํผ ์ด ๋์ ํญ์ ์ธํธ๋ก ์ค์นํ๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๋ถ๋ฆฌํด๋ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฒ๋ค๊ฐ parser์ plugin์ ํญ์ ๊ฐ์ ๋ฒ์ ๋ผ๋ฆฌ ์จ์ผ ์ ์์ ์ผ๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ค์นํ๊ฒ ๋๋ฉด, ๋ฒ์ ๋ถ์ผ์น ๋ฐ ์ค์ ๋ณต์ก๋ ๋ฑ์ ๋ฌธ์ ๊ฐ ์์๋ค๊ณ ํ๋ค.
๐๐ป ๋ฐ๋ผ์ ์ด๋ฌํ ์ด์ ๋ก typescript-eslint ํ๋๋ก ํ์ํ ๊ตฌ์ฑ ์์๋ฅผ ํตํฉ ์ ๊ณตํด์, ์ค์น, ์ค์ , ์ ์ง๋ณด์๋ฅผ ๋จ์ํํ ๊ฒ์ด๋ค.
- ์์ ์๋ TS ์ฝ๋ ํด์์ ๋ด๋นํ๋ parser์ TS์ฉ ๊ท์น ์ธํธ์ธ plugin์ ๋ฐ๋ก ์ค์นํด์ผ ํ์ง๋ง,
- ์๋ก์ด ๋ฐฉ์์ธ flat config๊ฐ ์ด๋ค ๊ฐ๋
์ธ๊ฐ
- ๊ธฐ์กด์ .eslintrc๊ฐ YAML/JSON ๊ธฐ๋ฐ์ ์ค์ฒฉ ๊ตฌ์กฐ์๋ค๋ฉด,
flat config๋ ์ค์ ๊ฐ์ฒด๋ค์ ๋ฐฐ์ด๋ก ๋์ดํ๋ ์ฝ๋ ์ค์ฌ ๊ตฌ์กฐ์ด๋ค. - ๋ฐ๋ผ์ ์์ ๋ณด๋ค ๋ ๋ช
์์ ์ด๊ณ , ํ์
์นํ์ ์ด๋ฉฐ, eslint.config.js ํ์ผ์์ ์ง์ JS๋ก ์ค์ ์ ์์ฑํ ์ ์๋ค.
๐๐ป ์ฆ, ์ค์ ํ์ผ๋ ํ๋์ ๋ชจ๋์ฒ๋ผ ์์ฑํ๋ค๋ ๊ฒ ํต์ฌ์ด๋ค.
- ๊ธฐ์กด์ .eslintrc๊ฐ YAML/JSON ๊ธฐ๋ฐ์ ์ค์ฒฉ ๊ตฌ์กฐ์๋ค๋ฉด,
- defineConfig๊ฐ ํ๋ ์ญํ ๊ณผ, ์์ ์ tseslint.config( ... )์์ ๊ด๊ณ๋ ๋ฌด์์ธ๊ฐ
- tseslint.config( )๋ ํ ๋ typescript-eslint์์ ์ ๊ณตํ๋ flat config ํฌํผ ํจ์์๋ค.
์ฆ, ์ฌ๋ฌ ์ค์ ๊ฐ์ฒด๋ฅผ ํฉ์น๊ณ ํ์ ์ง์์ ์ ๊ณตํ๋ ์ญํ ์ ํ์๋ค. - ๊ทธ๋ฌ๋ ESLint v9๋ถํฐ๋ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ defineConfig( )๊ฐ ESLint ์ฝ์ด์ ๊ณต์ ํฌํจ๋์๋ค.
- ๋ฐ๋ผ์ ์ง๊ธ์ defineConfig( )๋ฅผ ์ฐ๋ ๊ฒ์ด ํ์ค์ด๋ฉฐ,
tseslint.config( )๋ ๋ ์ด์ ๊ถ์ฅ๋์ง ์๋ deprecated ์ํ์ด๋ค.
- tseslint.config( )๋ ํ ๋ typescript-eslint์์ ์ ๊ณตํ๋ flat config ํฌํผ ํจ์์๋ค.
- flat config์์ ๋ค์ ๋์์จ extends์ ์๋ฏธ์ ์ฌ์ฉ ํจํด์ ๋ฌด์์ธ๊ฐ
- flat config ์ด๊ธฐ์๋ extends๊ฐ ์์ด์ก์์ง๋ง,
์ฌ์ฉ์๋ค์ด ๋ค๋ฅธ ์ค์ ์ ๊ฐ์ ธ์์ ํ์ฅํ๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ต๋ค๊ณ ํผ๋๋ฐฑํ๋ฉด์ ๋ค์ ๋์์ค๊ฒ ๋์๋ค. - ๋ฐ๋ผ์ ์ด์ ๋ extends ๋ฐฐ์ด ์์ ๋ฌธ์์ด(ex. "esling:recommended"), ๊ฐ์ฒด(ex. { reles: { ... } } ), ๋ฐฐ์ด (ex. tseslint.configs.recommended, react.configs.flat)์ ๋ชจ๋ ๋ฃ์ ์ ์๋ค.
๐๐ป ์ฆ, ์ฌ๋ฌ ์ค์ ๋ค์ ํ ๋ฒ์ ๊ฒน์ณ ๋ง์์ฐ๋ ๊ตฌ์กฐ๋ก ๋ค์ ์ ๋ฆฌ๋ ๊ฒ์ด๋ค.
- flat config ์ด๊ธฐ์๋ extends๊ฐ ์์ด์ก์์ง๋ง,
- .eslintignore ๋์ ์ค์ ํ์ผ ์์์ ์ฌ์ฉํ๋ galobalIgnores๋ ๋ฌด์์ธ๊ฐ
- flat config์์๋ ignores๊ฐ ์ ์ญ, ๋ก์ปฌ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ํผ์ฉ๋์ด์ ํท๊ฐ๋ ธ๋ค.
๋ฐ๋ผ์ ESLint v9์์๋ .eslintignore ์ญํ ์ ๋์ ํ๋ ์ ์ญ ๋ฌด์์ฉ ํจ์์ธ globalIgnores( )๊ฐ ์ถ๊ฐ๋ ๊ฒ์ด๋ค. - ์ด๋ฅผ ํตํด์ ๋น๋ ๊ฒฐ๊ณผ๋ฌผ(dist)์ด๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(node_modules) ๋ฑ์ ์ค์ ํ์ผ ์์์ ์ง์ ์ ์ญ์ ์ผ๋ก ์ ์ธํ ์ ์๊ฒ ๋์๋ค.
- flat config์์๋ ignores๊ฐ ์ ์ญ, ๋ก์ปฌ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ํผ์ฉ๋์ด์ ํท๊ฐ๋ ธ๋ค.
๐ ๊ฒฐ๋ก
ESLint v9๋ ๋ ํ์ ์์ ํ๊ณ , ๋ ๋ช ์์ ์ธ ๊ตฌ์กฐ๋ก ๊ฐ๊ธฐ ์ํด์ flat config ์ฒด๊ณ๋ฅผ ์ค์ฌ์ผ๋ก ๋ง์ ๋ณํ๊ฐ ์๋ ๊ฒ ๊ฐ๋ค.
typescript-eslint ํตํฉ ํจํค์ง์ defineConfig, extends, globalIgnores ๊ฐ์ ์๋ก์ด ํค์๋๋ค์
๊ทธ ๋ณํ ์์์ ๊ฐ๋ฐ์ ๊ฒฝํ์ ๋จ์ํํ๊ณ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋ ๊ฒฐ๊ณผ๋ฌผ๋ก ๋๊ปด์ก๋ค.
์ด๋ฒ ํฌ์คํ ์ ํตํด์ ์๋ก์ด ESLint ์ํ๊ณ๊ฐ ์ ์ด๋ ๊ฒ ๋ฐ๋ ๊ฒ์ธ์ง,
์ด๋ค ์ฝ๋ ํจํด์ด ํ์ฌ ํ์ค์ธ์ง ๊ฐ์ด ์กํ ๊ฒ ๊ฐ๋ค.
์์ผ๋ก๋ ๊ณต์ ๋ฌธ์๋ฅผ ์ฝ์ด๋ณด๋ ์ต๊ด์ ๋ค์ฌ์ผ๊ฒ ๋ค ,,๐คง
'๐ป๊ณต๋ถ ๊ธฐ๋ก > ๐ Frontend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Frontend] ๋ธ๋ ๋์์ ๋ชจ๋ธ ์ ์ํ๊ณ ์น์ผ๋ก ๋์ฐ๊ธฐ (1) | 2025.11.14 |
|---|---|
| [Frontend] ESLint v9๋ก TS+React ๋ฆฐํ ํ๊ฒฝ ๋ง๋ค๊ธฐ (0) | 2025.11.12 |
| [Frontend] React + TypeScript ํ๋ก์ ํธ ๋ง๋ค๊ณ GitHub์ ์ฌ๋ฆฌ๊ธฐ (0) | 2025.11.11 |
| [Frontend] localStorage VS sessionStorage VS cookies (0) | 2025.06.28 |
| [Frontend] Cookies (0) | 2025.06.28 |