โ† ๋ชฉ๋ก์œผ๋กœ
ESLint Boundaries plugin

์˜์กด์„ฑ ๊ด€๋ฆฌ

๋ชจ๋…ธ ๋ ˆํฌ์—์„œ๋Š” ํŒจํ‚ค์ง€ ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ทœ์น™์„ ์ •์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • library ํŒจํ‚ค์ง€์—์„œ๋Š” feature ํŒจํ‚ค์ง€๋ฅผ ๋ถˆ๊ฐ€๋Šฅ.
  • feature ํŒจํ‚ค์ง€์—์„œ๋Š” ๋‹ค๋ฅธ feature ํŒจํ‚ค์ง€๋ฅผ ์ฐธ์กฐ ๋ถˆ๊ฐ€๋Šฅ.
  • feature ํŒจํ‚ค์ง€์—์„œ๋Š” library ํŒจํ‚ค์ง€๋ฅผ ์ฐธ์กฐ ๊ฐ€๋Šฅ.

ESLint ์„ค์ •

์ด์™€ ๊ฐ™์€ ๊ทœ์น™์„ ๋ชจ๋‘๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜์—ฌ๋„ ์‹ค์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ESLint๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ ๋™์ž‘ ๋ฐฉ์‹

ESLint๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ eslint-plugin-์ด๋ผ๋Š” ์ด๋ฆ„์˜ npm ํŒจํ‚ค์ง€๋ฅผ ์ฐพ์•„์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ npm ๋ฐฐํฌ ๋˜๋Š” npm link๋ฅผ ํ†ตํ•ด์„œ ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐฐํฌ๋‚˜ link ์—†์ด ์‚ฌ์šฉํ•˜๋ ค๋ฉด eslint-plugin-local์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ESLint plugin ๊ตฌํ˜„ํ•˜๊ธฐ

ESLint ์‚ฌ์ดํŠธ ์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์ฐธ๊ณ ํ•ฉ๋‹ˆ๋‹ค.
ํ”Œ๋Ÿฌ๊ทธ์ธ ์ŠคํŽ™์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • package.json์— ํŒจํ‚ค์ง€ ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ์ธ์ง€ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ๋ฅผ ํŒŒ์‹ฑ
  • ํŒŒ์ผ์˜ import ๊ฒฝ๋กœ๊ฐ€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ path alias ๋˜๋Š” ์ƒ๋Œ€๊ฒฝ๋กœ์ธ์ง€ ํŒŒ์•…ํ•˜์—ฌ ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ ๋ณ€ํ™˜
  • ์œ„์˜ ํŒŒ์‹ฑ๋œ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—๋Ÿฌ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ

ESLint์—์„œ ํŒŒ์ผ์„ ํŒŒ์‹ฑํ• ๋•Œ import์„ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒฝ์šฐ ImportDeclaration ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ ํ•ด๋‹น ํ•จ์ˆ˜์— ๋กœ์ง์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” eslint-plugin-check-import์—์„œ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์ž‘ ํ™•์ธํ•ด๋ณด๊ธฐ

ESLint cli๋ฅผ ํ†ตํ•ด์„œ ์ •์ƒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ paths๋กœ ์„ค์ •๋œ import๋Š” intellij์—์„œ ์—๋Ÿฌ๋กœ ํ‘œ์‹œ๊ฐ€ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด์œ ๋Š” intellij๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ESLint ์„ค์ • ํŒŒ์ผ์„ ์ฐพ์•„์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.
์—ฌ๋Ÿฌ๊ฐœ์˜ ESLint ์„ค์ • ํŒŒ์ผ๊ณผ tsconfig ํŒŒ์ผ์ด ์กด์žฌํ•  ๋•Œ์—๋Š” ESLint์˜ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ช…์‹œํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
eslint -> manual eslint config -> working directory๋ฅผ ./์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ์–ด์ฃผ๊ณ  ESLint ์—๋Ÿฌ๊ฐ€ visaul studio code์™€ intellij ๋ชจ๋‘ ์ž˜ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฏธ ๋ˆ„๊ตฐ๊ฐ€๋Š” ๋งŒ๋“ค์—ˆ๋‹ค

์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ์€ @nx/eslint-plugin๊ณผ eslint-plugin-boundaries๊ฐ€ ๋งŽ์ด ์“ฐ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ง์ ‘ ๊ตฌํ˜„ํ• ๋•Œ์—๋„ eslint-plugin-boundaries ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋™์ผํ•˜๊ฒŒ minimatch ๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ ๊ตฌํ˜„ํ•œ ๊ฒƒ, nx, eslint-plugin-boundaries ์ค‘์— ๋ฌด์—‡์„ ์‚ฌ์šฉ ํ• ์ง€ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€
@nx/eslint-plugin๋Š” nx ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์— ์˜์ง€ํ•˜๊ณ  ์žˆ์–ด์„œ ํšŒ์‚ฌ ๋‚ด์—์„œ๋Š” nx๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†์–ด ๋ฐฐ์ œํ•˜์˜€๊ณ 
eslint-plugin-boundaries๋Š” ๋””๋ฒ„๊น… ๋ชจ๋“œ์™€ capture์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•˜์—ฌ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ง์ ‘ ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋™์ž‘ ๊ณผ์ •์„ ์ดํ•ดํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ข‹์€ ๊ฒฝํ—˜์ด์˜€์Šต๋‹ˆ๋‹ค.