๐ŸŒŸ eslint-plugin-jsx-a11y๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

๋ฐœํ–‰: (2025๋…„ 12์›” 28์ผ ์˜ค์ „ 07:56 GMT+9)
3 min read
์›๋ฌธ: Dev.to

Source: Dev.to

eslintโ€‘pluginโ€‘jsxโ€‘a11y๋ž€?

ESLint ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ, JSX ์ฝ”๋“œ๋ฅผ ์ •์  ๋ถ„์„ํ•˜์—ฌ ์ ‘๊ทผ์„ฑ ๊ทœ์น™ ์ง‘ํ•ฉ์„ ์‹๋ณ„ํ•˜๊ณ  ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ฝ”๋“œ๊ฐ€ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

์™œ ์ค‘์š”ํ•œ๊ฐ€?

์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์žฅ์• ๊ฐ€ ์žˆ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๋ฐฐ์ œํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ์ ‘๊ทผ์„ฑ ์˜ค๋ฅ˜๋ฅผ ์˜ˆ๋ฐฉํ•ฉ๋‹ˆ๋‹ค. a11y๋ฅผ ๋ฆฐํŒ… ํ๋ฆ„์— ํ†ตํ•ฉํ•จ์œผ๋กœ์จ ๋‹ค์Œ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค:

  • ์˜ˆ๋ฐฉ์  ๊ฐœ๋ฐœ โ€“ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ˆœ๊ฐ„ ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฏ€๋กœ, ๋‚˜์ค‘์— ๊ณ ์น˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • ์ง€์†์ ์ธ ๊ต์œก โ€“ ๊ฐ€์ด๋“œ ์—ญํ• ์„ ํ•˜๋ฉฐ React/JSX ์š”์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ฑ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ๊ฐ€๋ฅด์นฉ๋‹ˆ๋‹ค.
  • ์ค€์ˆ˜ โ€“ WCAG(์›น ์ฝ˜ํ…์ธ  ์ ‘๊ทผ์„ฑ ๊ฐ€์ด๋“œ๋ผ์ธ)์™€ ๊ฐ™์€ ์ค‘์š”ํ•œ ์ ‘๊ทผ์„ฑ ์ง€์นจ์„ ๋”ฐ๋ฅด๋„๋ก ์ฝ”๋“œ๋ฅผ ๋•์Šต๋‹ˆ๋‹ค.

๊ฐ์ง€ํ•˜๋Š” ๋ฌธ์ œ ์˜ˆ์‹œ

  • img without alt โ€“ alt ์†์„ฑ์ด ์—†๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์„ ๋•Œ ๊ฒฝ๊ณ ํ•ฉ๋‹ˆ๋‹ค(์Šคํฌ๋ฆฐ ๋ฆฌ๋”์— ํ•„์ˆ˜).
  • onClick without onKeyPress/onKeyDown โ€“ onClick์„ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์š”์†Œ๊ฐ€ ํ‚ค๋ณด๋“œ๋กœ๋„ ์ž‘๋™ํ•˜๋„๋ก ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ผ๋ฒจ์ด ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์€ ํผ ์ปจํŠธ๋กค โ€“ ์ž…๋ ฅ ์š”์†Œ์™€ <label>( htmlFor ์‚ฌ์šฉ)์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ARIA ์†์„ฑ ์˜ค์šฉ โ€“ aria- ์†์„ฑ์˜ ๋ฌธ๋ฒ• ๋ฐ ์‚ฌ์šฉ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด์šฉ์ด ๋ณด์ด์ง€ ์•Š๋Š” ๋งํฌ (<a>) โ€“ ๋งํฌ์— ํ…์ŠคํŠธ๋‚˜ ARIA ์„ค๋ช…์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๋„๊ตฌ์™€์˜ ๋ณด์™„

eslint-plugin-jsx-a11y๋Š” ์†Œ์Šค ์ฝ”๋“œ(JSX)๋ฅผ ์ •์  ๋ถ„์„ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€์— ์ตœ์ข…์ ์œผ๋กœ ๋ Œ๋”๋ง๋œ HTML์„ ํ…Œ์ŠคํŠธํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„ ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ ๋„๊ตฌ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค:

  • reactโ€‘axe (or @axeโ€‘core/react) โ€“ ์ตœ์ข… DOM์„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  • jestโ€‘axe โ€“ ๋ Œ๋”๋ง ํ›„ ์ ‘๊ทผ์„ฑ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์š”์•ฝ: eslint-plugin-jsx-a11y๋Š” React ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ ‘๊ทผ์„ฑ์„ ํ•ต์‹ฌ ์š”์†Œ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์ฒซ ๋ฒˆ์งธ ๋ฐฉ์–ด์„ ์ž…๋‹ˆ๋‹ค.

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

๐Ÿ”‘ React์—์„œ useId๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

useId๋Š” React์˜ Hook์œผ๋กœ, ๋ฒ„์ „ 18๋ถ€ํ„ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ณ ์œ ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์‹๋ณ„์ž๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด Hook์€ ๋ณด์žฅ๋œ ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

React ์ปดํฌ๋„ŒํŠธ ์„ค๋ช…: ์ดˆ๋ณด์ž ์นœํ™”์ ์ธ ์˜ˆ์ œ ๊ฐ€์ด๋“œ

์†Œ๊ฐœ React ์ปดํฌ๋„ŒํŠธ ์ค‘ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” HTML๊ณผ ์œ ์‚ฌํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” JavaScript ํ•จ์ˆ˜์ธ JSX โ€” JavaScript XML์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•ต์‹ฌ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

React: ์•”์‹œ์  ๋ฐ˜ํ™˜ vs ๋ช…์‹œ์  ๋ฐ˜ํ™˜์˜ ์ „์Ÿ. ๋‹น์‹ ์€ ์–ด๋А ํŽธ์ธ๊ฐ€์š”?

์˜ค๋Š˜ ์•„์นจ์— PR์„ ๊ฒ€ํ† ํ•˜๋ฉด์„œ ์ด๋ฒˆ ์ฃผ์— ์„ธ ๋ฒˆ์งธ๋กœ ๊ฐ™์€ ๊ตฌ๋ฌธ์„ ๊ผฌ์ง‘๋Š” ๋ชจ์Šต์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ œ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ง€์†์ ์ธ ๋‚ด๋ถ€ ๊ฐˆ๋“ฑ์„ ๋ถˆ๋Ÿฌ์ผ์œผ์ผฐ์Šต๋‹ˆ๋‹คโ€ฆ