[2์ฃผ์ฐจ] WAI-ARIA

Joeyยท2024๋…„ 10์›” 3์ผ

๐Ÿค”wai-aria๐Ÿค”

Web Accessibility Initiative โ€“ Accessible Rich Internet Applications

WAI๋Š” W3C์—์„œ ์›น ์ ‘๊ทผ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ๊ธฐ๊ด€.
ARIA๋Š” RIA ํ™˜๊ฒฝ์˜ ์›น ์ ‘๊ทผ์„ฑ์— ๋Œ€ํ•œ ํ‘œ์ค€ ๊ธฐ์ˆ  ๊ทœ๊ฒฉ์„ ์˜๋ฏธํ•จ.
์Šคํฌ๋ฆฐ ๋ฆฌ๋” ๋“ฑ ๋ณด์กฐ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” ์žฅ์• ์ธ์ด RIA ๊ธฐ์ˆ ๋กœ ์ œ์ž‘๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์— RIA ๊ธฐ์ˆ ์ด ์ ‘๊ทผ์„ฑ์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋น„ํŒ์„ ๋ฐ›์•„์™”์Œ.

์ด์— W3C(World Wide Web Consortium, ์ดํ•˜ W3C)์—์„œ๋Š” ์›น ์ฝ˜ํ…์ธ  ๋ฐ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ ‘๊ทผ์„ฑ๊ณผ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์ˆ  ๋ช…์„ธ๋ฅผ ๋ฐœํ‘œํ–ˆ๋Š”๋ฐ ์ด ๋ช…์„ธ๊ฐ€ ๋ฐ”๋กœ WAI-ARIA(Web Accessibility Initiative - Web Accessible Rich Internet Applications, ์ดํ•˜ WAI-ARIA)์ž„.

WAI-ARIA๋Š” ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ๋ฐ ๋ณด์กฐ ๊ธฐ๊ธฐ ๋“ฑ์—์„œ ์ ‘๊ทผ์„ฑ ๋ฐ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ํƒ„์ƒํ–ˆ์œผ๋ฉฐ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—ญํ• (Role), ์†์„ฑ(Property), ์ƒํƒœ(State) ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด๋ฅผ ๊ฐœ์„  ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๊ณ  ์žˆ์Œ

2014๋…„ 3์›” 20์ผ WAI-ARIA๋Š” W3C ๊ถŒ๊ณ ์•ˆ์œผ๋กœ ์ง€์ •๋˜์—ˆ์œผ๋ฉฐ, WAI-ARIA ๋ช…์„ธ์˜ ์ผ๋ถ€๋Š” HTML5 ๋ช…์„ธ์™€ ํ†ตํ•ฉ๋จ.

โ—WAI-ARIA ์‚ฌ์šฉํ•˜๋Š” ์ด์œ โ—

  • RIA์˜ ๋™์  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ ‘๊ทผ์„ฑ ๋ณด์žฅ ์ง€์นจ์ด ๋ถ€์กฑ
  • Ajax, ํ†ตํ•œ ์‹ค์‹œ๊ฐ„ ๋ณ€๊ฒฝ ์ฝ˜ํ…์ธ , SPA ๋ฐฉ์‹์˜ ์ฝ˜ํ…์ธ  ๋ณ€๊ฒฝ
  • ํ™”๋ฉด ํ™•๋Œ€์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ, ๊ฐ€์‹œ ๋ฒ”์œ„ ๋ฐ– ์ฝ˜ํ…์ธ ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ ์ธ์ง€ ๋ถˆ๊ฐ€๋Šฅ
WAI-ARIA๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜๋„ํ•œ ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค(User Interface) ํ–‰๋™์ด๋‚˜ ๊ตฌ์กฐ์ ์ธ ์ •๋ณด๋ฅผ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”์™€ ๊ฐ™์€ ๋ณด์กฐ ๊ธฐ์ˆ ์— ์ „๋‹ฌํ•˜์—ฌ ์‹œ๊ฐ/์ธ์ง€ ์žฅ์• ์ธ๋“ค์—๊ฒŒ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋“ค๊ณผ ๋™์ผํ•˜๊ฒŒ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  ํ–‰๋™์„ ์œ ๋„ํ•จ์œผ๋กœ์จ ์›นํŽ˜์ด์ง€ ํƒ์ƒ‰์„ ๋•๋Š” ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(UX)์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค

โ—WAI-ARIA ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•โ—

ARIA๋Š” HTML ํƒœ๊ทธ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ณด์กฐ ๊ธฐ์ˆ ๋กœ์„œ ์•„๋ž˜์˜ ๋‚ด์šฉ์„ ์ฃผ์˜ํ•˜์—ฌ WAI-ARIA๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์„ธ์š”.

  • HTML5 Section ์š”์†Œ์™€ ์ค‘๋ณต๋˜์–ด ์‚ฌ์šฉํ•˜์ง€ ๋ง์•„ ์ฃผ์„ธ์š”.
  • HTML5์—์„œ ์ถ”๊ฐ€๋œ ์˜๋ฏธ ์žˆ๋Š” ํƒœ๊ทธ๋ฅผ ๋จผ์ € ์‚ฌ์šฉํ•˜๊ณ  ์˜๋ฏธ๋ฅผ ๋ถ€๊ฐ€์ ์œผ๋กœ ์„ค๋ช…ํ•ด์ฃผ๊ณ ์ž ํ•  ๋•Œ WAI-ARIA์˜ role์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.
HTML5 Section tagLandmark Role์„ค๋ช…
<nav>role="navigation"๋‹ค๋ฅธ ํŽ˜์ด์ง€ ๋˜๋Š” ํŽ˜์ด์ง€ ๋‚ด ํŠน์ • ์˜์—ญ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋งํฌ ์ฝ˜ํ…์ธ  ์˜์—ญ(๋ฉ”์ธ ๋ฉ”๋‰ด ํ˜น์€ ์„œ๋ธŒ ๋ฉ”๋‰ด๋กœ ์‚ฌ์šฉ)
<main>role="main"role="main"๋ณธ๋ฌธ์˜ ์ฃผ์š” ์ฝ˜ํ…์ธ  ์˜์—ญ.ํ•œ ํŽ˜์ด์ง€ ๋‚ด์— 1๊ฐœ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ,<article>,<aside>,<footer> ์š”์†Œ์˜ ํ•˜์œ„ ์š”์†Œ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค
<aside>role="complementary"์ฃผ์š” ์ฝ˜ํ…์ธ ์™€ ์—ฐ๊ด€์ด ์ ์€ ์˜๋ฏธ ์žˆ๋Š” ์ฝ˜ํ…์ธ  ์˜์—ญ (์˜ˆ) ๋‚ ์”จ, ์ฃผ์‹
<form>role="form"๊ฐ€์šด๋ฐ
Xrole="application"<div> ์š”์†Œ์™€ ๊ฐ™์ด ๊ทธ๋ฃน ์—ญํ• ์„ ํ•˜๋Š” ์š”์†Œ๋กœ ๋Œ€์ฒด
Xrole="banner"<header> ์š”์†Œ์™€ ๋น„์Šทํ•œ ์˜๋ฏธ. <header role="banner">๋กœ ์‚ฌ์šฉ ์‹œ ํŽ˜์ด์ง€๋ณ„ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ
Xrole="search"๊ฒ€์ƒ‰์˜ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ์‹ ์˜์—ญ <div>๋˜๋Š” <form> ์š”์†Œ ์‚ฌ์šฉ ๊ถŒ์žฅ
Xrole="search"๊ฒ€์ƒ‰์˜ ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ์‹ ์˜์—ญ <div> ๋˜๋Š” <form> ์š”์†Œ ์‚ฌ์šฉ ๊ถŒ์žฅ
Xrole="contentinfo"<footer> ์š”์†Œ์™€ ๋น„์Šทํ•œ ์˜๋ฏธ <footer role="contentinfo">๋กœ ์‚ฌ์šฉ ์‹œ ํŽ˜์ด์ง€๋ณ„ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ

โ—ํ‚ค๋ณด๋“œ ์‚ฌ์šฉ ๋ณด์žฅโ—

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

์—ฌ๊ธฐ์„œ ์ƒํ˜ธ ์ž‘์šฉ์ด ํ•„์š”ํ•œ ๋Œ€ํ™”ํ˜• UI๋ž€ ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋‚˜ ํƒญ ๋˜๋Š” ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ, ์Šฌ๋ผ์ด๋“œ, ์Šคํฌ๋กค ๋“ฑ์˜ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•œ ์ฝ˜ํ…์ธ ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ํ‚ค๋ณด๋“œ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” HTML ์š”์†Œ์˜ ๊ฒฝ์šฐ tabindex ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ณด๋“œ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์›€.

๋˜ํ•œ tabindex ์†์„ฑ์— 0์„ ์ง€์ •ํ•˜๋ฉด ์ฝ˜ํ…์ธ ์˜ ์„ ํ˜•ํ™” ์ˆœ์„œ๋Œ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ  0๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ์ง€์ •ํ•˜๋ฉด ํ‚ค๋ณด๋“œ๋กœ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅ ํ•œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.

<!-- ํ‚ค๋ณด๋“œ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ -->
<span role="button" tabindex="0">๋ฒ„ํŠผ</span>

<!-- ํ‚ค๋ณด๋“œ๋กœ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ -->
<span role="button" tabindex="-1">๋ฒ„ํŠผ</span>

โ—์ˆจ๊น€ ์ฝ˜ํ…์ธ โ—

  • ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋˜ ๋‹จ์ˆœํžˆ ํ™”๋ฉด์—์„œ๋งŒ ๋ณด์ด์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌ๋œ ์ฝ˜ํ…์ธ ์— aria-hidden=โ€œtrueโ€๋ฅผ ์ง€์ •ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

  • ๋‹จ์ˆœํžˆ ๊ฐ€์‹œ์ ์œผ๋กœ๋งŒ ์ˆจ๊ธด ์ฝ˜ํ…์ธ ์— ํŠน์ • role์„ ๋ถ€์—ฌํ–ˆ๋”๋ผ๋„ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ๋“ฑ์˜ ๋ณด์กฐ ๊ธฐ๊ธฐ์—์„œ๋Š” aria-hidden=โ€œtrueโ€๋กœ ์ง€์ •๋œ ์ƒํƒœ๋ผ๋ฉด ์˜๋ฏธ์ ์œผ๋กœ๋„ ์ˆจ๊ฒจ์ง„ ์ฝ˜ํ…์ธ ๋กœ ์ธ์‹ํ•˜๊ฒŒ ๋œ๋‹ค.

  • ๋˜ํ•œ ์ด์™€ ๋น„์Šทํ•˜๊ฒŒ ํŠน์ •ํ•œ ์˜๋ฏธ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ์š”์†Œ์— presentation์ด๋‚˜ none์˜ ์—ญํ• (Role)์„ ์ง€์ •ํ•˜์—ฌ์„œ๋„ ์•ˆ๋œ๋‹ค.

  • ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ๋“ฑ์˜ ๋ณด์กฐ ๊ธฐ๊ธฐ๋Š” role=โ€œpresentationโ€, role=โ€noneโ€์œผ๋กœ ์ง€์ •๋œ ์š”์†Œ๋ฅผ ์˜๋ฏธ ์—†์ด ๋‹จ์ˆœํžˆ ๊ฐ€์‹œ์ ์œผ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ์š”์†Œ๋กœ ์ธ์‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  • aria-hidden=โ€œtrueโ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆจ๊น€ ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ CSS์˜ display ์†์„ฑ์— none ๊ฐ’์„ ์ง€์ •ํ•˜์—ฌ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ๋“ฑ์˜ ๋ณด์กฐ๊ธฐ ๊ธฐ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋„๋ก ํ•˜๊ณ  ariahidden=โ€œtrueโ€์„ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

โ—๋ ˆ์ด๋ธ” ์ œ๊ณตโ—

๋ชจ๋“  ๋Œ€ํ™”ํ˜• UI์˜ ๊ฒฝ์šฐ ๋ฐ˜๋“œ์‹œ ๋ ˆ์ด๋ธ”์„ ์ œ๊ณตํ•˜์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ” ์ œ๊ณต์„ ์œ„ํ•ด HTML์˜ ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋ฉฐ WAI-ARIA ๊ด€๋ จ ์†์„ฑ์œผ๋กœ aria-label, aria-labelledby ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ด๋ฆ„์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

<!-- ๋ ˆ์ด๋ธ” ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ -->
<div class="container">
	<label for="user-name">์ด๋ฆ„</label>
	<input type="text" id="user-name">
</div>

<!-- aria-label, aria-labelledby ์†์„ฑ์„ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ -->
<div>
	<div id="user-name">์ด๋ฆ„</div>
	<input type="text" aria-labelledby="user-name">
</div>

<button aria-label="๋‹ซ๊ธฐ"> X </button>

โ—์œ ํšจ์„ฑ ๊ฒ€์‚ฌโ—

WAI-ARIA๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ์‹œ๋งจํ‹ฑ ์š”์†Œ์™€ ์ถฉ๋Œ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค.

๊ฐ€๋ น ํ—ค๋”ฉ์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” <h1> ์š”์†Œ์— role=โ€œbuttonโ€์„ ๋ถ€์—ฌํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ์— ์ ์ ˆํ•˜์ง€ ์•Š์€ ์†์„ฑ์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๋ฅผ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

โ—๋žœ๋“œ๋งˆํฌโ—

๋žœ๋“œ๋งˆํฌ(Landmark Role)๋Š” ์›น ํŽ˜์ด์ง€์—์„œ ์ œ๊ณต๋˜๋Š” ์ฝ˜ํ…์ธ  ์œ ํ˜•์ด ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ‘œ์ง€ํŒ ๊ธฐ๋Šฅ์œผ๋กœ ๊ธฐ์กด ์›น์ ‘๊ทผ์„ฑ ์ง€์นจ์—์„œ ์š”๊ตฌํ•˜๊ณ  ์žˆ๋Š” ๊ฑด๋„ˆ๋›ฐ๊ธฐ ๋งํฌ์˜ ๋ฐœ์ „๋œ ๋ชจ์Šต์ด๋ฉด์„œ ์ฝ˜ํ…์ธ  ๋ธ”๋ก์˜ ์ œ๋ชฉ ์ œ๊ณต๋ณด๋‹ค ๋ช…ํ™•ํ•œ ์˜์—ญ ๊ตฌ๋ถ„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์„ ๊ฐ€์ง„๋‹ค.

<div class="container">
	<div role="banner">banner</div>
	<div role="navigation">navigation</div>
	<div role="main">
		<div role="application">application</div>
	</div>
	<div class="complementary">
		<div role="search">search</div>
		<div role="form">form</div>
	</div>
	<div role="contentinfo">contentinfo</div>
</div>
profile
๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ ํ”„๋ก ํŠธ์—”๋“œ ๋ถ€ํŠธ์บ ํ”„ 12๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€