์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐ŸŒ ์›น ์ ‘๊ทผ์„ฑ๊ณผ WCAG ๊ฐ€์ด๋“œ๋ผ์ธ ์™„๋ฒฝ ์ •๋ณต! ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ํฌ์šฉ์  ์›น ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ

๐ŸŒ ์›น ์ ‘๊ทผ์„ฑ๊ณผ WCAG ๊ฐ€์ด๋“œ๋ผ์ธ ์™„๋ฒฝ ์ •๋ณต! ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ํฌ์šฉ์  ์›น ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ

๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ณ  ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์›น, ๊ทธ ๋น„๋ฐ€์„ ํŒŒํ—ค์ณ๋ณด์ž! ๐Ÿš€

Web Accessibility Everyone Can Access

๐ŸŽฏ ์›น ์ ‘๊ทผ์„ฑ, ์™œ ์ด๋ ‡๊ฒŒ ์ค‘์š”ํ•œ ๊ฑธ๊นŒ?

์ž, ์นœ๊ตฌ์•ผ! ์˜ค๋Š˜์€ ์›น ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์ ˆ๋Œ€ ๋นผ๋†“์„ ์ˆ˜ ์—†๋Š” ์ฃผ์ œ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ  ํ•ด. ๋ฐ”๋กœ ์›น ์ ‘๊ทผ์„ฑ์ด์•ผ! ๐ŸŒŸ

ํ˜น์‹œ ์ด๋Ÿฐ ์ƒ๊ฐ ํ•ด๋ณธ ์  ์žˆ์–ด? "๋‚ด๊ฐ€ ๋งŒ๋“  ์›น์‚ฌ์ดํŠธ๋ฅผ ์‹œ๊ฐ์žฅ์• ์ธ์€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ?", "ํ‚ค๋ณด๋“œ๋งŒ์œผ๋กœ๋„ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?", "์ƒ‰๋งน์ธ ์‚ฌ์šฉ์ž๋„ ๋‚ด ๋””์ž์ธ์„ ์ œ๋Œ€๋กœ ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ?" ์ด๋Ÿฐ ์งˆ๋ฌธ๋“ค์ด ๋ฐ”๋กœ ์›น ์ ‘๊ทผ์„ฑ์˜ ํ•ต์‹ฌ์ด์•ผ.

์›น ์ ‘๊ทผ์„ฑ(Web Accessibility)์€ ๋‹จ์ˆœํžˆ "์žฅ์• ์ธ์„ ์œ„ํ•œ ๋ฐฐ๋ ค"๊ฐ€ ์•„๋‹ˆ์•ผ. ์ด๊ฑด ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์›น์„ ๋™๋“ฑํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒ๋ฆฌ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ฑฐ์ง€. ๋…ธ์ธ, ์ผ์‹œ์  ์žฅ์• ๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ, ๋А๋ฆฐ ์ธํ„ฐ๋„ท ํ™˜๊ฒฝ์˜ ์‚ฌ์šฉ์ž๊นŒ์ง€ ๋ชจ๋‘ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…์ด์•ผ. ๐Ÿค

๐Ÿ’ก ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค!
์ „ ์„ธ๊ณ„ ์ธ๊ตฌ์˜ ์•ฝ 15%๊ฐ€ ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์žฅ์• ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด. ์ด๊ฑด ์•ฝ 10์–ต ๋ช…์ด ๋„˜๋Š” ์ˆซ์ž์•ผ! ์›น ์ ‘๊ทผ์„ฑ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฑด, ์ด ๊ฑฐ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์„ ์™ธ๋ฉดํ•˜๋Š” ๊ฑฐ๋‚˜ ๋งˆ์ฐฌ๊ฐ€์ง€์ง€. ๐Ÿ˜ฎ

๐Ÿ” ์›น ์ ‘๊ทผ์„ฑ์˜ ์‹ค์ œ ์˜ํ–ฅ๋ ฅ

์›น ์ ‘๊ทผ์„ฑ์ด ์™œ ์ค‘์š”ํ•œ์ง€ ๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ:

1. ์‹œ๊ฐ ์žฅ์• ์ธ์˜ ๊ฒฝ์šฐ
์Šคํฌ๋ฆฐ ๋ฆฌ๋”(Screen Reader)๋ผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•ด์„œ ์›น์‚ฌ์ดํŠธ์˜ ๋‚ด์šฉ์„ ์Œ์„ฑ์œผ๋กœ ๋“ค์–ด. ๋งŒ์•ฝ ์ด๋ฏธ์ง€์— ๋Œ€์ฒด ํ…์ŠคํŠธ(alt text)๊ฐ€ ์—†๋‹ค๋ฉด? ๊ทธ๋ƒฅ "์ด๋ฏธ์ง€"๋ผ๊ณ ๋งŒ ์ฝํžˆ๊ฒ ์ง€. ๋ฌด์Šจ ๋‚ด์šฉ์ธ์ง€ ์ „ํ˜€ ์•Œ ์ˆ˜ ์—†์–ด. ๐Ÿ˜ข

2. ์ฒญ๊ฐ ์žฅ์• ์ธ์˜ ๊ฒฝ์šฐ
๋™์˜์ƒ ์ฝ˜ํ…์ธ ์— ์ž๋ง‰์ด๋‚˜ ์ˆ˜ํ™” ํ†ต์—ญ์ด ์—†๋‹ค๋ฉด? ์•„๋ฌด๋ฆฌ ์ข‹์€ ์ฝ˜ํ…์ธ ๋ผ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ ๋ผ.

3. ์šด๋™ ์žฅ์• ์ธ์˜ ๊ฒฝ์šฐ
๋งˆ์šฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด ์‚ฌ๋žŒ๋“ค์€ ํ‚ค๋ณด๋“œ๋งŒ์œผ๋กœ ์›น์‚ฌ์ดํŠธ๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•ด. ๋งŒ์•ฝ ํ‚ค๋ณด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜์ด ์ œ๋Œ€๋กœ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด? ํŠน์ • ๊ธฐ๋Šฅ์„ ์•„์˜ˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๊ฑฐ์•ผ. ๐ŸŽน

4. ์ธ์ง€ ์žฅ์• ์ธ์˜ ๊ฒฝ์šฐ
๋ณต์žกํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ผ๊ด€์„ฑ ์—†๋Š” ๋””์ž์ธ์€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด. ๋ช…ํ™•ํ•˜๊ณ  ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๊ฐ€ ํ•„์ˆ˜์ ์ด์ง€.

๐ŸŒŸ ๋น„์ฆˆ๋‹ˆ์Šค ๊ด€์ ์—์„œ๋„ ์ค‘์š”ํ•ด!
์›น ์ ‘๊ทผ์„ฑ์€ ๋‹จ์ˆœํžˆ ์œค๋ฆฌ์  ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์•ผ. SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)์—๋„ ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ , ๋ฒ•์  ๋ฆฌ์Šคํฌ๋ฅผ ์ค„์ด๋ฉฐ, ๋” ๋„“์€ ์‚ฌ์šฉ์ž์ธต์—๊ฒŒ ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜. ์‹ค์ œ๋กœ ๋งŽ์€ ๊ตญ๊ฐ€์—์„œ ์›น ์ ‘๊ทผ์„ฑ์„ ๋ฒ•์œผ๋กœ ์˜๋ฌดํ™”ํ•˜๊ณ  ์žˆ์–ด! ๐Ÿ“ˆ

๐Ÿ“š WCAG, ์›น ์ ‘๊ทผ์„ฑ์˜ ๋ฐ”์ด๋ธ”์„ ๋งŒ๋‚˜๋ณด์ž!

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ WCAG(Web Content Accessibility Guidelines)์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์‹œ๊ฐ„์ด์•ผ! ์ด๊ฑด W3C(World Wide Web Consortium)์—์„œ ๋งŒ๋“  ์›น ์ ‘๊ทผ์„ฑ ๊ตญ์ œ ํ‘œ์ค€ ๊ฐ€์ด๋“œ๋ผ์ธ์ด์•ผ. ๐ŸŒ

WCAG๋Š” ํ˜„์žฌ 2.1 ๋ฒ„์ „์ด ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๊ณ , 2.2 ๋ฒ„์ „๋„ ์ตœ๊ทผ์— ๋ฐœํ‘œ๋˜์—ˆ์–ด. ๊ทธ๋ฆฌ๊ณ  WCAG 3.0๋„ ๊ฐœ๋ฐœ ์ค‘์ด์•ผ! ํ•˜์ง€๋งŒ ์˜ค๋Š˜์€ ๊ฐ€์žฅ ์‹ค์šฉ์ ์ธ WCAG 2.1์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๋ช…ํ• ๊ฒŒ.

๐ŸŽจ WCAG์˜ 4๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™: POUR

WCAG๋Š” 4๊ฐ€์ง€ ํ•ต์‹ฌ ์›์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ด. ์ด๊ฑธ ์˜์–ด ์ฒซ ๊ธ€์ž๋ฅผ ๋”ฐ์„œ POUR๋ผ๊ณ  ๋ถˆ๋Ÿฌ. ํ•˜๋‚˜์”ฉ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž! ๐Ÿ”ค

1๏ธโƒฃ Perceivable (์ธ์‹ ๊ฐ€๋Šฅ์„ฑ) ๐Ÿ‘๏ธ

"์‚ฌ์šฉ์ž๊ฐ€ ์ฝ˜ํ…์ธ ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค"

์ •๋ณด์™€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์š”์†Œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณต๋˜์–ด์•ผ ํ•ด. ์ฆ‰, ํ•œ ๊ฐ€์ง€ ๊ฐ๊ฐ์œผ๋กœ๋งŒ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ์•ˆ ๋œ๋‹ค๋Š” ๊ฑฐ์•ผ.

๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ:
โ€ข ๋ชจ๋“  ์ด๋ฏธ์ง€์— ๋Œ€์ฒด ํ…์ŠคํŠธ ์ œ๊ณต
โ€ข ๋™์˜์ƒ์— ์ž๋ง‰๊ณผ ์Œ์„ฑ ์„ค๋ช… ์ œ๊ณต
โ€ข ์ƒ‰์ƒ๋งŒ์œผ๋กœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ธฐ (์˜ˆ: "๋นจ๊ฐ„์ƒ‰ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์„ธ์š”" โŒ)
โ€ข ์ถฉ๋ถ„ํ•œ ๋ช…์•”๋น„ ํ™•๋ณด (ํ…์ŠคํŠธ์™€ ๋ฐฐ๊ฒฝ์˜ ๋Œ€๋น„)

2๏ธโƒฃ Operable (์šด์šฉ ๊ฐ€๋Šฅ์„ฑ) โŒจ๏ธ

"์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค"

๋ชจ๋“  ๊ธฐ๋Šฅ์€ ๋‹ค์–‘ํ•œ ์ž…๋ ฅ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด. ๋งˆ์šฐ์Šค๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ์€ ์•ˆ ๋ผ!

๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ:
โ€ข ํ‚ค๋ณด๋“œ๋งŒ์œผ๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โ€ข ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„ ์ œ๊ณต (์ž๋™์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ์ฝ˜ํ…์ธ ์— ์ผ์‹œ์ •์ง€ ๊ธฐ๋Šฅ)
โ€ข ๋ฐœ์ž‘์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊นœ๋นก์ž„ ํšจ๊ณผ ๊ธˆ์ง€
โ€ข ๋ช…ํ™•ํ•œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌ์กฐ
โ€ข ํฌ์ปค์Šค ํ‘œ์‹œ๊ฐ€ ๋ช…ํ™•ํ•ด์•ผ ํ•จ

3๏ธโƒฃ Understandable (์ดํ•ด ๊ฐ€๋Šฅ์„ฑ) ๐Ÿง 

"์ •๋ณด์™€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ์กฐ์ž‘์ด ์ดํ•ด ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค"

์ฝ˜ํ…์ธ ๋Š” ๋ช…ํ™•ํ•˜๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•ด์•ผ ํ•ด. ์‚ฌ์šฉ์ž๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๋ฉด ์•ˆ ๋ผ!

๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ:
โ€ข ๋ช…ํ™•ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์–ธ์–ด ์‚ฌ์šฉ
โ€ข ์ผ๊ด€๋œ ๋„ค๋น„๊ฒŒ์ด์…˜๊ณผ ์‹๋ณ„
โ€ข ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ž‘ (๊ฐ‘์ž๊ธฐ ์ƒˆ ์ฐฝ์ด ์—ด๋ฆฌ๋ฉด ์•ˆ ๋ผ)
โ€ข ์ž…๋ ฅ ์˜ค๋ฅ˜ ๋ฐฉ์ง€ ๋ฐ ์ˆ˜์ • ๊ธฐํšŒ ์ œ๊ณต
โ€ข ๋ช…ํ™•ํ•œ ๋ ˆ์ด๋ธ”๊ณผ ์ง€์‹œ์‚ฌํ•ญ

4๏ธโƒฃ Robust (๊ฒฌ๊ณ ์„ฑ) ๐Ÿ’ช

"์ฝ˜ํ…์ธ ๋Š” ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ์—์„œ ํ•ด์„๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค"

ํ˜„์žฌ์™€ ๋ฏธ๋ž˜์˜ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ (๋ธŒ๋ผ์šฐ์ €, ๋ณด์กฐ ๊ธฐ์ˆ  ๋“ฑ)์—์„œ ์ž‘๋™ํ•ด์•ผ ํ•ด.

๊ตฌ์ฒด์ ์ธ ์˜ˆ์‹œ:
โ€ข ์œ ํšจํ•œ HTML/CSS ์ฝ”๋“œ ์ž‘์„ฑ
โ€ข ์ ์ ˆํ•œ ARIA(Accessible Rich Internet Applications) ์†์„ฑ ์‚ฌ์šฉ
โ€ข ํ‘œ์ค€ ์›น ๊ธฐ์ˆ  ์ค€์ˆ˜
โ€ข ๋‹ค์–‘ํ•œ ๋ธŒ๋ผ์šฐ์ €์™€ ๋ณด์กฐ ๊ธฐ์ˆ ๊ณผ์˜ ํ˜ธํ™˜์„ฑ

๐Ÿ“Š WCAG ์ค€์ˆ˜ ๋ ˆ๋ฒจ: A, AA, AAA

WCAG๋Š” 3๊ฐ€์ง€ ์ค€์ˆ˜ ๋ ˆ๋ฒจ์„ ์ œ๊ณตํ•ด. ๊ฐ ๋ ˆ๋ฒจ์€ ์ ‘๊ทผ์„ฑ์˜ ์ •๋„๋ฅผ ๋‚˜ํƒ€๋‚ด์ง€. ๐ŸŽฏ

๋ ˆ๋ฒจ ์„ค๋ช… ๋‚œ์ด๋„ ๊ถŒ์žฅ ์‚ฌํ•ญ
Level A ์ตœ์†Œํ•œ์˜ ์ ‘๊ทผ์„ฑ ์š”๊ตฌ์‚ฌํ•ญ. ์ด๊ฒƒ๋„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋Š” ์ฝ˜ํ…์ธ ์— ์ „ํ˜€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ ๊ธฐ๋ณธ ํ•„์ˆ˜ ์ค€์ˆ˜
Level AA ๋Œ€๋ถ€๋ถ„์˜ ์žฅ์• ๋ฅผ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ˜ํ…์ธ ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ. ๋ฒ•์  ์š”๊ตฌ์‚ฌํ•ญ์œผ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์ฑ„ํƒ๋จ ์ค‘๊ฐ„ ๋ชฉํ‘œ ๋ ˆ๋ฒจ
Level AAA ์ตœ๊ณ  ์ˆ˜์ค€์˜ ์ ‘๊ทผ์„ฑ. ๋ชจ๋“  ์ฝ˜ํ…์ธ ์— ์ ์šฉํ•˜๊ธฐ๋Š” ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Œ ๊ณ ๊ธ‰ ์ด์ƒ์  ๋ชฉํ‘œ
๐ŸŽฏ ์‹ค๋ฌด ํŒ!
๋Œ€๋ถ€๋ถ„์˜ ์กฐ์ง์€ Level AA๋ฅผ ๋ชฉํ‘œ๋กœ ํ•ด. ์ด๊ฒŒ ๋ฒ•์  ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋ฉด์„œ๋„ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์ด๊ฑฐ๋“ . Level AAA๋Š” ํŠน์ • ์ฝ˜ํ…์ธ ๋‚˜ ์„น์…˜์—๋งŒ ์ ์šฉํ•˜๋Š” ๊ฒŒ ํ˜„์‹ค์ ์ด์•ผ! ๐Ÿ’ผ

๐Ÿ› ๏ธ ์‹ค์ „! WCAG ๊ฐ€์ด๋“œ๋ผ์ธ ๊ตฌ์ฒด์ ์œผ๋กœ ์ ์šฉํ•˜๊ธฐ

์ด๋ก ์€ ์ถฉ๋ถ„ํžˆ ๋ฐฐ์› ์œผ๋‹ˆ, ์ด์ œ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์ž! ๊ฐ ์›์น™๋ณ„๋กœ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ๊ฒŒ. ์ฝ”๋“œ ์˜ˆ์ œ๋„ ํ•จ๊ป˜ ์ œ๊ณตํ•  ํ…Œ๋‹ˆ ๋ฐ”๋กœ ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด! ๐Ÿ’ป

๐Ÿ‘๏ธ Perceivable: ์ธ์‹ ๊ฐ€๋Šฅ์„ฑ ๊ตฌํ˜„ํ•˜๊ธฐ

1. ๋Œ€์ฒด ํ…์ŠคํŠธ(Alternative Text) ์ œ๊ณต

๋ชจ๋“  ๋น„ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ ์—๋Š” ๋Œ€์ฒด ํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ด. ์ด๊ฑด ์›น ์ ‘๊ทผ์„ฑ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด์ž ํ•ต์‹ฌ์ด์•ผ!

<!-- โŒ ๋‚˜์œ ์˜ˆ -->
<img src="product.jpg">

<!-- โœ… ์ข‹์€ ์˜ˆ -->
<img src="product.jpg" alt="ํŒŒ๋ž€์ƒ‰ ๋ฌด์„  ๋งˆ์šฐ์Šค, ์ธ์ฒด๊ณตํ•™์  ๋””์ž์ธ">

<!-- ์žฅ์‹์šฉ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ -->
<img src="decoration.jpg" alt="" role="presentation">

<!-- ๋ณต์žกํ•œ ์ด๋ฏธ์ง€์˜ ๊ฒฝ์šฐ -->
<img src="chart.jpg" alt="2023๋…„ ๋งค์ถœ ์ถ”์ด ๊ทธ๋ž˜ํ”„" 
     longdesc="chart-description.html">
๐Ÿ’ก ๋Œ€์ฒด ํ…์ŠคํŠธ ์ž‘์„ฑ ํŒ!
โ€ข ์ด๋ฏธ์ง€์˜ ๋ชฉ์ ๊ณผ ์˜๋ฏธ๋ฅผ ์„ค๋ช…ํ•ด์•ผ ํ•ด
โ€ข "์ด๋ฏธ์ง€", "์‚ฌ์ง„" ๊ฐ™์€ ๋ถˆํ•„์š”ํ•œ ๋‹จ์–ด๋Š” ๋นผ
โ€ข ์žฅ์‹์šฉ ์ด๋ฏธ์ง€๋Š” ๋นˆ alt ์†์„ฑ ์‚ฌ์šฉ (alt="")
โ€ข ๋ณต์žกํ•œ ์ •๋ณด๋Š” longdesc๋‚˜ ๋ณ„๋„ ์„ค๋ช… ํŽ˜์ด์ง€ ์ œ๊ณต
โ€ข 150์ž ์ด๋‚ด๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ!

2. ์ƒ‰์ƒ ๋Œ€๋น„(Color Contrast) ํ™•๋ณด

ํ…์ŠคํŠธ์™€ ๋ฐฐ๊ฒฝ ์‚ฌ์ด์˜ ๋ช…์•”๋น„๋Š” ๋งค์šฐ ์ค‘์š”ํ•ด. WCAG 2.1 ๊ธฐ์ค€์€ ์ด๋ž˜:

์ฝ˜ํ…์ธ  ์œ ํ˜• Level AA Level AAA
์ผ๋ฐ˜ ํ…์ŠคํŠธ (18pt ๋ฏธ๋งŒ) 4.5:1 ์ด์ƒ 7:1 ์ด์ƒ
ํฐ ํ…์ŠคํŠธ (18pt ์ด์ƒ ๋˜๋Š” 14pt bold) 3:1 ์ด์ƒ 4.5:1 ์ด์ƒ
UI ์ปดํฌ๋„ŒํŠธ ๋ฐ ๊ทธ๋ž˜ํ”ฝ 3:1 ์ด์ƒ -
/* โŒ ๋‚˜์œ ์˜ˆ - ๋Œ€๋น„๊ฐ€ ๋ถ€์กฑํ•จ */
.text {
    color: #999999;
    background-color: #ffffff;
    /* ๋Œ€๋น„์œจ: 2.85:1 (๋ถˆ์ถฉ๋ถ„) */
}

/* โœ… ์ข‹์€ ์˜ˆ - ์ถฉ๋ถ„ํ•œ ๋Œ€๋น„ */
.text {
    color: #595959;
    background-color: #ffffff;
    /* ๋Œ€๋น„์œจ: 7.0:1 (AAA ๋ ˆ๋ฒจ) */
}

/* ์ƒ‰์ƒ๋งŒ์œผ๋กœ ์ •๋ณด ์ „๋‹ฌ ๊ธˆ์ง€ */
/* โŒ ๋‚˜์œ ์˜ˆ */
.error { color: red; }

/* โœ… ์ข‹์€ ์˜ˆ - ์•„์ด์ฝ˜๊ณผ ํ…์ŠคํŠธ ์ถ”๊ฐ€ */
.error {
    color: #d32f2f;
    font-weight: bold;
}
.error::before {
    content: "โš ๏ธ ";
}
๐Ÿ”ง ์œ ์šฉํ•œ ๋„๊ตฌ๋“ค!
โ€ข WebAIM Contrast Checker: ์ƒ‰์ƒ ๋Œ€๋น„ ํ™•์ธ
โ€ข Colour Contrast Analyser: ๋ฐ์Šคํฌํ†ฑ ์•ฑ
โ€ข Chrome DevTools: ๋‚ด์žฅ ๋Œ€๋น„ ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ
โ€ข Stark: Figma/Sketch ํ”Œ๋Ÿฌ๊ทธ์ธ

3. ์ž๋ง‰๊ณผ ์Œ์„ฑ ์„ค๋ช… ์ œ๊ณต

๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ์ฝ˜ํ…์ธ ์—๋Š” ๋ฐ˜๋“œ์‹œ ๋Œ€์ฒด ์ˆ˜๋‹จ์„ ์ œ๊ณตํ•ด์•ผ ํ•ด!

<!-- ์ž๋ง‰์ด ์žˆ๋Š” ๋น„๋””์˜ค -->
<video controls>
    <source src="video.mp4" type="video/mp4">
    <track kind="captions" src="captions-ko.vtt" 
           srclang="ko" label="ํ•œ๊ตญ์–ด">
    <track kind="captions" src="captions-en.vtt" 
           srclang="en" label="English">
    <track kind="descriptions" src="descriptions.vtt" 
           srclang="ko" label="์Œ์„ฑ ์„ค๋ช…">
</video>

<!-- ์˜ค๋””์˜ค ์ฝ˜ํ…์ธ ์˜ ๋Œ€๋ณธ ์ œ๊ณต -->
<audio controls>
    <source src="podcast.mp3" type="audio/mpeg">
</audio>
<details>
    <summary>ํŒŸ์บ์ŠคํŠธ ๋Œ€๋ณธ ๋ณด๊ธฐ</summary>
    <p>[๋Œ€๋ณธ ๋‚ด์šฉ]</p>
</details>

โŒจ๏ธ Operable: ์šด์šฉ ๊ฐ€๋Šฅ์„ฑ ๊ตฌํ˜„ํ•˜๊ธฐ

1. ํ‚ค๋ณด๋“œ ์ ‘๊ทผ์„ฑ ๋ณด์žฅ

๋ชจ๋“  ๊ธฐ๋Šฅ์€ ํ‚ค๋ณด๋“œ๋งŒ์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด. ์ด๊ฑด ์ •๋ง ์ค‘์š”ํ•ด! ๐ŸŽน

<!-- โŒ ๋‚˜์œ ์˜ˆ - ๋งˆ์šฐ์Šค ์ด๋ฒคํŠธ๋งŒ ์‚ฌ์šฉ -->
<div onclick="doSomething()">ํด๋ฆญํ•˜์„ธ์š”</div>

<!-- โœ… ์ข‹์€ ์˜ˆ - ํ‚ค๋ณด๋“œ ์ ‘๊ทผ ๊ฐ€๋Šฅ -->
<button onclick="doSomething()" 
        onkeypress="handleKeyPress(event)">
    ํด๋ฆญํ•˜์„ธ์š”
</button>

<!-- ์ปค์Šคํ…€ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์š”์†Œ -->
<div role="button" 
     tabindex="0"
     onclick="doSomething()"
     onkeypress="handleKeyPress(event)"
     aria-label="์ž‘์—… ์‹คํ–‰">
    ํด๋ฆญํ•˜์„ธ์š”
</div>

<script>
function handleKeyPress(event) {
    // Enter(13) ๋˜๋Š” Space(32) ํ‚ค ์ฒ˜๋ฆฌ
    if (event.keyCode === 13 || event.keyCode === 32) {
        event.preventDefault();
        doSomething();
    }
}
</script>
โœ… ํ‚ค๋ณด๋“œ ์ ‘๊ทผ์„ฑ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
โ–ก Tab ํ‚ค๋กœ ๋ชจ๋“  ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์š”์†Œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
โ–ก Shift+Tab์œผ๋กœ ์—ญ์ˆœ ํƒ์ƒ‰ ๊ฐ€๋Šฅ
โ–ก Enter/Space ํ‚ค๋กœ ๋ฒ„ํŠผ๊ณผ ๋งํฌ ํ™œ์„ฑํ™” ๊ฐ€๋Šฅ
โ–ก ํ™”์‚ดํ‘œ ํ‚ค๋กœ ๋ฉ”๋‰ด์™€ ํƒญ ํƒ์ƒ‰ ๊ฐ€๋Šฅ
โ–ก Esc ํ‚ค๋กœ ๋ชจ๋‹ฌ/ํŒ์—… ๋‹ซ๊ธฐ ๊ฐ€๋Šฅ
โ–ก ํฌ์ปค์Šค ํ‘œ์‹œ๊ฐ€ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ž„
โ–ก ํ‚ค๋ณด๋“œ ํŠธ๋žฉ(๊ฐ‡ํž˜) ์—†์Œ

2. ํฌ์ปค์Šค ๊ด€๋ฆฌ

ํฌ์ปค์Šค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํ˜„์žฌ ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ์ค‘์š”ํ•œ ์‹œ๊ฐ์  ๋‹จ์„œ์•ผ!

/* โŒ ์ ˆ๋Œ€ ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ! */
*:focus {
    outline: none; /* ํฌ์ปค์Šค ํ‘œ์‹œ ์ œ๊ฑฐ ๊ธˆ์ง€! */
}

/* โœ… ์ข‹์€ ์˜ˆ - ๋ช…ํ™•ํ•œ ํฌ์ปค์Šค ํ‘œ์‹œ */
a:focus,
button:focus,
input:focus {
    outline: 3px solid #667eea;
    outline-offset: 2px;
}

/* ๋” ๋‚˜์€ ๋ฐฉ๋ฒ• - :focus-visible ์‚ฌ์šฉ */
*:focus-visible {
    outline: 3px solid #667eea;
    outline-offset: 2px;
    box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.2);
}

/* ์Šคํ‚ต ๋งํฌ ๊ตฌํ˜„ */
.skip-link {
    position: absolute;
    top: -40px;
    left: 0;
    background: #667eea;
    color: white;
    padding: 8px;
    text-decoration: none;
    z-index: 100;
}

.skip-link:focus {
    top: 0;
}
<!-- ์Šคํ‚ต ๋งํฌ ์˜ˆ์ œ -->
<a href="#main-content" class="skip-link">
    ๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
</a>

<nav>
    <!-- ๋„ค๋น„๊ฒŒ์ด์…˜ ๋ฉ”๋‰ด -->
</nav>

<main id="main-content">
    <!-- ์ฃผ์š” ์ฝ˜ํ…์ธ  -->
</main>

3. ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„ ์ œ๊ณต

์ž๋™์œผ๋กœ ์ง„ํ–‰๋˜๋Š” ์ฝ˜ํ…์ธ ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ด!

<!-- ์ž๋™ ์Šฌ๋ผ์ด๋”์— ์ปจํŠธ๋กค ์ œ๊ณต -->
<div class="carousel" role="region" aria-label="์ด๋ฏธ์ง€ ์Šฌ๋ผ์ด๋”">
    <div class="carousel-controls">
        <button aria-label="์ด์ „ ์Šฌ๋ผ์ด๋“œ">โ—€</button>
        <button aria-label="์ž๋™ ์žฌ์ƒ ์ผ์‹œ์ •์ง€" 
                id="pause-btn">โธ</button>
        <button aria-label="๋‹ค์Œ ์Šฌ๋ผ์ด๋“œ">โ–ถ</button>
    </div>
    <div class="carousel-slides">
        <!-- ์Šฌ๋ผ์ด๋“œ ๋‚ด์šฉ -->
    </div>
</div>

<!-- ์„ธ์…˜ ํƒ€์ž„์•„์›ƒ ๊ฒฝ๊ณ  -->
<div role="alert" aria-live="assertive" id="timeout-warning" hidden>
    ์„ธ์…˜์ด 2๋ถ„ ํ›„ ๋งŒ๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๊ณ„์†ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?
    <button>์„ธ์…˜ ์—ฐ์žฅ</button>
</div>

๐Ÿง  Understandable: ์ดํ•ด ๊ฐ€๋Šฅ์„ฑ ๊ตฌํ˜„ํ•˜๊ธฐ

1. ๋ช…ํ™•ํ•œ ์–ธ์–ด์™€ ๋ ˆ์ด๋ธ”

<!-- โŒ ๋‚˜์œ ์˜ˆ -->
<input type="text" placeholder="์ž…๋ ฅ">

<!-- โœ… ์ข‹์€ ์˜ˆ -->
<label for="username">์‚ฌ์šฉ์ž ์ด๋ฆ„</label>
<input type="text" 
       id="username" 
       name="username"
       aria-describedby="username-help"
       required>
<span id="username-help" class="help-text">
    4-20์ž์˜ ์˜๋ฌธ, ์ˆซ์ž๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค
</span>

<!-- ํผ ๊ทธ๋ฃนํ™” -->
<fieldset>
    <legend>๋ฐฐ์†ก ์ •๋ณด</legend>
    <label for="address">์ฃผ์†Œ</label>
    <input type="text" id="address">
    
    <label for="city">๋„์‹œ</label>
    <input type="text" id="city">
</fieldset>

2. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์™€ ๋„์›€๋ง

<form>
    <div class="form-group">
        <label for="email">์ด๋ฉ”์ผ ์ฃผ์†Œ *</label>
        <input type="email" 
               id="email" 
               aria-required="true"
               aria-invalid="false"
               aria-describedby="email-error">
        <span id="email-error" 
              class="error-message" 
              role="alert" 
              hidden>
            ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค
        </span>
    </div>
</form>

<script>
function validateEmail(input) {
    const isValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(input.value);
    const errorMsg = document.getElementById('email-error');
    
    if (!isValid) {
        input.setAttribute('aria-invalid', 'true');
        errorMsg.hidden = false;
    } else {
        input.setAttribute('aria-invalid', 'false');
        errorMsg.hidden = true;
    }
}
</script>
๐ŸŽฏ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ ๊ฐ€์ด๋“œ
โ€ข ๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ ์„ค๋ช…
โ€ข ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•ˆ๋‚ด
โ€ข ๊ธ์ •์ ์ด๊ณ  ๋„์›€์ด ๋˜๋Š” ํ†ค ์‚ฌ์šฉ
โ€ข ์˜ค๋ฅ˜ ์œ„์น˜๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ‘œ์‹œ
โ€ข ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก role="alert" ์‚ฌ์šฉ

3. ์ผ๊ด€์„ฑ ์žˆ๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜

<!-- ์ผ๊ด€๋œ ํ—ค๋” ๊ตฌ์กฐ -->
<header role="banner">
    <nav role="navigation" aria-label="์ฃผ ๋ฉ”๋‰ด">
        <ul>
            <li><a href="/" aria-current="page">ํ™ˆ</a></li>
            <li><a href="/about">์†Œ๊ฐœ</a></li>
            <li><a href="/services">์„œ๋น„์Šค</a></li>
            <li><a href="/contact">์—ฐ๋ฝ์ฒ˜</a></li>
        </ul>
    </nav>
</header>

<!-- ๋นต๋ถ€์Šค๋Ÿฌ๊ธฐ ๋„ค๋น„๊ฒŒ์ด์…˜ -->
<nav aria-label="๋นต๋ถ€์Šค๋Ÿฌ๊ธฐ">
    <ol>
        <li><a href="/">ํ™ˆ</a></li>
        <li><a href="/products">์ œํ’ˆ</a></li>
        <li aria-current="page">๋…ธํŠธ๋ถ</li>
    </ol>
</nav>

๐Ÿ’ช Robust: ๊ฒฌ๊ณ ์„ฑ ๊ตฌํ˜„ํ•˜๊ธฐ

1. ์‹œ๋งจํ‹ฑ HTML ์‚ฌ์šฉ

<!-- โŒ ๋‚˜์œ ์˜ˆ - ์˜๋ฏธ ์—†๋Š” div ๋‚จ์šฉ -->
<div class="header">
    <div class="nav">...</div>
</div>
<div class="main">
    <div class="article">...</div>
</div>

<!-- โœ… ์ข‹์€ ์˜ˆ - ์‹œ๋งจํ‹ฑ HTML -->
<header>
    <nav>...</nav>
</header>
<main>
    <article>
        <h1>์ œ๋ชฉ</h1>
        <section>
            <h2>์†Œ์ œ๋ชฉ</h2>
            <p>๋‚ด์šฉ...</p>
        </section>
    </article>
    <aside>
        <h2>๊ด€๋ จ ์ •๋ณด</h2>
    </aside>
</main>
<footer>...</footer>

2. ARIA ์†์„ฑ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

ARIA(Accessible Rich Internet Applications)๋Š” HTML๋งŒ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šด ๋™์  ์ฝ˜ํ…์ธ ์˜ ์ ‘๊ทผ์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผœ์ค˜. ํ•˜์ง€๋งŒ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด! โš ๏ธ

<!-- ARIA ์—ญํ• (role) -->
<div role="button" tabindex="0">ํด๋ฆญ</div>
<div role="alert">์ค‘์š”ํ•œ ์•Œ๋ฆผ</div>
<div role="dialog" aria-labelledby="dialog-title">
    <h2 id="dialog-title">ํ™•์ธ</h2>
</div>

<!-- ARIA ์ƒํƒœ(state) -->
<button aria-pressed="false">ํ† ๊ธ€</button>
<div aria-expanded="false">์ ‘์„ ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ</div>
<input aria-invalid="true">

<!-- ARIA ์†์„ฑ(property) -->
<button aria-label="๋‹ซ๊ธฐ">ร—</button>
<div aria-describedby="help-text">...</div>
<nav aria-label="์ฃผ ๋ฉ”๋‰ด">...</nav>

<!-- ๋ผ์ด๋ธŒ ๋ฆฌ์ „(Live Region) -->
<div aria-live="polite" aria-atomic="true">
    ์—…๋ฐ์ดํŠธ๋œ ๋‚ด์šฉ์ด ์—ฌ๊ธฐ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค
</div>

<div aria-live="assertive" role="alert">
    ๊ธด๊ธ‰ ์•Œ๋ฆผ!
</div>
โš ๏ธ ARIA ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ!
์ฒซ ๋ฒˆ์งธ ๊ทœ์น™: ARIA๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”!
๋„ค์ดํ‹ฐ๋ธŒ HTML ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ทธ๊ฑธ ์‚ฌ์šฉํ•ด. ARIA๋Š” HTML๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์•ผ.

๋‘ ๋ฒˆ์งธ ๊ทœ์น™: ์—ญํ• ์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์„ธ์š”!
<button role="heading"> ๊ฐ™์€ ๊ฑด ์ ˆ๋Œ€ ์•ˆ ๋ผ!

์„ธ ๋ฒˆ์งธ ๊ทœ์น™: ๋ชจ๋“  ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์š”์†Œ๋Š” ํ‚ค๋ณด๋“œ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ด!
role="button"์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ tabindex์™€ ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ด.

3. ๋ณต์žกํ•œ ์œ„์ ฏ ๊ตฌํ˜„ ์˜ˆ์ œ

<!-- ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํƒญ ํŒจ๋„ -->
<div class="tabs">
    <div role="tablist" aria-label="์ฝ˜ํ…์ธ  ํƒญ">
        <button role="tab" 
                aria-selected="true" 
                aria-controls="panel-1" 
                id="tab-1"
                tabindex="0">
            ํƒญ 1
        </button>
        <button role="tab" 
                aria-selected="false" 
                aria-controls="panel-2" 
                id="tab-2"
                tabindex="-1">
            ํƒญ 2
        </button>
        <button role="tab" 
                aria-selected="false" 
                aria-controls="panel-3" 
                id="tab-3"
                tabindex="-1">
            ํƒญ 3
        </button>
    </div>
    
    <div role="tabpanel" 
         id="panel-1" 
         aria-labelledby="tab-1">
        ํƒญ 1์˜ ๋‚ด์šฉ
    </div>
    <div role="tabpanel" 
         id="panel-2" 
         aria-labelledby="tab-2" 
         hidden>
        ํƒญ 2์˜ ๋‚ด์šฉ
    </div>
    <div role="tabpanel" 
         id="panel-3" 
         aria-labelledby="tab-3" 
         hidden>
        ํƒญ 3์˜ ๋‚ด์šฉ
    </div>
</div>

<script>
// ํƒญ ํ‚ค๋ณด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ตฌํ˜„
const tabs = document.querySelectorAll('[role="tab"]');
const tabList = document.querySelector('[role="tablist"]');

tabs.forEach((tab, index) => {
    tab.addEventListener('click', () => changeTabs(tab));
    tab.addEventListener('keydown', (e) => {
        if (e.key === 'ArrowRight') {
            const nextTab = tabs[(index + 1) % tabs.length];
            changeTabs(nextTab);
            nextTab.focus();
        } else if (e.key === 'ArrowLeft') {
            const prevTab = tabs[(index - 1 + tabs.length) % tabs.length];
            changeTabs(prevTab);
            prevTab.focus();
        }
    });
});

function changeTabs(selectedTab) {
    tabs.forEach(tab => {
        tab.setAttribute('aria-selected', 'false');
        tab.setAttribute('tabindex', '-1');
        const panel = document.getElementById(
            tab.getAttribute('aria-controls')
        );
        panel.hidden = true;
    });
    
    selectedTab.setAttribute('aria-selected', 'true');
    selectedTab.setAttribute('tabindex', '0');
    const selectedPanel = document.getElementById(
        selectedTab.getAttribute('aria-controls')
    );
    selectedPanel.hidden = false;
}
</script>

๐Ÿงช ์›น ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ์™€ ๊ฒ€์ฆ ๋ฐฉ๋ฒ•

์ž, ์ด์ œ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ์ œ๋Œ€๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ํ…Œ์ŠคํŠธํ•ด์•ผ๊ฒ ์ง€? ๋‹ค์–‘ํ•œ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๊ณผ ๋„๊ตฌ๋ฅผ ์•Œ์•„๋ณด์ž! ๐Ÿ”

๐Ÿ› ๏ธ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ๋„๊ตฌ

1. ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ

โ€ข WAVE (Web Accessibility Evaluation Tool)
์‹œ๊ฐ์ ์œผ๋กœ ์ ‘๊ทผ์„ฑ ๋ฌธ์ œ๋ฅผ ํ‘œ์‹œํ•ด์ค˜. ์ดˆ๋ณด์ž์—๊ฒŒ ํŠนํžˆ ์ข‹์•„!

โ€ข axe DevTools
๊ฐœ๋ฐœ์ž ๋„๊ตฌ์— ํ†ตํ•ฉ๋˜์–ด ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•ด. ๋งค์šฐ ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•ด.

โ€ข Lighthouse
Chrome DevTools์— ๋‚ด์žฅ๋˜์–ด ์žˆ์–ด. ์ ‘๊ทผ์„ฑ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„ฑ๋Šฅ, SEO๋„ ํ•จ๊ป˜ ์ฒดํฌํ•ด์ค˜.

โ€ข IBM Equal Access Accessibility Checker
IBM์—์„œ ๋งŒ๋“  ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ. ์ƒ์„ธํ•œ ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•ด.

2. ๋ช…๋ น์ค„ ๋„๊ตฌ

# axe-core CLI ์„ค์น˜
npm install -g @axe-core/cli

# ์›น์‚ฌ์ดํŠธ ํ…Œ์ŠคํŠธ
axe https://example.com

# Pa11y ์„ค์น˜ ๋ฐ ์‚ฌ์šฉ
npm install -g pa11y
pa11y https://example.com

# ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€ ํ…Œ์ŠคํŠธ
pa11y-ci --sitemap https://example.com/sitemap.xml

3. ์˜จ๋ผ์ธ ๊ฒ€์ฆ ๋„๊ตฌ

๐ŸŒ ์œ ์šฉํ•œ ์˜จ๋ผ์ธ ๋„๊ตฌ๋“ค
โ€ข WAVE: wave.webaim.org
โ€ข AChecker: achecker.achecks.ca
โ€ข HTML Validator: validator.w3.org
โ€ข Color Contrast Checker: webaim.org/resources/contrastchecker
โ€ข ํ•œ๊ตญํ˜• ์›น ์ฝ˜ํ…์ธ  ์ ‘๊ทผ์„ฑ ์ง€์นจ ๊ฒ€์‚ฌ: accessibility.or.kr

๐Ÿ‘จโ€๐Ÿฆฏ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

์ž๋™ํ™” ๋„๊ตฌ๋Š” ์ „์ฒด ์ ‘๊ทผ์„ฑ ๋ฌธ์ œ์˜ ์•ฝ 30-40%๋งŒ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ์–ด. ๋‚˜๋จธ์ง€๋Š” ์ˆ˜๋™์œผ๋กœ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ด! ๐Ÿ’ช

โœ… ํ•„์ˆ˜ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
1. ํ‚ค๋ณด๋“œ ์ „์šฉ ๋„ค๋น„๊ฒŒ์ด์…˜
โ–ก ๋งˆ์šฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  Tab ํ‚ค๋งŒ์œผ๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ
โ–ก ํฌ์ปค์Šค ์ˆœ์„œ๊ฐ€ ๋…ผ๋ฆฌ์ ์ธ์ง€ ํ™•์ธ
โ–ก ํฌ์ปค์Šค ํ‘œ์‹œ๊ฐ€ ๋ช…ํ™•ํ•œ์ง€ ํ™•์ธ
โ–ก ํ‚ค๋ณด๋“œ ํŠธ๋žฉ์ด ์—†๋Š”์ง€ ํ™•์ธ
2. ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ํ…Œ์ŠคํŠธ
โ–ก NVDA (Windows, ๋ฌด๋ฃŒ) ๋˜๋Š” JAWS (Windows, ์œ ๋ฃŒ) ์‚ฌ์šฉ
โ–ก VoiceOver (Mac/iOS, ๋‚ด์žฅ) ์‚ฌ์šฉ
โ–ก TalkBack (Android, ๋‚ด์žฅ) ์‚ฌ์šฉ
โ–ก ๋ชจ๋“  ์ฝ˜ํ…์ธ ๊ฐ€ ์˜๋ฏธ ์žˆ๊ฒŒ ์ฝํžˆ๋Š”์ง€ ํ™•์ธ
โ–ก ๋žœ๋“œ๋งˆํฌ์™€ ํ—ค๋”ฉ์œผ๋กœ ์‰ฝ๊ฒŒ ํƒ์ƒ‰ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธ
3. ํ™•๋Œ€/์ถ•์†Œ ํ…Œ์ŠคํŠธ
โ–ก 200% ํ™•๋Œ€ ์‹œ ๋ชจ๋“  ์ฝ˜ํ…์ธ  ์ ‘๊ทผ ๊ฐ€๋Šฅ
โ–ก ๊ฐ€๋กœ ์Šคํฌ๋กค์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ
โ–ก ํ…์ŠคํŠธ๊ฐ€ ์ž˜๋ฆฌ๊ฑฐ๋‚˜ ๊ฒน์น˜์ง€ ์•Š์Œ
4. ์ƒ‰์ƒ ๋ฐ ๋Œ€๋น„ ํ…Œ์ŠคํŠธ
โ–ก ์ƒ‰๋งน ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ๋กœ ํ™•์ธ
โ–ก ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ํ™•์ธ
โ–ก ์ƒ‰์ƒ๋งŒ์œผ๋กœ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ
5. ์ฝ˜ํ…์ธ  ํ…Œ์ŠคํŠธ
โ–ก ๋ชจ๋“  ์ด๋ฏธ์ง€์— ์ ์ ˆํ•œ ๋Œ€์ฒด ํ…์ŠคํŠธ
โ–ก ๋งํฌ ํ…์ŠคํŠธ๊ฐ€ ๋ช…ํ™•ํ•จ ("์—ฌ๊ธฐ ํด๋ฆญ" ๊ธˆ์ง€)
โ–ก ํ—ค๋”ฉ ๊ตฌ์กฐ๊ฐ€ ๋…ผ๋ฆฌ์ 
โ–ก ์–ธ์–ด๊ฐ€ ๋ช…ํ™•ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›€

๐ŸŽฏ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ๋ฒ• ๊ฐ„๋‹จ ๊ฐ€์ด๋“œ

์Šคํฌ๋ฆฐ ๋ฆฌ๋” ํ”Œ๋žซํผ ์ฃผ์š” ๋‹จ์ถ•ํ‚ค
NVDA Windows (๋ฌด๋ฃŒ) Ctrl+Alt+N: ์‹œ์ž‘/์ข…๋ฃŒ
Insert+Down: ์ฝ๊ธฐ ์‹œ์ž‘
H: ๋‹ค์Œ ํ—ค๋”ฉ์œผ๋กœ
K: ๋‹ค์Œ ๋งํฌ๋กœ
JAWS Windows (์œ ๋ฃŒ) Insert+Down: ์ฝ๊ธฐ ์‹œ์ž‘
Insert+F7: ๋งํฌ ๋ชฉ๋ก
Insert+F6: ํ—ค๋”ฉ ๋ชฉ๋ก
T: ๋‹ค์Œ ํ‘œ๋กœ
VoiceOver Mac/iOS Cmd+F5: ์ผœ๊ธฐ/๋„๊ธฐ
VO+A: ์ฝ๊ธฐ ์‹œ์ž‘
VO+U: ๋กœํ„ฐ ์—ด๊ธฐ
VO+Right: ๋‹ค์Œ ํ•ญ๋ชฉ
TalkBack Android ๋ณผ๋ฅจ Up+Down: ์ผœ๊ธฐ/๋„๊ธฐ
์Šค์™€์ดํ”„: ํƒ์ƒ‰
๋”๋ธ” ํƒญ: ํ™œ์„ฑํ™”
๐Ÿ’ก ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ํ…Œ์ŠคํŠธ ํŒ!
์ฒ˜์Œ์—๋Š” ์–ด์ƒ‰ํ•˜๊ฒ ์ง€๋งŒ, ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฒฝํ—˜ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์•ผ. ์ตœ์†Œํ•œ ์ฃผ์š” ์‚ฌ์šฉ์ž ํ”Œ๋กœ์šฐ๋Š” ์Šคํฌ๋ฆฐ ๋ฆฌ๋”๋กœ ํ…Œ์ŠคํŠธํ•ด๋ณด๋Š” ๊ฑธ ๊ฐ•๋ ฅ ์ถ”์ฒœํ•ด! ๐ŸŽง

๐Ÿข ์‹ค๋ฌด์—์„œ์˜ ์›น ์ ‘๊ทผ์„ฑ ๊ตฌํ˜„ ์ „๋žต

์ด๋ก ๊ณผ ๊ธฐ์ˆ ์€ ๋ฐฐ์› ์œผ๋‹ˆ, ์ด์ œ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ• ์ง€ ์•Œ์•„๋ณด์ž! ์‹ค๋ฌด ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ ์‹ค์šฉ์ ์ธ ํŒ๋“ค์„ ๊ณต์œ ํ• ๊ฒŒ. ๐Ÿ’ผ

๐Ÿ“‹ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋ถ€ํ„ฐ ์ ‘๊ทผ์„ฑ ๊ณ ๋ คํ•˜๊ธฐ

1. ๊ธฐํš ๋‹จ๊ณ„

โ€ข ์ ‘๊ทผ์„ฑ ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜
๋ชฉํ‘œ ์ค€์ˆ˜ ๋ ˆ๋ฒจ ๊ฒฐ์ • (๋ณดํ†ต WCAG 2.1 Level AA)
๋ฒ•์  ์š”๊ตฌ์‚ฌํ•ญ ํ™•์ธ (ํ•œ๊ตญ์˜ ๊ฒฝ์šฐ ์žฅ์• ์ธ์ฐจ๋ณ„๊ธˆ์ง€๋ฒ•)
์˜ˆ์‚ฐ๊ณผ ์ผ์ •์— ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„ ํฌํ•จ

โ€ข ์‚ฌ์šฉ์ž ๋ฆฌ์„œ์น˜
๋‹ค์–‘ํ•œ ์žฅ์• ๋ฅผ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž ์ธํ„ฐ๋ทฐ
๋ณด์กฐ ๊ธฐ์ˆ  ์‚ฌ์šฉ ํŒจํ„ด ์กฐ์‚ฌ
ํŽ˜๋ฅด์†Œ๋‚˜์— ์ ‘๊ทผ์„ฑ ๋‹ˆ์ฆˆ ํฌํ•จ

2. ๋””์ž์ธ ๋‹จ๊ณ„

โ€ข ์ƒ‰์ƒ ๋Œ€๋น„ ํ™•๋ณด
๋””์ž์ธ ์‹œ์Šคํ…œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ƒ‰์ƒ ํŒ”๋ ˆํŠธ ์ •์˜
Figma/Sketch ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๋Œ€๋น„ ์ฒดํฌ

โ€ข ๋ช…ํ™•ํ•œ ์ธํ„ฐ๋ž™์…˜ ๋””์ž์ธ
์ถฉ๋ถ„ํ•œ ํ„ฐ์น˜ ํƒ€๊ฒŸ ํฌ๊ธฐ (์ตœ์†Œ 44x44px)
๋ช…ํ™•ํ•œ ํฌ์ปค์Šค ์ƒํƒœ ๋””์ž์ธ
์ผ๊ด€๋œ UI ํŒจํ„ด ์‚ฌ์šฉ

โ€ข ๋ฐ˜์‘ํ˜• ๋””์ž์ธ
๋‹ค์–‘ํ•œ ํ™”๋ฉด ํฌ๊ธฐ์™€ ํ™•๋Œ€ ์ˆ˜์ค€ ๊ณ ๋ ค
ํ…์ŠคํŠธ ํฌ๊ธฐ ์กฐ์ ˆ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„

3. ๊ฐœ๋ฐœ ๋‹จ๊ณ„

โ€ข ์‹œ๋งจํ‹ฑ HTML ์šฐ์„ 
์˜๋ฏธ ์žˆ๋Š” HTML ์š”์†Œ ์‚ฌ์šฉ
์ ์ ˆํ•œ ํ—ค๋”ฉ ๊ตฌ์กฐ ์œ ์ง€
ํผ ์š”์†Œ์— ๋ ˆ์ด๋ธ” ์—ฐ๊ฒฐ

โ€ข ์ ์ง„์  ํ–ฅ์ƒ(Progressive Enhancement)
๊ธฐ๋ณธ HTML๋กœ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„
CSS์™€ JavaScript๋กœ ๊ฒฝํ—˜ ํ–ฅ์ƒ
JavaScript ๋น„ํ™œ์„ฑํ™” ์‹œ์—๋„ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์ž‘๋™

โ€ข ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ํ†ตํ•ฉ
CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ ํฌํ•จ
PR๋งˆ๋‹ค ์ž๋™ ๊ฒ€์‚ฌ ์‹คํ–‰
๋ฆฐํŠธ ๊ทœ์น™์— ์ ‘๊ทผ์„ฑ ์ฒดํฌ ์ถ”๊ฐ€

๐Ÿ”„ ์ง€์†์ ์ธ ๊ฐœ์„  ํ”„๋กœ์„ธ์Šค

// package.json์— ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ์ถ”๊ฐ€
{
  "scripts": {
    "test:a11y": "pa11y-ci",
    "lint:a11y": "eslint --plugin jsx-a11y",
    "audit": "lighthouse --only-categories=accessibility"
  },
  "devDependencies": {
    "pa11y-ci": "^3.0.1",
    "eslint-plugin-jsx-a11y": "^6.7.1",
    "lighthouse": "^10.0.0"
  }
}

// .pa11yci ์„ค์ • ํŒŒ์ผ
{
  "defaults": {
    "standard": "WCAG2AA",
    "timeout": 10000,
    "wait": 1000
  },
  "urls": [
    "http://localhost:3000",
    "http://localhost:3000/about",
    "http://localhost:3000/contact"
  ]
}

๐Ÿ‘ฅ ํŒ€ ํ˜‘์—…๊ณผ ๊ต์œก

๐ŸŽ“ ํŒ€ ์ „์ฒด์˜ ์ ‘๊ทผ์„ฑ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”

1. ์ •๊ธฐ์ ์ธ ๊ต์œก ์„ธ์…˜
โ€ข ์›” 1ํšŒ ์ ‘๊ทผ์„ฑ ์›Œํฌ์ƒต ๊ฐœ์ตœ
โ€ข ์‹ค์ œ ์‚ฌ์šฉ์ž ์ดˆ์ฒญ ์„ธ์…˜
โ€ข ์ตœ์‹  ๊ฐ€์ด๋“œ๋ผ์ธ ์—…๋ฐ์ดํŠธ ๊ณต์œ 

2. ์ ‘๊ทผ์„ฑ ์ฑ”ํ”ผ์–ธ ์ง€์ •
โ€ข ๊ฐ ํŒ€์— ์ ‘๊ทผ์„ฑ ์ „๋ฌธ๊ฐ€ ๋ฐฐ์น˜
โ€ข ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์‹œ ์ ‘๊ทผ์„ฑ ์ฒดํฌ
โ€ข ์งˆ๋ฌธ๊ณผ ์ด์Šˆ ํ•ด๊ฒฐ ์ง€์›

3. ๋ฌธ์„œํ™”์™€ ๊ฐ€์ด๋“œ๋ผ์ธ
โ€ข ์‚ฌ๋‚ด ์ ‘๊ทผ์„ฑ ๊ฐ€์ด๋“œ ์ž‘์„ฑ
โ€ข ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ ‘๊ทผ์„ฑ ์˜ˆ์ œ ํฌํ•จ
โ€ข ์ฒดํฌ๋ฆฌ์ŠคํŠธ์™€ ํ…œํ”Œ๋ฆฟ ์ œ๊ณต

๐Ÿ“Š ์ ‘๊ทผ์„ฑ ์„ฑ์ˆ™๋„ ๋ชจ๋ธ

๋ ˆ๋ฒจ ์„ค๋ช… ํŠน์ง•
Level 1
์ดˆ๊ธฐ
์ ‘๊ทผ์„ฑ์— ๋Œ€ํ•œ ์ธ์‹ ๋ถ€์กฑ โ€ข ์ ‘๊ทผ์„ฑ ๊ณ ๋ ค ์—†์Œ
โ€ข ์ž๋™ํ™” ๋„๊ตฌ ๋ฏธ์‚ฌ์šฉ
โ€ข ํ…Œ์ŠคํŠธ ์—†์Œ
Level 2
๋ฐ˜์‘์ 
๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๋Œ€์‘ โ€ข ๋ถˆ๋งŒ ์ ‘์ˆ˜ ํ›„ ์ˆ˜์ •
โ€ข ๊ธฐ๋ณธ์ ์ธ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ
โ€ข ์ผ๋ถ€ ๊ฐœ๋ฐœ์ž๋งŒ ์ธ์‹
Level 3
์ฒด๊ณ„์ 
ํ”„๋กœ์„ธ์Šค์— ํ†ตํ•ฉ โ€ข ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค์— ํฌํ•จ
โ€ข ์ •๊ธฐ์ ์ธ ํ…Œ์ŠคํŠธ
โ€ข ํŒ€ ์ „์ฒด ๊ต์œก
Level 4
์„ ๋„์ 
์กฐ์ง ๋ฌธํ™”๋กœ ์ •์ฐฉ โ€ข ๋””์ž์ธ๋ถ€ํ„ฐ ์ ‘๊ทผ์„ฑ ๊ณ ๋ ค
โ€ข ์ž๋™ํ™”๋œ CI/CD ํ†ตํ•ฉ
โ€ข ์ง€์†์ ์ธ ๊ฐœ์„ 
Level 5
ํ˜์‹ ์ 
์—…๊ณ„ ๋ฆฌ๋” โ€ข ์ƒˆ๋กœ์šด ํ‘œ์ค€ ์ œ์‹œ
โ€ข ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ์—ฌ
โ€ข ์™„์ „ํ•œ ํฌ์šฉ์  ๋””์ž์ธ

๐ŸŒ ํ•œ๊ตญ์˜ ์›น ์ ‘๊ทผ์„ฑ ๋ฒ•๊ทœ์™€ ์ธ์ฆ

ํ•œ๊ตญ์—์„œ ์›น ๊ฐœ๋ฐœ์„ ํ•œ๋‹ค๋ฉด ๊ผญ ์•Œ์•„์•ผ ํ•  ๋ฒ•์  ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์ธ์ฆ ์ œ๋„์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž! ๐Ÿ‡ฐ๐Ÿ‡ท

โš–๏ธ ๊ด€๋ จ ๋ฒ•๊ทœ

1. ์žฅ์• ์ธ์ฐจ๋ณ„๊ธˆ์ง€ ๋ฐ ๊ถŒ๋ฆฌ๊ตฌ์ œ ๋“ฑ์— ๊ด€ํ•œ ๋ฒ•๋ฅ 

์ œ21์กฐ(์ •๋ณด์ ‘๊ทผ์—์„œ์˜ ์ฐจ๋ณ„๊ธˆ์ง€)
โ€ข ์žฅ์• ์ธ์ด ์ „์ž์ •๋ณด์™€ ๋น„์ „์ž์ •๋ณด๋ฅผ ์ด์šฉํ•˜๊ณ  ๊ทธ์— ์ ‘๊ทผํ•จ์— ์žˆ์–ด์„œ ์žฅ์• ๋ฅผ ์ด์œ ๋กœ ์ œํ•œยท๋ฐฐ์ œยท๋ถ„๋ฆฌยท๊ฑฐ๋ถ€ ๋“ฑ ์ฐจ๋ณ„ํ•ด์„œ๋Š” ์•ˆ ๋จ
โ€ข ์›น์‚ฌ์ดํŠธ ๋ฐ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ๋•Œ ์ ‘๊ทผ์„ฑ์ด ๋ณด์žฅ๋˜์–ด์•ผ ํ•จ

์ ์šฉ ๋Œ€์ƒ (๋‹จ๊ณ„์  ์ ์šฉ)
โ€ข 2009๋…„: ๊ณต๊ณต๊ธฐ๊ด€
โ€ข 2013๋…„: ๋ฒ•์ธ (์ƒ์‹œ๊ทผ๋กœ์ž 30์ธ ์ด์ƒ)
โ€ข 2015๋…„: ๋ฒ•์ธ (์ƒ์‹œ๊ทผ๋กœ์ž 30์ธ ๋ฏธ๋งŒ)

์œ„๋ฐ˜ ์‹œ ์ œ์žฌ
โ€ข ์‹œ์ •๋ช…๋ น ๋ถˆ์ดํ–‰ ์‹œ 3์ฒœ๋งŒ์› ์ดํ•˜ ๊ณผํƒœ๋ฃŒ
โ€ข ์†ํ•ด๋ฐฐ์ƒ ์ฒญ๊ตฌ ๊ฐ€๋Šฅ

2. ๊ตญ๊ฐ€์ •๋ณดํ™” ๊ธฐ๋ณธ๋ฒ•

์ œ32์กฐ(์žฅ์• ์ธยท๊ณ ๋ น์ž ๋“ฑ์˜ ์ •๋ณด ์ ‘๊ทผ ๋ฐ ์ด์šฉ ๋ณด์žฅ)
โ€ข ๊ตญ๊ฐ€๊ธฐ๊ด€ ๋“ฑ์€ ์ •๋ณดํ†ต์‹ ๋ง์„ ํ†ตํ•ด ์ •๋ณด๋‚˜ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ๋•Œ ์žฅ์• ์ธยท๊ณ ๋ น์ž ๋“ฑ์ด ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•˜๊ณ  ์ด์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•จ
โ€ข ํ•œ๊ตญํ˜• ์›น ์ฝ˜ํ…์ธ  ์ ‘๊ทผ์„ฑ ์ง€์นจ(KWCAG) ์ค€์ˆ˜ ์˜๋ฌด

๐Ÿ“œ ํ•œ๊ตญํ˜• ์›น ์ฝ˜ํ…์ธ  ์ ‘๊ทผ์„ฑ ์ง€์นจ (KWCAG)

KWCAG๋Š” WCAG๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๊ตญ ์‹ค์ •์— ๋งž๊ฒŒ ์ œ์ •๋œ ์ง€์นจ์ด์•ผ. ํ˜„์žฌ KWCAG 2.2๊ฐ€ ์ตœ์‹  ๋ฒ„์ „์ด์•ผ. ๐Ÿ“‹

KWCAG 2.2์˜ 4๊ฐ€์ง€ ์›์น™๊ณผ 13๊ฐœ ์ง€์นจ

1. ์ธ์‹์˜ ์šฉ์ด์„ฑ (Perceivable)
โ€ข 1.1 ๋Œ€์ฒด ํ…์ŠคํŠธ
โ€ข 1.2 ๋ฉ€ํ‹ฐ๋ฏธ๋””์–ด ๋Œ€์ฒด ์ˆ˜๋‹จ
โ€ข 1.3 ๋ช…๋ฃŒ์„ฑ

2. ์šด์šฉ์˜ ์šฉ์ด์„ฑ (Operable)
โ€ข 2.1 ์ž…๋ ฅ์žฅ์น˜ ์ ‘๊ทผ์„ฑ
โ€ข 2.2 ์ถฉ๋ถ„ํ•œ ์‹œ๊ฐ„ ์ œ๊ณต
โ€ข 2.3 ๊ด‘๊ณผ๋ฏผ์„ฑ ๋ฐœ์ž‘ ์˜ˆ๋ฐฉ
โ€ข 2.4 ์‰ฌ์šด ๋‚ด๋น„๊ฒŒ์ด์…˜

3. ์ดํ•ด์˜ ์šฉ์ด์„ฑ (Understandable)
โ€ข 3.1 ๊ฐ€๋…์„ฑ
โ€ข 3.2 ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ
โ€ข 3.3 ์ฝ˜ํ…์ธ ์˜ ๋…ผ๋ฆฌ์„ฑ
โ€ข 3.4 ์ž…๋ ฅ ๋„์›€

4. ๊ฒฌ๊ณ ์„ฑ (Robust)
โ€ข 4.1 ๋ฌธ๋ฒ• ์ค€์ˆ˜
โ€ข 4.2 ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ ‘๊ทผ์„ฑ

๐Ÿ† ์›น ์ ‘๊ทผ์„ฑ ํ’ˆ์งˆ์ธ์ฆ ๋งˆํฌ

ํ•œ๊ตญ์›น์ ‘๊ทผ์„ฑ์ธ์ฆํ‰๊ฐ€์›์—์„œ ๋ฐœ๊ธ‰ํ•˜๋Š” ์ธ์ฆ ๋งˆํฌ์•ผ. ์›น์‚ฌ์ดํŠธ๊ฐ€ KWCAG๋ฅผ ์ค€์ˆ˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ณต์‹์ ์œผ๋กœ ์ธ์ •๋ฐ›๋Š” ๊ฑฐ์ง€! ๐ŸŽ–๏ธ

์ธ์ฆ ์ ˆ์ฐจ

1๋‹จ๊ณ„: ์‹ ์ฒญ
โ€ข ์›น ์ ‘๊ทผ์„ฑ ํ’ˆ์งˆ์ธ์ฆ ์‹ ์ฒญ์„œ ์ œ์ถœ
โ€ข ๋Œ€์ƒ ์›น์‚ฌ์ดํŠธ URL ์ œ๊ณต

2๋‹จ๊ณ„: ์ž์ฒด ์ ๊ฒ€
โ€ข ์ž๋™ํ™” ๋„๊ตฌ๋กœ ์‚ฌ์ „ ์ ๊ฒ€
โ€ข ์ฒดํฌ๋ฆฌ์ŠคํŠธ ๊ธฐ๋ฐ˜ ์ž๊ฐ€ ์ง„๋‹จ

3๋‹จ๊ณ„: ์ „๋ฌธ๊ฐ€ ์‹ฌ์‚ฌ
โ€ข ์ ‘๊ทผ์„ฑ ์ „๋ฌธ๊ฐ€์˜ ์ˆ˜๋™ ํ‰๊ฐ€
โ€ข ๋ณด์กฐ ๊ธฐ์ˆ ์„ ์ด์šฉํ•œ ์‹ค์‚ฌ์šฉ ํ…Œ์ŠคํŠธ
โ€ข ์ƒ์„ธํ•œ ํ‰๊ฐ€ ๋ณด๊ณ ์„œ ์ž‘์„ฑ

4๋‹จ๊ณ„: ์ธ์ฆ ๋ฐœ๊ธ‰
โ€ข ๊ธฐ์ค€ ์ถฉ์กฑ ์‹œ ์ธ์ฆ ๋งˆํฌ ๋ฐœ๊ธ‰
โ€ข ์œ ํšจ๊ธฐ๊ฐ„: 2๋…„
โ€ข ์›น์‚ฌ์ดํŠธ์— ์ธ์ฆ ๋งˆํฌ ๊ฒŒ์‹œ ๊ฐ€๋Šฅ

๐Ÿ’ก ์ธ์ฆ ์ทจ๋“ ํŒ!
โ€ข ์ธ์ฆ ์‹ ์ฒญ ์ „์— ์ถฉ๋ถ„ํ•œ ์‚ฌ์ „ ์ ๊ฒ€ ํ•„์ˆ˜
โ€ข ์ฃผ์š” ํŽ˜์ด์ง€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ „์ฒด ์‚ฌ์ดํŠธ ์ ๊ฒ€
โ€ข ๊ฐœ๋ฐœํŒ€๊ณผ ๋””์ž์ธํŒ€์˜ ํ˜‘์—… ํ•„์š”
โ€ข ์ธ์ฆ ํ›„์—๋„ ์ง€์†์ ์ธ ๊ด€๋ฆฌ ์ค‘์š” (๊ฐฑ์‹  ๋Œ€๋น„)
โ€ข ๋น„์šฉ: ์•ฝ 200๋งŒ์›~500๋งŒ์› (์‚ฌ์ดํŠธ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„)

๐Ÿ’ก ์‹ค์ œ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ์›น ์ ‘๊ทผ์„ฑ

์ด๋ก ๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜์ง€! ์‹ค์ œ ์›น์‚ฌ์ดํŠธ๋“ค์˜ ์ข‹์€ ์˜ˆ์™€ ๋‚˜์œ ์˜ˆ๋ฅผ ํ†ตํ•ด ๋ฐฐ์›Œ๋ณด์ž. ๐Ÿ”

โœ… ์ข‹์€ ์‚ฌ๋ก€๋“ค

1. BBC (์˜๊ตญ ๊ณต์˜๋ฐฉ์†ก)

์šฐ์ˆ˜ํ•œ ์ :
โ€ข ๋ชจ๋“  ๋™์˜์ƒ์— ์ž๋ง‰๊ณผ ์Œ์„ฑ ์„ค๋ช… ์ œ๊ณต
โ€ข ๋ช…ํ™•ํ•œ ํ—ค๋”ฉ ๊ตฌ์กฐ์™€ ๋žœ๋“œ๋งˆํฌ
โ€ข ํ‚ค๋ณด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜ ์™„๋ฒฝ ์ง€์›
โ€ข ๋‹ค์–‘ํ•œ ํ…์ŠคํŠธ ํฌ๊ธฐ ์˜ต์…˜
โ€ข ๊ณ ๋Œ€๋น„ ๋ชจ๋“œ ์ œ๊ณต

๋ฐฐ์šธ ์ :
์‚ฌ์šฉ์ž ์„ค์ •์„ ์ €์žฅํ•˜๊ณ  ๋ชจ๋“  ํŽ˜์ด์ง€์— ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ–ˆ์–ด. ์ด๊ฑด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค์ง€! ๐ŸŽฏ

2. GOV.UK (์˜๊ตญ ์ •๋ถ€ ์›น์‚ฌ์ดํŠธ)

์šฐ์ˆ˜ํ•œ ์ :
โ€ข ๊ทน๋„๋กœ ๋‹จ์ˆœํ•˜๊ณ  ๋ช…ํ™•ํ•œ ๋””์ž์ธ
โ€ข ํ‰์ดํ•œ ์–ธ์–ด ์‚ฌ์šฉ (Plain English)
โ€ข ๋ชจ๋ฐ”์ผ ์šฐ์„  ๋ฐ˜์‘ํ˜• ๋””์ž์ธ
โ€ข ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„
โ€ข ์˜คํ”ˆ์†Œ์Šค ๋””์ž์ธ ์‹œ์Šคํ…œ ์ œ๊ณต

๋ฐฐ์šธ ์ :
"์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ๋งŒ ์ œ๊ณตํ•œ๋‹ค"๋Š” ์ฒ ํ•™์œผ๋กœ, ๋ถˆํ•„์š”ํ•œ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ–ˆ์–ด. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ ‘๊ทผ์„ฑ๊ณผ ์‚ฌ์šฉ์„ฑ์ด ๋ชจ๋‘ ํ–ฅ์ƒ๋˜์—ˆ์ง€! ๐ŸŽจ

3. ๋„ค์ด๋ฒ„ (ํ•œ๊ตญ)

์šฐ์ˆ˜ํ•œ ์ :
โ€ข ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๋ณ„๋„ ๋„ค๋น„๊ฒŒ์ด์…˜
โ€ข ์ฃผ์š” ์„œ๋น„์Šค์— ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค ์ œ๊ณต
โ€ข ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ์ƒ์„ธํ•œ ๋Œ€์ฒด ํ…์ŠคํŠธ
โ€ข ์Œ์„ฑ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ

๋ฐฐ์šธ ์ :
๋ณต์žกํ•œ ํฌํ„ธ ์‚ฌ์ดํŠธ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ ‘๊ทผ์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ง€์†์ ์œผ๋กœ ๊ฐœ์„ ํ•˜๊ณ  ์žˆ์–ด. ํŠนํžˆ ๋ชจ๋ฐ”์ผ ์ ‘๊ทผ์„ฑ์— ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๊ณ  ์žˆ์ง€! ๐Ÿ“ฑ

โŒ ๊ฐœ์„ ์ด ํ•„์š”ํ•œ ์‚ฌ๋ก€๋“ค

ํ”ํ•œ ์ ‘๊ทผ์„ฑ ๋ฌธ์ œ๋“ค

1. ์ด๋ฏธ์ง€ ์บก์ฐจ(CAPTCHA)

๋ฌธ์ œ์ : ์‹œ๊ฐ์žฅ์• ์ธ์€ ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜ ์บก์ฐจ๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด.
ํ•ด๊ฒฐ์ฑ…: ์Œ์„ฑ ์บก์ฐจ ๋Œ€์•ˆ ์ œ๊ณต, ๋˜๋Š” reCAPTCHA v3 ๊ฐ™์€ ๋ณด์ด์ง€ ์•Š๋Š” ์บก์ฐจ ์‚ฌ์šฉ

<!-- โŒ ๋‚˜์œ ์˜ˆ -->
<img src="captcha.jpg" alt="๋ณด์•ˆ ๋ฌธ์ž">

<!-- โœ… ์ข‹์€ ์˜ˆ -->
<div class="captcha-container">
    <img src="captcha.jpg" alt="๋ณด์•ˆ ๋ฌธ์ž ์ด๋ฏธ์ง€">
    <button type="button" onclick="playCaptchaAudio()">
        ๐Ÿ”Š ์Œ์„ฑ์œผ๋กœ ๋“ฃ๊ธฐ
    </button>
    <button type="button" onclick="refreshCaptcha()">
        ๐Ÿ”„ ์ƒˆ๋กœ๊ณ ์นจ
    </button>
</div>
2. ์ž๋™ ์žฌ์ƒ ๋™์˜์ƒ

๋ฌธ์ œ์ : ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ˜ํ…์ธ ๋ฅผ ๋“ฃ๋Š” ๋ฐ ๋ฐฉํ•ด๊ฐ€ ๋˜๊ณ , ๋ฐœ์ž‘์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์–ด.
ํ•ด๊ฒฐ์ฑ…: ์ž๋™ ์žฌ์ƒ ๊ธˆ์ง€, ๋˜๋Š” ์Œ์†Œ๊ฑฐ ์ƒํƒœ๋กœ ์žฌ์ƒํ•˜๊ณ  ๋ช…ํ™•ํ•œ ์ปจํŠธ๋กค ์ œ๊ณต

<!-- โŒ ๋‚˜์œ ์˜ˆ -->
<video autoplay>
    <source src="video.mp4">
</video>

<!-- โœ… ์ข‹์€ ์˜ˆ -->
<video controls preload="metadata">
    <source src="video.mp4">
    <track kind="captions" src="captions.vtt">
</video>
3. ๋ชจ๋‹ฌ ๋‹ค์ด์–ผ๋กœ๊ทธ์˜ ํฌ์ปค์Šค ํŠธ๋žฉ ๋ˆ„๋ฝ

๋ฌธ์ œ์ : ๋ชจ๋‹ฌ์ด ์—ด๋ ธ์„ ๋•Œ ํฌ์ปค์Šค๊ฐ€ ๋ชจ๋‹ฌ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•ด.
ํ•ด๊ฒฐ์ฑ…: ํฌ์ปค์Šค๋ฅผ ๋ชจ๋‹ฌ ๋‚ด๋ถ€์— ๊ฐ€๋‘๊ณ , ESC ํ‚ค๋กœ ๋‹ซ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด

// ํฌ์ปค์Šค ํŠธ๋žฉ ๊ตฌํ˜„
function trapFocus(element) {
    const focusableElements = element.querySelectorAll(
        'a[href], button, textarea, input, select, [tabindex]:not([tabindex="-1"])'
    );
    const firstFocusable = focusableElements[0];
    const lastFocusable = focusableElements[focusableElements.length - 1];
    
    element.addEventListener('keydown', (e) => {
        if (e.key === 'Tab') {
            if (e.shiftKey) {
                if (document.activeElement === firstFocusable) {
                    lastFocusable.focus();
                    e.preventDefault();
                }
            } else {
                if (document.activeElement === lastFocusable) {
                    firstFocusable.focus();
                    e.preventDefault();
                }
            }
        }
        
        if (e.key === 'Escape') {
            closeModal();
        }
    });
    
    firstFocusable.focus();
}

๐Ÿš€ ์ตœ์‹  ํŠธ๋ Œ๋“œ์™€ ๋ฏธ๋ž˜์˜ ์›น ์ ‘๊ทผ์„ฑ

์›น ์ ‘๊ทผ์„ฑ์€ ๊ณ„์† ์ง„ํ™”ํ•˜๊ณ  ์žˆ์–ด! ์ตœ์‹  ํŠธ๋ Œ๋“œ์™€ ์•ž์œผ๋กœ์˜ ๋ฐฉํ–ฅ์„ ์•Œ์•„๋ณด์ž. ๐Ÿ”ฎ

๐Ÿค– AI์™€ ๋จธ์‹ ๋Ÿฌ๋‹์˜ ํ™œ์šฉ

1. ์ž๋™ ๋Œ€์ฒด ํ…์ŠคํŠธ ์ƒ์„ฑ

AI๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ๋ถ„์„ํ•ด์„œ ์ž๋™์œผ๋กœ ๋Œ€์ฒด ํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ค˜. Microsoft์˜ Seeing AI, Google์˜ Cloud Vision API ๊ฐ™์€ ์„œ๋น„์Šค๋“ค์ด ์žˆ์–ด.

์žฅ์ :
โ€ข ๋Œ€๋Ÿ‰์˜ ์ด๋ฏธ์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ
โ€ข ์ผ๊ด€๋œ ํ’ˆ์งˆ์˜ ์„ค๋ช… ์ œ๊ณต
โ€ข ๊ฐœ๋ฐœ์ž์˜ ๋ถ€๋‹ด ๊ฐ์†Œ

ํ•œ๊ณ„:
โ€ข ๋งฅ๋ฝ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•จ
โ€ข ์ค‘์š”ํ•œ ์„ธ๋ถ€์‚ฌํ•ญ์„ ๋†“์น  ์ˆ˜ ์žˆ์Œ
โ€ข ์—ฌ์ „ํžˆ ์‚ฌ๋žŒ์˜ ๊ฒ€ํ† ๊ฐ€ ํ•„์š”

2. ์Œ์„ฑ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋Œ€ํ™”ํ˜• AI

Alexa, Siri, Google Assistant ๊ฐ™์€ ์Œ์„ฑ ๋น„์„œ๊ฐ€ ์›น ์ ‘๊ทผ์„ฑ์˜ ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋งŒ๋“ค๊ณ  ์žˆ์–ด.

์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ณ ๋ คํ•ด์•ผ ํ•  ์ :
โ€ข ์Œ์„ฑ ๊ฒ€์ƒ‰ ์ตœ์ ํ™” (Voice Search Optimization)
โ€ข ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ๋ฅผ ๊ณ ๋ คํ•œ ์ฝ˜ํ…์ธ  ๊ตฌ์กฐ
โ€ข ์Œ์„ฑ ๋ช…๋ น์œผ๋กœ ์กฐ์ž‘ ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค
โ€ข Schema.org ๋งˆํฌ์—…์œผ๋กœ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ์ œ๊ณต

๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ๊ณผ ํ„ฐ์น˜ ์ธํ„ฐํŽ˜์ด์Šค

๋ชจ๋ฐ”์ผ ์ ‘๊ทผ์„ฑ ์ฒดํฌํฌ์ธํŠธ

โ€ข ์ถฉ๋ถ„ํ•œ ํ„ฐ์น˜ ํƒ€๊ฒŸ ํฌ๊ธฐ
์ตœ์†Œ 44x44 CSS ํ”ฝ์…€ (iOS), 48x48dp (Android)

โ€ข ์ œ์Šค์ฒ˜ ๋Œ€์•ˆ ์ œ๊ณต
์Šค์™€์ดํ”„, ํ•€์น˜ ๊ฐ™์€ ๋ณต์žกํ•œ ์ œ์Šค์ฒ˜์— ๋Œ€ํ•œ ๋Œ€์•ˆ ์ œ๊ณต

โ€ข ํ™”๋ฉด ๋ฐฉํ–ฅ ์ง€์›
์„ธ๋กœ/๊ฐ€๋กœ ๋ชจ๋“œ ๋ชจ๋‘ ์ง€์›

โ€ข ๋ชจ๋ฐ”์ผ ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์ตœ์ ํ™”
VoiceOver(iOS), TalkBack(Android) ํ…Œ์ŠคํŠธ ํ•„์ˆ˜

/* ํ„ฐ์น˜ ํƒ€๊ฒŸ ํฌ๊ธฐ ๋ณด์žฅ */
button,
a,
input[type="checkbox"],
input[type="radio"] {
    min-width: 44px;
    min-height: 44px;
    /* ๋˜๋Š” padding์œผ๋กœ ํฌ๊ธฐ ํ™•๋ณด */
}

/* ํ„ฐ์น˜ ์˜์—ญ ํ™•์žฅ (์‹œ๊ฐ์  ํฌ๊ธฐ๋Š” ์œ ์ง€) */
.small-icon {
    position: relative;
}

.small-icon::after {
    content: '';
    position: absolute;
    top: -12px;
    left: -12px;
    right: -12px;
    bottom: -12px;
}

/* ์ œ์Šค์ฒ˜ ๋Œ€์•ˆ ์ œ๊ณต */
@media (hover: none) and (pointer: coarse) {
    /* ํ„ฐ์น˜ ๋””๋ฐ”์ด์Šค ์ „์šฉ ์Šคํƒ€์ผ */
    .swipeable-item {
        /* ์Šค์™€์ดํ”„ ๋Œ€์‹  ๋ฒ„ํŠผ ํ‘œ์‹œ */
    }
}

๐ŸŒ WCAG 3.0์˜ ๋ณ€ํ™”

WCAG 3.0 (W3C Accessibility Guidelines, ์ด์ „ ๋ช…์นญ: Silver)์ด ๊ฐœ๋ฐœ ์ค‘์ด์•ผ. ์ฃผ์š” ๋ณ€ํ™”๋ฅผ ์‚ดํŽด๋ณด์ž! ๐Ÿ†•

ํ•ญ๋ชฉ WCAG 2.x WCAG 3.0
์ค€์ˆ˜ ๋ ˆ๋ฒจ A, AA, AAA (3๋‹จ๊ณ„) Bronze, Silver, Gold (์ ์ˆ˜ ๊ธฐ๋ฐ˜)
ํ‰๊ฐ€ ๋ฐฉ์‹ Pass/Fail (ํ†ต๊ณผ/์‹คํŒจ) ์ ์ˆ˜ ์‹œ์Šคํ…œ (0-100)
์ ์šฉ ๋ฒ”์œ„ ์›น ์ฝ˜ํ…์ธ  ์ค‘์‹ฌ ์›น, ๋ชจ๋ฐ”์ผ, IoT, AR/VR ๋“ฑ ๋ชจ๋“  ๋””์ง€ํ„ธ ์ œํ’ˆ
ํ…Œ์ŠคํŠธ ๊ธฐ์ˆ ์  ํ…Œ์ŠคํŠธ ์ค‘์‹ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ…Œ์ŠคํŠธ ํฌํ•จ
์–ธ์–ด ๊ธฐ์ˆ ์  ์šฉ์–ด ํ‰์ดํ•œ ์–ธ์–ด (Plain Language)
๐Ÿ”ฎ WCAG 3.0์˜ ์ฃผ์š” ํŠน์ง•

1. ๋” ํฌ๊ด„์ ์ธ ๋ฒ”์œ„
์›น๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋ฐ”์ผ ์•ฑ, ๊ฐ€์ƒํ˜„์‹ค, ์ฆ๊ฐ•ํ˜„์‹ค, IoT ๊ธฐ๊ธฐ๊นŒ์ง€ ํฌํ•จํ•ด.

2. ์‚ฌ์šฉ์ž ์ค‘์‹ฌ ํ‰๊ฐ€
์‹ค์ œ ์žฅ์• ์ธ ์‚ฌ์šฉ์ž์˜ ๊ฒฝํ—˜์„ ๋” ์ค‘์š”ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด.

3. ์œ ์—ฐํ•œ ์ค€์ˆ˜ ๋ชจ๋ธ
๋ชจ๋“  ๊ธฐ์ค€์„ 100% ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•ด๋„ ์ „์ฒด์ ์ธ ์ ‘๊ทผ์„ฑ ์ˆ˜์ค€์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์–ด.

4. ๋” ๋ช…ํ™•ํ•œ ๊ฐ€์ด๋“œ
๊ฐœ๋ฐœ์ž, ๋””์ž์ด๋„ˆ, ์ฝ˜ํ…์ธ  ์ œ์ž‘์ž ๋“ฑ ์—ญํ• ๋ณ„๋กœ ๋งž์ถคํ™”๋œ ๊ฐ€์ด๋“œ๋ฅผ ์ œ๊ณตํ•ด.

๐ŸŽจ ํฌ์šฉ์  ๋””์ž์ธ(Inclusive Design)

์›น ์ ‘๊ทผ์„ฑ์„ ๋„˜์–ด์„œ ํฌ์šฉ์  ๋””์ž์ธ์ด ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ์–ด. ์ด๊ฑด ๋‹จ์ˆœํžˆ ์žฅ์• ์ธ๋งŒ์„ ์œ„ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ๋‹ค์–‘์„ฑ์„ ์กด์ค‘ํ•˜๋Š” ๋””์ž์ธ์ด์•ผ. ๐ŸŒˆ

ํฌ์šฉ์  ๋””์ž์ธ์˜ ์›์น™

1. ๋‹ค์–‘์„ฑ ์ธ์ •
โ€ข ์˜๊ตฌ์ , ์ผ์‹œ์ , ์ƒํ™ฉ์  ์žฅ์•  ๋ชจ๋‘ ๊ณ ๋ ค
โ€ข ๋ฌธํ™”์ , ์–ธ์–ด์  ๋‹ค์–‘์„ฑ ์กด์ค‘
โ€ข ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ์™€ ํ™˜๊ฒฝ ์ง€์›

2. ์œ ์—ฐ์„ฑ ์ œ๊ณต
โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์—๊ฒŒ ๋งž๊ฒŒ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ฐ€๋Šฅ
โ€ข ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ™์€ ๋ชฉํ‘œ ๋‹ฌ์„ฑ ๊ฐ€๋Šฅ
โ€ข ๊ฐœ์ธ์˜ ์„ ํ˜ธ๋„ ์กด์ค‘

3. ๋‹จ์ˆœํ•˜๊ณ  ์ง๊ด€์ 
โ€ข ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ ์ œ๊ฑฐ
โ€ข ๋ช…ํ™•ํ•œ ์ •๋ณด ๊ตฌ์กฐ
โ€ข ์ผ๊ด€๋œ ํŒจํ„ด ์‚ฌ์šฉ

4. ์ธ์ง€ ๋ถ€ํ•˜ ์ตœ์†Œํ™”
โ€ข ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…์— ์ง‘์ค‘
โ€ข ๋ช…ํ™•ํ•œ ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต
โ€ข ์˜ค๋ฅ˜ ๋ฐฉ์ง€์™€ ์‰ฌ์šด ๋ณต๊ตฌ

๐ŸŽ“ ํ•™์Šต ๋ฆฌ์†Œ์Šค์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ

์›น ์ ‘๊ทผ์„ฑ์„ ๊ณ„์† ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ์œ ์šฉํ•œ ๋ฆฌ์†Œ์Šค๋“ค์„ ์†Œ๊ฐœํ• ๊ฒŒ! ๐Ÿ“š

๐Ÿ“– ๊ณต์‹ ๋ฌธ์„œ์™€ ๊ฐ€์ด๋“œ

๊ตญ์ œ ํ‘œ์ค€
โ€ข WCAG 2.1: w3.org/WAI/WCAG21/quickref
โ€ข WAI-ARIA: w3.org/WAI/ARIA
โ€ข WCAG 3.0 Draft: w3.org/TR/wcag-3.0

ํ•œ๊ตญ ํ‘œ์ค€
โ€ข KWCAG 2.2: www.wah.or.kr
โ€ข ํ•œ๊ตญ์›น์ ‘๊ทผ์„ฑ์ธ์ฆํ‰๊ฐ€์›: www.wa.or.kr
โ€ข ์›น์ ‘๊ทผ์„ฑ์—ฐ๊ตฌ์†Œ: www.accessibility.or.kr

๐Ÿ› ๏ธ ์œ ์šฉํ•œ ๋„๊ตฌ ๋ชจ์Œ

์นดํ…Œ๊ณ ๋ฆฌ ๋„๊ตฌ ์šฉ๋„
์ž๋™ํ™” ํ…Œ์ŠคํŠธ axe DevTools
WAVE
Lighthouse
Pa11y
์ž๋™ ์ ‘๊ทผ์„ฑ ๊ฒ€์‚ฌ
์‹œ๊ฐ์  ํ”ผ๋“œ๋ฐฑ
์ข…ํ•ฉ ๊ฐ์‚ฌ
CI/CD ํ†ตํ•ฉ
์ƒ‰์ƒ ๋„๊ตฌ WebAIM Contrast Checker
Colorblind Web Page Filter
Stark
๋Œ€๋น„ ํ™•์ธ
์ƒ‰๋งน ์‹œ๋ฎฌ๋ ˆ์ด์…˜
๋””์ž์ธ ๋„๊ตฌ ํ†ตํ•ฉ
์Šคํฌ๋ฆฐ ๋ฆฌ๋” NVDA
JAWS
VoiceOver
TalkBack
Windows (๋ฌด๋ฃŒ)
Windows (์œ ๋ฃŒ)
Mac/iOS
Android
๊ฐœ๋ฐœ ๋„๊ตฌ eslint-plugin-jsx-a11y
react-axe
cypress-axe
๋ฆฐํŒ…
React ํ…Œ์ŠคํŠธ
E2E ํ…Œ์ŠคํŠธ

๐Ÿ‘ฅ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๋„คํŠธ์›Œํฌ

๐ŸŒ ์˜จ๋ผ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ
โ€ข WebAIM Discussion List: ํ™œ๋ฐœํ•œ ์ด๋ฉ”์ผ ๋ฆฌ์ŠคํŠธ
โ€ข A11y Slack: web-a11y.slack.com
โ€ข Reddit r/accessibility: ๋‹ค์–‘ํ•œ ํ† ๋ก 
โ€ข Twitter #a11y: ์ตœ์‹  ๋‰ด์Šค์™€ ํŒ

๐Ÿ‡ฐ๐Ÿ‡ท ํ•œ๊ตญ ์ปค๋ฎค๋‹ˆํ‹ฐ
โ€ข ํ•œ๊ตญ์›น์ ‘๊ทผ์„ฑ๊ทธ๋ฃน: ์ •๊ธฐ ์„ธ๋ฏธ๋‚˜์™€ ์›Œํฌ์ƒต
โ€ข NAVER Accessibility: ๋„ค์ด๋ฒ„์˜ ์ ‘๊ทผ์„ฑ ๋ธ”๋กœ๊ทธ
โ€ข Kakao Accessibility: ์นด์นด์˜ค์˜ ์ ‘๊ทผ์„ฑ ๊ฐ€์ด๋“œ

๐Ÿ“š ์ถ”์ฒœ ๋„์„œ

๐Ÿ“– ํ•„๋…์„œ

1. "Inclusive Design Patterns" by Heydon Pickering
์‹ค์šฉ์ ์ธ ์ ‘๊ทผ์„ฑ ํŒจํ„ด๊ณผ ์ฝ”๋“œ ์˜ˆ์ œ

2. "A Web for Everyone" by Sarah Horton & Whitney Quesenbery
ํฌ์šฉ์  ๋””์ž์ธ์˜ ๊ธฐ์ดˆ

3. "Accessibility for Everyone" by Laura Kalbag
์ดˆ๋ณด์ž๋ฅผ ์œ„ํ•œ ์นœ์ ˆํ•œ ๊ฐ€์ด๋“œ

4. "Form Design Patterns" by Adam Silver
์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํผ ๋””์ž์ธ์˜ ๋ชจ๋“  ๊ฒƒ

๐ŸŽฅ ์˜จ๋ผ์ธ ๊ฐ•์ขŒ

๋ฌด๋ฃŒ ๊ฐ•์ขŒ
โ€ข Web Accessibility by Google (Udacity): ๋ฌด๋ฃŒ, ์˜์–ด
โ€ข Introduction to Web Accessibility (W3Cx): edX, ๋ฌด๋ฃŒ
โ€ข Digital Accessibility (University of Southampton): FutureLearn

์œ ๋ฃŒ ๊ฐ•์ขŒ
โ€ข Accessibility in JavaScript Applications (Frontend Masters)
โ€ข Web Accessibility (Pluralsight)
โ€ข Practical Accessibility (Egghead.io)

๐Ÿ’ผ ์žฌ๋Šฅ๋„ท์—์„œ ์›น ์ ‘๊ทผ์„ฑ ์ „๋ฌธ๊ฐ€ ์ฐพ๊ธฐ

์›น ์ ‘๊ทผ์„ฑ ๊ตฌํ˜„์ด ์–ด๋ ต๊ฒŒ ๋А๊ปด์ง„๋‹ค๋ฉด? ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด! ๐Ÿค

์žฌ๋Šฅ๋„ท(jaenung.net)์€ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ์ „๋ฌธ๊ฐ€๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š” ์žฌ๋Šฅ ๊ณต์œ  ํ”Œ๋žซํผ์ด์•ผ. ์›น ์ ‘๊ทผ์„ฑ ์ปจ์„คํŒ…, ์ฝ”๋“œ ๋ฆฌ๋ทฐ, ๊ต์œก ๋“ฑ ํ•„์š”ํ•œ ์„œ๋น„์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์ง€.

์žฌ๋Šฅ๋„ท์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค:
โ€ข ์›น ์ ‘๊ทผ์„ฑ ์ง„๋‹จ ๋ฐ ๊ฐœ์„  ์ปจ์„คํŒ…
โ€ข WCAG/KWCAG ์ค€์ˆ˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ
โ€ข ์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ ๋ฐ ์ธ์ฆ ์ค€๋น„ ์ง€์›
โ€ข ํŒ€ ๊ต์œก ๋ฐ ์›Œํฌ์ƒต
โ€ข ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ

ํ˜ผ์ž ๊ณ ๋ฏผํ•˜์ง€ ๋ง๊ณ , ์ „๋ฌธ๊ฐ€์˜ ๋„์›€์„ ๋ฐ›์•„ ๋” ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ์ ‘๊ทผ์„ฑ์„ ๊ตฌํ˜„ํ•ด๋ณด์ž! ๐Ÿ’ช


๐ŸŽฏ ๋งˆ๋ฌด๋ฆฌ: ์›น ์ ‘๊ทผ์„ฑ์€ ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜!

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์›น ์ ‘๊ทผ์„ฑ๊ณผ WCAG ๊ฐ€์ด๋“œ๋ผ์ธ์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ์•Œ์•„๋ดค์–ด! ๊ธด ์—ฌ์ •์ด์—ˆ์ง€? ๐Ÿ˜Š

ํ•ต์‹ฌ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ:

๐ŸŒŸ ๊ธฐ์–ตํ•ด์•ผ ํ•  ํ•ต์‹ฌ ํฌ์ธํŠธ

1. ์›น ์ ‘๊ทผ์„ฑ์€ ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๊ฒƒ
์žฅ์• ์ธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋…ธ์ธ, ์ผ์‹œ์  ์žฅ์• ๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ, ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ํ˜œํƒ์„ ์ค˜.

2. POUR ์›์น™์„ ๊ธฐ์–ตํ•˜์ž
โ€ข Perceivable (์ธ์‹ ๊ฐ€๋Šฅ)
โ€ข Operable (์šด์šฉ ๊ฐ€๋Šฅ)
โ€ข Understandable (์ดํ•ด ๊ฐ€๋Šฅ)
โ€ข Robust (๊ฒฌ๊ณ ํ•จ)

3. ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ณ ๋ คํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด
๋‚˜์ค‘์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฒ˜์Œ๋ถ€ํ„ฐ ์ ‘๊ทผ์„ฑ์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ํšจ์œจ์ ์ด์•ผ.

4. ์ž๋™ํ™” ๋„๊ตฌ + ์ˆ˜๋™ ํ…Œ์ŠคํŠธ
์ž๋™ํ™” ๋„๊ตฌ๋Š” ์‹œ์ž‘์ ์ผ ๋ฟ, ์‹ค์ œ ์‚ฌ์šฉ์ž ๊ด€์ ์˜ ์ˆ˜๋™ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์ˆ˜์•ผ.

5. ์ง€์†์ ์ธ ํ•™์Šต๊ณผ ๊ฐœ์„ 
์›น ์ ‘๊ทผ์„ฑ์€ ํ•œ ๋ฒˆ ํ•˜๊ณ  ๋๋‚˜๋Š” ๊ฒŒ ์•„๋‹ˆ์•ผ. ๊ณ„์† ๋ฐฐ์šฐ๊ณ  ๊ฐœ์„ ํ•ด์•ผ ํ•ด.

6. ๋ฒ•์  ์˜๋ฌด์ด์ž ์œค๋ฆฌ์  ์ฑ…์ž„
ํ•œ๊ตญ์—์„œ๋Š” ๋ฒ•์œผ๋กœ ์˜๋ฌดํ™”๋˜์–ด ์žˆ๊ณ , ๋ฌด์—‡๋ณด๋‹ค ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ๊ถŒ๋ฆฌ๋ฅผ ์กด์ค‘ํ•˜๋Š” ์ผ์ด์•ผ.

๐Ÿš€ ์ง€๊ธˆ ๋ฐ”๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค

์˜ค๋Š˜๋ถ€ํ„ฐ ์‹ค์ฒœํ•˜๊ธฐ:
โ–ก ๋ชจ๋“  ์ด๋ฏธ์ง€์— ์˜๋ฏธ ์žˆ๋Š” alt ํ…์ŠคํŠธ ์ถ”๊ฐ€
โ–ก ์‹œ๋งจํ‹ฑ HTML ํƒœ๊ทธ ์‚ฌ์šฉํ•˜๊ธฐ
โ–ก ํ‚ค๋ณด๋“œ๋งŒ์œผ๋กœ ์‚ฌ์ดํŠธ ํƒ์ƒ‰ํ•ด๋ณด๊ธฐ
โ–ก ์ƒ‰์ƒ ๋Œ€๋น„ ์ฒดํฌํ•˜๊ธฐ
โ–ก ์ž๋™ํ™” ๋„๊ตฌ๋กœ ์‚ฌ์ดํŠธ ๊ฒ€์‚ฌํ•˜๊ธฐ

์ด๋ฒˆ ์ฃผ ๋ชฉํ‘œ:
โ–ก ์Šคํฌ๋ฆฐ ๋ฆฌ๋” ์„ค์น˜ํ•˜๊ณ  ์‚ฌ์šฉํ•ด๋ณด๊ธฐ
โ–ก WCAG 2.1 ํ€ต ๋ ˆํผ๋Ÿฐ์Šค ๋ถ๋งˆํฌํ•˜๊ธฐ
โ–ก ํŒ€์›๋“ค๊ณผ ์ ‘๊ทผ์„ฑ ์ค‘์š”์„ฑ ๊ณต์œ ํ•˜๊ธฐ
โ–ก ํ•œ ํŽ˜์ด์ง€๋ผ๋„ ์™„๋ฒฝํ•˜๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ

์ด๋ฒˆ ๋‹ฌ ๋ชฉํ‘œ:
โ–ก ์ „์ฒด ์‚ฌ์ดํŠธ ์ ‘๊ทผ์„ฑ ๊ฐ์‚ฌ ์‹ค์‹œ
โ–ก ๊ฐœ์„  ๊ณ„ํš ์ˆ˜๋ฆฝ
โ–ก ์ ‘๊ทผ์„ฑ ๊ฐ€์ด๋“œ๋ผ์ธ ๋ฌธ์„œํ™”
โ–ก CI/CD์— ์ž๋™ํ™” ํ…Œ์ŠคํŠธ ํ†ตํ•ฉ

์›น ์ ‘๊ทผ์„ฑ์€ ์–ด๋ ต๊ณ  ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ•œ ๊ฑธ์Œ์”ฉ ๋‚˜์•„๊ฐ€๋‹ค ๋ณด๋ฉด ์–ด๋А์ƒˆ ์ž์—ฐ์Šค๋Ÿฌ์šด ์Šต๊ด€์ด ๋  ๊ฑฐ์•ผ. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณผ์ •์—์„œ ๋‹น์‹ ์€ ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด ์žˆ์„ ๊ฑฐ๊ณ ! ๐Ÿ’ปโœจ

๋ชจ๋“  ์‚ฌ๋žŒ์ด ์›น์„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋‚ ๊นŒ์ง€, ์šฐ๋ฆฌ ํ•จ๊ป˜ ๋…ธ๋ ฅํ•˜์ž! ๐ŸŒโค๏ธ

๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๊ฑฐ๋‚˜ ๋„์›€์ด ํ•„์š”ํ•˜๋‹ค๋ฉด, ์žฌ๋Šฅ๋„ท์—์„œ ์ „๋ฌธ๊ฐ€๋ฅผ ์ฐพ์•„๋ณด๊ฑฐ๋‚˜ ์˜จ๋ผ์ธ ์ปค๋ฎค๋‹ˆํ‹ฐ์— ์งˆ๋ฌธํ•ด๋ด. ์›น ์ ‘๊ทผ์„ฑ ์ปค๋ฎค๋‹ˆํ‹ฐ๋Š” ๋งค์šฐ ์นœ์ ˆํ•˜๊ณ  ๋„์›€์„ ์ฃผ๋ ค๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์•„! ๐Ÿค—

์ž, ์ด์ œ ๋‹น์‹ ์˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ชจ๋‘๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํฌ์šฉ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๋งŒ๋“ค์–ด๋ณด์ž! ํ™”์ดํŒ…! ๐Ÿš€

๐ŸŒˆ Remember:
"The power of the Web is in its universality.
Access by everyone regardless of disability is an essential aspect."
- Tim Berners-Lee, W3C Director and inventor of the World Wide Web

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0