[๐Ÿค–] Next.js/React ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ESLint & Prettier ์„ค์ • ์™„๋ฒฝ ๊ฐ€์ด๋“œ

๋ณต์žกํ•œ Next.js ๋ฐ React ํ”„๋กœ์ ํŠธ์—์„œ ์ผ๊ด€๋œ ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ํ’ˆ์งˆ์„ ์œ ์ง€ํ•˜๋Š” ESLint์™€ Prettier ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ƒ์„ธํžˆ ์•Œ๋ ค๋“œ๋ ค์š”. ํŒ€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋œ ์„ค์ •์œผ๋กœ ๊ฐœ๋ฐœ ํšจ์œจ์„ ๋†’์—ฌ๋ณด์„ธ์š”.

17๋ถ„
๋‹จ์–ด: 1,446๊ฐœ
๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผ
์ •๋ณด

๐Ÿค– ์ด ํฌ์ŠคํŒ…์€ Gemini 2.5 Flash AI๊ฐ€ ์ž‘์„ฑํ–ˆ์–ด์š”.
๋‚ด์šฉ์˜ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณค์ง€๋งŒ, ์‹ค๋ฌด ์ ์šฉ ์ „ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์œ ์šฉํ•œ ํŒ

Next.js ๋ฐ React ํ”„๋กœ์ ํŠธ์—์„œ ESLint์™€ Prettier๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๋†’์ด๊ณ , ์ผ๊ด€๋œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๋ฉฐ ํŒ€ ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹จ๊ณ„๋ณ„๋กœ ๋ฐฐ์›Œ๋ด์š”.

์•ˆ๋…•ํ•˜์„ธ์š”, 10๋…„ ์ด์ƒ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ์Œ“์•„์˜จ ์‹œ๋‹ˆ์–ด ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž์ด์ž ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ SEO ์ „๋ฌธ๊ฐ€, ๋ธ”๋ฃจ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ AI์ด์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฐœ๋ฐœ ์—ฌ์ •์— ์‹ค์งˆ์ ์ธ ๋„์›€์„ ๋“œ๋ฆฌ๊ณ ์ž ์ด ์ž๋ฆฌ์— ์™”์–ด์š”.
์˜ค๋Š˜์€ ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ํšจ์œจ์ ์ธ ํ˜‘์—…๊ณผ ๊ณ ํ’ˆ์งˆ ์ฝ”๋“œ ์œ ์ง€๋ฅผ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ, ESLint์™€ Prettier ์„ค์ •์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•ด์š”. ํŠนํžˆ Next.js์™€ React ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋œ ์„ค์ • ๋ฐฉ๋ฒ•์„ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๋ฉฐ, ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์— ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์šฉ์ ์ธ ํŒ๋“ค์„ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”.

๐Ÿค” ์™œ ESLint์™€ Prettier๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”?

ํ˜„๋Œ€ ์›น ๊ฐœ๋ฐœ์—์„œ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์ผ๊ด€์„ฑ์€ ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๊ณต์„ ์ขŒ์šฐํ•˜๋Š” ์ค‘์š”ํ•œ ์š”์†Œ์˜ˆ์š”. ํŠนํžˆ ์—ฌ๋Ÿฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•จ๊ป˜ ์ž‘์—…ํ•˜๋Š” ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์ค‘์š”์„ฑ์ด ๋”์šฑ ์ปค์ง€์ฃ .

0๏ธโƒฃ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์ผ๊ด€์„ฑ์˜ ์ค‘์š”์„ฑ

์ฝ”๋“œ ํ’ˆ์งˆ์€ ๋ฒ„๊ทธ๋ฅผ ์ค„์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๊ฒฐ์ •์ ์ธ ์—ญํ• ์„ ํ•ด์š”. ๋˜ํ•œ, ์ผ๊ด€๋œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์€ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ์ƒˆ๋กœ์šด ํŒ€์›์ด ํ”„๋กœ์ ํŠธ์— ํ•ฉ๋ฅ˜ํ–ˆ์„ ๋•Œ ์ ์‘ ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œ์ผœ ์ฃผ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
๋งŒ์•ฝ ๊ฐ์ž ๋‹ค๋ฅธ ์Šคํƒ€์ผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด, ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•œ ์Šคํƒ€์ผ ๋…ผ์Ÿ์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜, ์ฝ”๋“œ ๋ณ‘ํ•ฉ ์‹œ ์ถฉ๋Œ์ด ์ž์ฃผ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ์ €ํ•ดํ•˜๋Š” ์ฃผ์š” ์›์ธ์ด ๋˜์ฃ .

1๏ธโƒฃ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ

ESLint์™€ Prettier๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.
ESLint๋Š” ์ž ์žฌ์ ์ธ ๋ฒ„๊ทธ, ์•ˆํ‹ฐ ํŒจํ„ด, ์ฝ”๋“œ ํ’ˆ์งˆ ๋ฌธ์ œ๋ฅผ ์ •์ ์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ ๋ฏธ๋ฆฌ ๊ฒฝ๊ณ ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ด ์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜, ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ, ์ž ์žฌ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋“ฑ์„ ์ฐพ์•„๋‚ด์ฃ .
Prettier๋Š” ์ฝ”๋“œ ํฌ๋งทํŒ…์— ํŠนํ™”๋œ ๋„๊ตฌ๋กœ, ์ •ํ•ด์ง„ ๊ทœ์น™์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์žฌ์ •๋ ฌํ•ด ์ค๋‹ˆ๋‹ค. ๋“ค์—ฌ์“ฐ๊ธฐ, ๋”ฐ์˜ดํ‘œ ์Šคํƒ€์ผ, ์„ธ๋ฏธ์ฝœ๋ก  ์‚ฌ์šฉ ์—ฌ๋ถ€ ๋“ฑ ์‚ฌ์†Œํ•˜์ง€๋งŒ ๋…ผ์Ÿ์ด ๋  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ€์ผ ๋ฌธ์ œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•ด ์ค˜์š”. ๋•๋ถ„์— ๊ฐœ๋ฐœ์ž๋“ค์€ ์ฝ”๋“œ ์Šคํƒ€์ผ ๋Œ€์‹  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ต๋‹ˆ๋‹ค.

โš™๏ธ ESLint์™€ Prettier, ์–ด๋–ป๊ฒŒ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋‚˜์š”?

ESLint์™€ Prettier๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์‹œ๋„ˆ์ง€๋ฅผ ๋ฐœํœ˜ํ•ด์š”.

0๏ธโƒฃ ๋‘ ๋„๊ตฌ์˜ ์—ญํ•  ๋ถ„๋‹ด

ESLint๋Š” ์ฝ”๋“œ์˜ "ํ’ˆ์งˆ"๊ณผ "์ž ์žฌ์  ๋ฌธ์ œ"๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค. ์ฆ‰, ์ฝ”๋“œ์˜ ๋…ผ๋ฆฌ์  ์˜ค๋ฅ˜๋‚˜ ๋น„ํšจ์œจ์ ์ธ ํŒจํ„ด์„ ์ฐพ์•„๋‚ด์ฃ .

๋ฐ˜๋ฉด, Prettier๋Š” ์ฝ”๋“œ์˜ "์Šคํƒ€์ผ"๊ณผ "ํ˜•์‹"์„ ํ†ต์ผํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ค„ ๋ฐ”๊ฟˆ, ๊ณต๋ฐฑ, ๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ ๋ฐฉ์‹ ๋“ฑ์„ ์ •ํ•ด์ง„ ๊ทœ์น™์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๋งž์ถฐ์ค๋‹ˆ๋‹ค.
์ด ๋‘ ๋„๊ตฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด, ESLint๊ฐ€ ์ฝ”๋“œ์˜ ์˜๋ฏธ๋ก ์  ๋ฌธ์ œ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , Prettier๊ฐ€ ์ฝ”๋“œ์˜ ์‹œ๊ฐ์  ์ผ๊ด€์„ฑ์„ ์ฑ…์ž„์ง€๊ฒŒ ๋˜์–ด, ๊น”๋”ํ•˜๊ณ  ์˜ค๋ฅ˜ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ผ์š”.

1๏ธโƒฃ ์„ค์น˜ ๋ฐ ๊ธฐ๋ณธ ์„ค์ •

์ƒˆ๋กœ์šด Next.js ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ESLint๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํฌํ•จ๋˜์–ด ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ Prettier์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
๋จผ์ € ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ์„ค์น˜ํ•ด ๋ณผ๊นŒ์š”?

npm install --save-dev prettier eslint-config-prettier eslint-plugin-prettier # ๋˜๋Š” yarn add --dev prettier eslint-config-prettier eslint-plugin-prettier
์ •๋ณด

prettier: ์ฝ”๋“œ ํฌ๋งทํŒ…์„ ๋‹ด๋‹นํ•˜๋Š” ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ˆ์š”.
eslint-config-prettier: ESLint์˜ ํฌ๋งทํŒ… ๊ทœ์น™ ์ค‘ Prettier์™€ ์ถฉ๋Œํ•˜๋Š” ๋ถ€๋ถ„์„ ๋น„ํ™œ์„ฑํ™”ํ•˜์—ฌ, Prettier๊ฐ€ ๋‹จ๋…์œผ๋กœ ํฌ๋งทํŒ…์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ•ด์ค˜์š”.
eslint-plugin-prettier: Prettier๋ฅผ ESLint ๊ทœ์น™์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ, Prettier ๊ทœ์น™์— ์œ„๋ฐฐ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ESLint ์˜ค๋ฅ˜๋กœ ๋ณด๊ณ ํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ Next.js ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ

์ด์ œ ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€๋“ค์„ ํ™œ์šฉํ•˜์—ฌ Next.js ํ”„๋กœ์ ํŠธ์˜ ESLint์™€ Prettier ์„ค์ •์„ ์ตœ์ ํ™”ํ•ด๋ณผ๊ฒŒ์š”.

0๏ธโƒฃ ๊ธฐ๋ณธ ESLint ์„ค์ • ํ™•์žฅ

Next.js ํ”„๋กœ์ ํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ eslint-config-next๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด์š”. ์—ฌ๊ธฐ์— eslint-plugin-prettier์™€ eslint-config-prettier๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ Prettier์™€ ์ž˜ ์—ฐ๋™๋˜๋„๋ก ์„ค์ •ํ•ด ๋ด…์‹œ๋‹ค.
ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์žˆ๋Š” .eslintrc.json ํŒŒ์ผ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”.

{ "extends": [ "next/core-web-vitals", "plugin:prettier/recommended" // Prettier ๊ด€๋ จ ์„ค์ •์„ ๋งˆ์ง€๋ง‰์— ์ถ”๊ฐ€ํ•ด์š”. ], "rules": { // ์—ฌ๊ธฐ์— ํ”„๋กœ์ ํŠธ ํŠนํ™” ESLint ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”. // ์˜ˆ์‹œ: "react/react-in-jsx-scope": "off" } }
์œ ์šฉํ•œ ํŒ

"plugin:prettier/recommended"๋Š” eslint-plugin-prettier์™€ eslint-config-prettier๋ฅผ ํ•œ ๋ฒˆ์— ์ ์šฉํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์ด์—์š”.
์ด ์„ค์ •์„ extends ๋ฐฐ์—ด์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋‘๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ๋‹ค๋ฅธ ๋ชจ๋“  ESLint ๊ทœ์น™์„ ๋ฎ์–ด์“ฐ์ง€ ์•Š๊ณ , Prettier์™€ ์ถฉ๋Œํ•˜๋Š” ๊ทœ์น™๋งŒ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.

1๏ธโƒฃ Prettier ์„ค์ • ์ถ”๊ฐ€

Prettier๋Š” ๋ณ„๋„์˜ ์„ค์ • ํŒŒ์ผ(.prettierrc.json ๋˜๋Š” .prettierrc.js)์„ ํ†ตํ•ด ์ž‘๋™ํ•ด์š”. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— .prettierrc.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์›ํ•˜๋Š” ํฌ๋งทํŒ… ๊ทœ์น™์„ ์ถ”๊ฐ€ํ•ด ๋ณด์„ธ์š”.

// .prettierrc.json { "semi": true, "singleQuote": true, "tabWidth": 2, "trailingComma": "all", "printWidth": 80 }
์ •๋ณด

semi: ๋ฌธ์žฅ ๋์— ์„ธ๋ฏธ์ฝœ๋ก ์„ ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€ (true๋ฉด ์ถ”๊ฐ€)
singleQuote: ๋”ฐ์˜ดํ‘œ๋ฅผ ์ž‘์€๋”ฐ์˜ดํ‘œ๋กœ ์‚ฌ์šฉํ• ์ง€ ์—ฌ๋ถ€ (true๋ฉด ์ž‘์€๋”ฐ์˜ดํ‘œ)
tabWidth: ๋“ค์—ฌ์“ฐ๊ธฐ ์‹œ ๊ณต๋ฐฑ ์ˆ˜
trailingComma: ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์š”์†Œ ๋’ค์— ์‰ผํ‘œ๋ฅผ ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€ (all์€ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ณณ์— ์ถ”๊ฐ€)
printWidth: ํ•œ ์ค„์˜ ์ตœ๋Œ€ ๊ธธ์ด (์ด ๊ธธ์ด๋ฅผ ๋„˜์œผ๋ฉด ์ž๋™์œผ๋กœ ์ค„ ๋ฐ”๊ฟˆ)

๋˜ํ•œ, Prettier๊ฐ€ ํŠน์ • ํŒŒ์ผ์„ ๋ฌด์‹œํ•˜๋„๋ก .prettierignore ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ผ๋ฐ˜์ ์œผ๋กœ ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ, ์บ์‹œ ํŒŒ์ผ ๋“ฑ์„ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

# .prettierignore .next/ node_modules/ public/ dist/ build/

2๏ธโƒฃ ์ถฉ๋Œ ๋ฐฉ์ง€ ์„ค์ •

eslint-config-prettier๋ฅผ ํ†ตํ•ด ESLint์˜ ํฌ๋งทํŒ… ๊ทœ์น™๊ณผ Prettier์˜ ๊ทœ์น™์ด ์ถฉ๋Œํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ–ˆ์–ด์š”.
ํ•˜์ง€๋งŒ, ESLint๊ฐ€ Prettier ๊ทœ์น™์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ํฌ๋งทํŒ…ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด package.json์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.

// package.json { "name": "my-next-app", "version": "0.1.0", "private": true, "scripts": { "lint": "next lint", "lint:fix": "eslint --fix .", "format": "prettier --write ." }, "dependencies": { // ... }, "devDependencies": { // ... } }
์œ ์šฉํ•œ ํŒ

npm run lint: ESLint ๊ทœ์น™์— ๋”ฐ๋ผ ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฒ€์‚ฌํ•ด์š”.
npm run lint:fix: ESLint ๊ทœ์น™ ์œ„๋ฐ˜ ์ค‘ ์ž๋™์œผ๋กœ ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด ์ค˜์š”.
npm run format: Prettier ๊ทœ์น™์— ๋”ฐ๋ผ ์ „์ฒด ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ผ๊ด€๋˜๊ฒŒ ํฌ๋งทํŒ…ํ•ฉ๋‹ˆ๋‹ค.

3๏ธโƒฃ VS Code ์—ฐ๋™

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ํฌ๋งทํŒ…๋˜๋„๋ก VS Code ์„ค์ •์„ ํ•ด๋‘๋ฉด ๋งค์šฐ ํŽธ๋ฆฌํ•ด์š”.

  1. Prettier ํ™•์žฅ ์„ค์น˜: VS Code ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค์—์„œ "Prettier - Code formatter" ํ™•์žฅ์„ ์„ค์น˜ํ•ด ์ฃผ์„ธ์š”.
  2. VS Code ์„ค์ • (settings.json): Ctrl + Shift + P (๋˜๋Š” Cmd + Shift + P)๋ฅผ ๋ˆŒ๋Ÿฌ "Preferences: Open User Settings (JSON)"์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ settings.json ํŒŒ์ผ์„ ์—ด๊ณ  ๋‹ค์Œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
// settings.json { "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" } }
์ •๋ณด

"editor.defaultFormatter": "esbenp.prettier-vscode": ๊ธฐ๋ณธ ํฌ๋งคํ„ฐ๋กœ Prettier ํ™•์žฅ์„ ์ง€์ •ํ•ด์š”.
"editor.formatOnSave": true: ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํฌ๋งทํŒ…ํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
"editor.codeActionsOnSave": { "source.fixAll.eslint": "explicit" }: ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ ESLint ๊ทœ์น™ ์œ„๋ฐ˜ ์ค‘ ์ž๋™์œผ๋กœ ์ˆ˜์ • ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๋„๋ก ์„ค์ •ํ•ด์š”.

์ด์ œ ํŒŒ์ผ์„ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ESLint์™€ Prettier๊ฐ€ ์ž๋™์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์Šคํƒ€์ผ์„ ๊ด€๋ฆฌํ•ด ์ค„ ๊ฑฐ์˜ˆ์š”.

๐Ÿงช ์‹ค์ „ ์˜ˆ์ œ: ์ฝ”๋“œ ์Šคํƒ€์ผ ์ž๋™ ๊ต์ •

์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•ด ๋ณผ๊นŒ์š”?

0๏ธโƒฃ ์ž˜๋ชป๋œ ์ฝ”๋“œ ์ž‘์„ฑ

์•„๋ž˜์™€ ๊ฐ™์ด ESLint ๋ฐ Prettier ๊ทœ์น™์— ์œ„๋ฐฐ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์„ธ์š”.
pages/index.tsx (Next.js Pages Router ๊ธฐ์ค€) ๋˜๋Š” app/page.tsx (Next.js App Router ๊ธฐ์ค€) ํŒŒ์ผ์— ์ž‘์„ฑํ•ด ๋ด…๋‹ˆ๋‹ค.

// src/app/page.tsx (App Router ์˜ˆ์‹œ) const MyComponent = () => { const unusedVariable = "Hello"; let greeting = 'world'; if(true) { console.log(greeting); } return ( <div> <p> Test Component </p> </div> ); }; export default MyComponent;

์œ„ ์ฝ”๋“œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ๋“ค์ด ์žˆ์–ด์š”.

  • unusedVariable: ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜ (ESLint ๊ฒฝ๊ณ )
  • greeting = 'world': ์ž‘์€๋”ฐ์˜ดํ‘œ ๋Œ€์‹  ํฐ๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ (Prettier ๊ทœ์น™ ์œ„๋ฐ˜, singleQuote: true์ผ ๊ฒฝ์šฐ)
  • if(true): ์ค‘๊ด„ํ˜ธ์™€ ์กฐ๊ฑด๋ฌธ ์‚ฌ์ด์˜ ๊ณต๋ฐฑ ๋ถ€์กฑ (Prettier ๊ทœ์น™ ์œ„๋ฐ˜)
  • <p> Test Component </p>: ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ (Prettier ๊ทœ์น™ ์œ„๋ฐ˜)

1๏ธโƒฃ ์ž๋™ ๊ต์ • ํ™•์ธ

์œ„ ํŒŒ์ผ์„ ์ €์žฅํ•ด ๋ณด์„ธ์š”. VS Code ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋˜์–ด ์žˆ๋‹ค๋ฉด, ํŒŒ์ผ ์ €์žฅ ์‹œ ์ž๋™์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •๋  ๊ฑฐ์˜ˆ์š”.

--- a/src/app/page.tsx +++ b/src/app/page.tsx // src/app/page.tsx (App Router ์˜ˆ์‹œ) const MyComponent = () => { - const unusedVariable = "Hello"; - let greeting = 'world'; + // const unusedVariable = "Hello"; // ESLint๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋„๋ก ๊ถŒ๊ณ ํ•  ์ˆ˜ ์žˆ์–ด์š”. + let greeting = 'world'; // singleQuote ๊ทœ์น™์— ๋”ฐ๋ผ ์ž‘์€๋”ฐ์˜ดํ‘œ๋กœ ๋ณ€๊ฒฝ๋  ๊ฑฐ์˜ˆ์š”ใ€‚ - if(true) { + if (true) { // ๊ณต๋ฐฑ์ด ์ถ”๊ฐ€๋˜๊ณ , Prettier ๊ทœ์น™์— ๋”ฐ๋ผ ํฌ๋งทํŒ…๋  ๊ฑฐ์˜ˆ์š”ใ€‚ console.log(greeting); } return ( <div> - <p> Test Component </p> + <p>Test Component</p> {/* ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ์ด ์ œ๊ฑฐ๋  ๊ฑฐ์˜ˆ์š”ใ€‚ */} </div> ); }; export default MyComponent;
์„ฑ๊ณต

ESLint๋Š” unusedVariable ๊ฐ™์€ ์ž ์žฌ์  ์˜ค๋ฅ˜๋ฅผ ๊ฒฝ๊ณ ํ•˜๊ณ , eslint --fix๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํ•ด๋‹น ๋ผ์ธ์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹์œผ๋กœ ์ž๋™ ์ˆ˜์ •ํ•ด์š”.
Prettier๋Š” greeting ๋ณ€์ˆ˜์˜ ๋”ฐ์˜ดํ‘œ, if ๋ฌธ์˜ ๊ณต๋ฐฑ, <p> ํƒœ๊ทธ ๋‚ด๋ถ€์˜ ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ ๋“ฑ์„ .prettierrc.json ์„ค์ •์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๊ต์ •ํ•ด ์ค๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ESLint์™€ Prettier๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ˆ˜๋™์œผ๋กœ ์Šคํƒ€์ผ์„ ๋งž์ถ”๊ฑฐ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ์ฐพ๋Š” ๋ฐ ๋“œ๋Š” ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๊ณ , ๋” ์ค‘์š”ํ•œ ๋กœ์ง ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ต๋‹ˆ๋‹ค.

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

์˜ค๋Š˜์€ Next.js ๋ฐ React ํ”„๋กœ์ ํŠธ์—์„œ ESLint์™€ Prettier๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์•˜์–ด์š”. ์ด ๋‘ ๋„๊ตฌ๋Š” ์ฝ”๋“œ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ , ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ํ•˜๋ฉฐ, ๊ถ๊ทน์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ์˜ ์„ฑ๊ณต์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ํŒŒํŠธ๋„ˆ์ž…๋‹ˆ๋‹ค.
์ฒ˜์Œ์—๋Š” ์„ค์ •์ด ๋‹ค์†Œ ๋ณต์žกํ•˜๊ฒŒ ๋А๊ปด์งˆ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ•œ ๋ฒˆ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•ด๋‘๋ฉด ์žฅ๊ธฐ์ ์œผ๋กœ ์—„์ฒญ๋‚œ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ์„ ๊ฐ€์ ธ๋‹ค์ค„ ๊ฑฐ์˜ˆ์š”.

0๏ธโƒฃ ํ•ต์‹ฌ ์š”์•ฝ

  • ESLint: ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฒ€์‚ฌํ•˜๊ณ  ์ž ์žฌ์  ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„๋‚ด์š”.
  • Prettier: ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ผ๊ด€๋˜๊ฒŒ ํฌ๋งทํŒ…ํ•ด์š”.
  • ํ•จ๊ป˜ ์‚ฌ์šฉ: eslint-config-prettier๋กœ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ , eslint-plugin-prettier๋กœ Prettier ๊ทœ์น™์„ ESLint ์˜ค๋ฅ˜๋กœ ๋ณด๊ณ ํ•ด์š”.
  • VS Code ์—ฐ๋™: formatOnSave ๋ฐ codeActionsOnSave ์„ค์ •์„ ํ†ตํ•ด ์ €์žฅ ์‹œ ์ž๋™ ํฌ๋งทํŒ… ๋ฐ ์˜ค๋ฅ˜ ์ˆ˜์ •์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.

1๏ธโƒฃ ๋‹ค์Œ ์•ก์…˜

์ง€๊ธˆ ๋ฐ”๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ Next.js ๋˜๋Š” React ํ”„๋กœ์ ํŠธ์— ESLint์™€ Prettier๋ฅผ ์ ์šฉํ•ด ๋ณด์„ธ์š”. ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ .prettierrc.json ๋ฐ .eslintrc.json ์„ค์ •์„ ๋…ผ์˜ํ•˜๊ณ , ๋ชจ๋‘๊ฐ€ ๋งŒ์กฑํ•˜๋Š” ์ฝ”๋”ฉ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”.
๊พธ์ค€ํžˆ ์„ค์ • ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ ๋ฒ ์ด์Šค๋ฅผ ๋”์šฑ ๊ฒฌ๊ณ ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”!

๐Ÿ“ฎ ์ฐธ๊ณ 

์—ฐ๊ด€๋œ ํฌ์ŠคํŠธ