Skip to content
Sehwan edited this page Apr 24, 2025 · 14 revisions

μ›Ή μ ‘κ·Όμ„±

이 μœ„ν‚€ λ¬Έμ„œλŠ” "ν•œκ΅­ν˜• μ›Ή μ½˜ν…μΈ  μ ‘κ·Όμ„± μ§€μΉ¨ 2.2"λ₯Ό 기반으둜 Daleui λ””μžμΈ μ‹œμŠ€ν…œμ„ μ„€κ³„ν•˜κ³  κ²€ν† ν•  λ•Œ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” μ ‘κ·Όμ„± μ²΄ν¬λ¦¬μŠ€νŠΈμž…λ‹ˆλ‹€. λͺ¨λ“  UI μ»΄ν¬λ„ŒνŠΈ, μ½˜ν…μΈ , μƒν˜Έμž‘μš© μš”μ†Œκ°€ μž₯애인 및 λΉ„μž₯애인 λͺ¨λ‘μ—κ²Œ λ™λ“±ν•œ 접근성을 μ œκ³΅ν•˜λ„λ‘ 보μž₯ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

1. μΈμ‹μ˜ μš©μ΄μ„± (Perceivable)

μ‚¬μš©μžκ°€ μ½˜ν…μΈ λ₯Ό 인지할 수 μžˆλ„λ‘ μ‹œκ°, 청각, 촉각 λ“± λ‹€μ–‘ν•œ 감각을 κ³ λ €ν•œ 섀계.

1.1 ν…μŠ€νŠΈ λŒ€μ²΄ 제곡

  • λͺ¨λ“  λΉ„ν…μŠ€νŠΈ μ½˜ν…μΈ (이미지, μ•„μ΄μ½˜ λ“±)에 μ μ ˆν•œ λŒ€μ²΄ ν…μŠ€νŠΈ(alt text)λ₯Ό μ œκ³΅ν–ˆλŠ”κ°€? 1.1.1 Non-text Content (A)
  • λŒ€μ²΄ ν…μŠ€νŠΈλŠ” μ½˜ν…μΈ μ˜ λͺ©μ κ³Ό κΈ°λŠ₯을 λͺ…ν™•νžˆ μ„€λͺ…ν•˜λŠ”κ°€?

1.2 적응 κ°€λŠ₯μ„±

  • μ½˜ν…μΈ κ°€ μ„ ν˜• ꡬ쑰둜 μ œκ³΅λ˜μ–΄ 슀크린 λ¦¬λ”λ‘œ 이해 κ°€λŠ₯ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆλŠ”κ°€? 1.3.1 Info and Relationships (A)
    • Do: HTML λ§ˆν¬μ—… μˆœμ„œλ₯Ό 논리적 흐름(제λͺ© β†’ λ³Έλ¬Έ β†’ κ΄€λ ¨ 링크 λ“±)에 맞게 μž‘μ„±ν•©λ‹ˆλ‹€. <h1>~<h6>, <p>, <ul>, <ol>, <nav>, <main> λ“± μ‹œλ§¨ν‹± νƒœκ·Έλ₯Ό 적절히 μ‚¬μš©ν•©λ‹ˆλ‹€.
    • Don't: μ‹œκ°μ μΈ λ°°μΉ˜λ§Œμ„ μœ„ν•΄ CSS position: absolute;λ‚˜ floatλ₯Ό λ‚¨μš©ν•˜μ—¬ DOM μˆœμ„œμ™€ μ‹œκ°μ  μˆœμ„œκ°€ μ™„μ „νžˆ λ‹€λ₯΄κ²Œ λ§Œλ“­λ‹ˆλ‹€. (예: μ‹œκ°μ μœΌλ‘œλŠ” 였λ₯Έμͺ½μ— μžˆλŠ” μ‚¬μ΄λ“œλ°”κ°€ DOMμ—μ„œλŠ” 메인 μ½˜ν…μΈ λ³΄λ‹€ λ¨Όμ € λ‚˜μ˜€λŠ” 경우)
  • μ‹œκ°μ  μˆœμ„œμ™€ 논리적 μˆœμ„œκ°€ μΌμΉ˜ν•˜λŠ”κ°€? 1.3.2 Meaningful Sequence (A)
    • Do: λ˜λ„λ‘ μ½˜ν…μΈ μ˜ 논리적 μˆœμ„œ(DOM μˆœμ„œ)κ°€ μ‹œκ°μ  읽기 μˆœμ„œμ™€ μΌμΉ˜ν•˜λ„λ‘ λ§ˆν¬μ—…ν•©λ‹ˆλ‹€. Flexboxλ‚˜ Grid의 order 속성을 μ‚¬μš©ν•  경우, ν‚€λ³΄λ“œ 탐색 μˆœμ„œ(Tab ν‚€)κ°€ μ—¬μ „νžˆ 논리적인지 λ°˜λ“œμ‹œ ν™•μΈν•©λ‹ˆλ‹€.
    • Don't: CSS Gridλ‚˜ Flexbox의 order 속성을 μ‚¬μš©ν•˜μ—¬ ν•­λͺ©λ“€μ˜ μ‹œκ°μ  μˆœμ„œλ₯Ό λ³€κ²½ν–ˆμœΌλ‚˜, ν‚€λ³΄λ“œλ‘œ 탐색할 λ•ŒλŠ” μ›λž˜ DOM μˆœμ„œλŒ€λ‘œ μ΄λ™ν•˜μ—¬ μ‚¬μš©μžκ°€ ν˜Όλž€μ„ κ²ͺ게 λ§Œλ“­λ‹ˆλ‹€. (예: μ‹œκ°μ μœΌλ‘œ 1, 2, 3 λ²„νŠΌμ΄ μžˆμ§€λ§Œ Tab ν‚€λ‘œλŠ” 3, 1, 2 μˆœμ„œλ‘œ ν¬μ»€μŠ€κ°€ μ΄λ™ν•˜λŠ” 경우)
  • λ°˜μ‘ν˜• λ””μžμΈμ—μ„œ μ½˜ν…μΈ κ°€ 손싀 없이 λͺ¨λ“  λ””λ°”μ΄μŠ€μ—μ„œ ν‘œμ‹œλ˜λŠ”κ°€? 1.3.4 Orientation (AA)
  • μž…λ ₯ ν•„λ“œμ˜ λͺ©μ μ„ λͺ…μ‹œν–ˆλŠ”κ°€? 1.3.5 Identify Input Purpose (AA)
    • Do: μ‚¬μš©μž 정보λ₯Ό μš”κ΅¬ν•˜λŠ” μž…λ ₯ ν•„λ“œ(이름, 이메일, μ£Όμ†Œ, μ „ν™”λ²ˆν˜Έ λ“±)에 autocomplete 속성을 μ μ ˆν•œ κ°’κ³Ό ν•¨κ»˜ μ‚¬μš©ν•©λ‹ˆλ‹€. (예: <input type="email" autocomplete="email" name="user_email">)
    • Don't: 이름, 이메일, μ£Όμ†Œ λ“± μžλ™ μ™„μ„± κΈ°λŠ₯이 μœ μš©ν•  수 μžˆλŠ” ν•„λ“œμ— autocomplete 속성을 μ œκ³΅ν•˜μ§€ μ•Šκ±°λ‚˜ autocomplete="off"λ₯Ό λΆˆν•„μš”ν•˜κ²Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

1.3 ꡬ별 κ°€λŠ₯μ„±

  • ν…μŠ€νŠΈμ™€ λ°°κ²½ κ°„ λͺ…도 λŒ€λΉ„κ°€ μ΅œμ†Œ 4.5:1(A) λ˜λŠ” 3:1(AA) 이상인가? 1.4.3 Contrast (Minimum) (AA)
  • ν…μŠ€νŠΈ 크기λ₯Ό 200%κΉŒμ§€ ν™•λŒ€ν•΄λ„ μ½˜ν…μΈ κ°€ μ†μ‹€λ˜μ§€ μ•ŠλŠ”κ°€? 1.4.4 Resize Text (AA)
  • μ΄λ―Έμ§€λ‘œ 된 ν…μŠ€νŠΈ λŒ€μ‹  μ‹€μ œ ν…μŠ€νŠΈλ₯Ό μ‚¬μš©ν–ˆλŠ”κ°€? 1.4.5 Images of Text (AA)
  • μƒ‰μƒλ§ŒμœΌλ‘œ 정보λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šμ•˜λŠ”κ°€? 1.4.1 Use of Color (A)
    • Do: 였λ₯˜κ°€ λ°œμƒν•œ μž…λ ₯ ν•„λ“œλ₯Ό 빨간색 ν…Œλ‘λ¦¬λ‘œ ν‘œμ‹œν•¨κ³Ό λ™μ‹œμ—, 였λ₯˜ μ•„μ΄μ½˜(❗)κ³Ό ν•¨κ»˜ "ν•„μˆ˜ μž…λ ₯ ν•­λͺ©μž…λ‹ˆλ‹€." 같은 ν…μŠ€νŠΈ λ©”μ‹œμ§€λ₯Ό ν•¨κ»˜ μ œκ³΅ν•©λ‹ˆλ‹€. 링크 ν…μŠ€νŠΈμ—λŠ” 색상과 ν•¨κ»˜ 밑쀄을 μ‚¬μš©ν•©λ‹ˆλ‹€.
    • Don't: ν•„μˆ˜ μž…λ ₯ ν•„λ“œμž„μ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ λ ˆμ΄λΈ” ν…μŠ€νŠΈ μƒ‰μƒλ§Œ λΉ¨κ°„μƒ‰μœΌλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€. 였λ₯˜ μƒνƒœλ₯Ό μž…λ ₯ ν•„λ“œ ν…Œλ‘λ¦¬ μƒ‰μƒλ§Œ λΉ¨κ°„μƒ‰μœΌλ‘œ λ°”κΎΈμ–΄ ν‘œμ‹œν•©λ‹ˆλ‹€.

2. 운용의 μš©μ΄μ„± (Operable)

μ‚¬μš©μžκ°€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‰½κ²Œ μ‘°μž‘ν•  수 μžˆλ„λ‘ 섀계.

2.1 ν‚€λ³΄λ“œ μ ‘κ·Όμ„±

  • λͺ¨λ“  κΈ°λŠ₯이 ν‚€λ³΄λ“œλ‘œλ§Œ μ‘°μž‘ κ°€λŠ₯ν•˜λ„λ‘ μ„€κ³„λ˜μ—ˆλŠ”κ°€? 2.1.1 Keyboard (A)
    • Do: μ»€μŠ€ν…€ λ“œλ‘­λ‹€μš΄ 메뉴λ₯Ό λ§Œλ“€ λ•Œ, λ²„νŠΌμ€ Tab으둜 포컀슀 κ°€λŠ₯ν•˜κ³  Enterλ‚˜ Space둜 μ—΄ 수 있으며, 메뉴 ν•­λͺ©λ“€μ€ ν™”μ‚΄ν‘œ ν‚€(↑, ↓)둜 μ΄λ™ν•˜κ³  Enter둜 선택할 수 μžˆλ„λ‘ κ΅¬ν˜„ν•©λ‹ˆλ‹€. μŠ¬λΌμ΄λ”λŠ” ν™”μ‚΄ν‘œ ν‚€(←, β†’)둜 값을 μ‘°μ ˆν•  수 있게 ν•©λ‹ˆλ‹€. λͺ¨λ“  μΈν„°λž™ν‹°λΈŒ μš”μ†Œμ— tabindex="0" (ν•„μš”μ‹œ) λ˜λŠ” λ„€μ΄ν‹°λΈŒ μš”μ†Œ(<button>, <a>)λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
    • Don't: 마우슀 클릭으둜만 μ—΄κ³  닫을 수 μžˆλŠ” μ»€μŠ€ν…€ λ“œλ‘­λ‹€μš΄ 메뉴λ₯Ό λ§Œλ“­λ‹ˆλ‹€. Drag & Drop μΈν„°νŽ˜μ΄μŠ€μ— ν‚€λ³΄λ“œ λŒ€μ²΄ μˆ˜λ‹¨(예: 'μœ„λ‘œ 이동' λ²„νŠΌ)을 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • ν‚€λ³΄λ“œ ν¬μ»€μŠ€κ°€ κ°‡νžˆλŠ” 상황(Keyboard Trap)이 μ—†λŠ”κ°€? 2.1.2 No Keyboard Trap (A)
  • ν‚€λ³΄λ“œ 단좕킀가 μ‚¬μš©μž λ§žμΆ€ν˜•μœΌλ‘œ μ‘°μ • κ°€λŠ₯ν•˜κ±°λ‚˜ λΉ„ν™œμ„±ν™” κ°€λŠ₯ν•˜λ„λ‘ ν–ˆλŠ”κ°€? 2.1.4 Character Key Shortcuts (A)

2.2 μΆ©λΆ„ν•œ μ‹œκ°„ 제곡

  • μ‹œκ°„ μ œν•œμ΄ μžˆλŠ” μ½˜ν…μΈ μ— λŒ€ν•΄ μ‚¬μš©μžμ—κ²Œ μΆ©λΆ„ν•œ μ‹œκ°„μ„ μ œκ³΅ν–ˆλŠ”κ°€? 2.2.1 Timing Adjustable (A)
  • μ›€μ§μ΄λŠ” μ½˜ν…μΈ λ₯Ό μΌμ‹œ μ •μ§€, 쀑지, 숨길 수 μžˆλŠ” μˆ˜λ‹¨μ„ μ œκ³΅ν–ˆλŠ”κ°€? 2.2.2 Pause, Stop, Hide (A)
  • 쀑단(Interruptions)이 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ ν–ˆκ±°λ‚˜, μ‚¬μš©μž λ™μ˜ 없이 μ€‘λ‹¨λ˜μ§€ μ•ŠλŠ”κ°€? 2.2.4 Interruptions (AAA) (WCAG 2.2)
  • νƒ€μž„μ•„μ›ƒμœΌλ‘œ 데이터 손싀이 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ κ²½κ³ λ₯Ό μ œκ³΅ν–ˆλŠ”κ°€? 2.2.6 Timeouts (AAA) (WCAG 2.2)

2.3 κ΄‘κ³Όλ―Όμ„± λ°œμž‘ 유발 λ°©μ§€

  • 1μ΄ˆμ— 3회 이상 κΉœλΉ‘μ΄λŠ” μ½˜ν…μΈ κ°€ μ—†κ±°λ‚˜, μž„κ³„κ°’ μ΄ν•˜λ‘œ μ œν•œν–ˆλŠ”κ°€? 2.3.1 Three Flashes or Below Threshold (A)
  • μƒν˜Έμž‘μš©μœΌλ‘œ λ°œμƒν•˜λŠ” μ• λ‹ˆλ©”μ΄μ…˜μ„ μ‚¬μš©μžκ°€ λΉ„ν™œμ„±ν™”ν•  수 μžˆλŠ”κ°€? 2.3.3 Animation from Interactions (AAA) (WCAG 2.2)

2.4 탐색 κ°€λŠ₯μ„±

  • 반볡 μ½˜ν…μΈ λ₯Ό κ±΄λ„ˆλ›Έ 수 μžˆλŠ” "Skip Navigation" 링크λ₯Ό μ œκ³΅ν–ˆλŠ”κ°€? 2.4.1 Bypass Blocks (A)
  • νŽ˜μ΄μ§€ 제λͺ©μ΄ κ³ μœ ν•˜κ³  μ„€λͺ…적인가? 2.4.2 Page Titled (A)
    • Do: νŽ˜μ΄μ§€μ˜ μ£Όμš” λ‚΄μš©μ„ λͺ…ν™•νžˆ μ•Œ 수 μžˆλŠ” 제λͺ©μ„ μ œκ³΅ν•©λ‹ˆλ‹€. (예: <title>μž₯λ°”κ΅¬λ‹ˆ - Daleui μŠ€ν† μ–΄</title>, <title>μ›Ή μ ‘κ·Όμ„± 체크리슀트 | Daleui λ””μžμΈ μ‹œμŠ€ν…œ</title>)
    • Don't: λͺ¨λ“  νŽ˜μ΄μ§€μ˜ 제λͺ©μ„ <title>Daleui</title> λ˜λŠ” <title>메인 νŽ˜μ΄μ§€</title>와 같이 λ™μΌν•˜κ±°λ‚˜ λͺ¨ν˜Έν•˜κ²Œ μ„€μ •ν•©λ‹ˆλ‹€.
  • 포컀슀 μˆœμ„œκ°€ 논리적이고 직관적인가? 2.4.3 Focus Order (A)
    • Do: Tab ν‚€λ₯Ό λˆŒλ €μ„ λ•Œ, νŽ˜μ΄μ§€μ˜ μ‹œκ°μ  흐름(보톡 μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½, μœ„μ—μ„œ μ•„λž˜)을 따라 예츑 κ°€λŠ₯ν•˜κ²Œ ν¬μ»€μŠ€κ°€ μ΄λ™ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. λͺ¨λ‹¬ 창을 λ‹«μœΌλ©΄, λͺ¨λ‹¬μ„ μ—΄μ—ˆλ˜ λ²„νŠΌμ΄λ‚˜ 링크둜 ν¬μ»€μŠ€κ°€ λŒμ•„κ°€λ„λ‘ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
    • Don't: Tab ν‚€λ₯Ό λˆ„λ₯Ό λ•Œ ν¬μ»€μŠ€κ°€ νŽ˜μ΄μ§€ 상단 헀더 β†’ λ³Έλ¬Έ 쀑간 β†’ ν‘Έν„° β†’ λ‹€μ‹œ ν—€λ”μ˜ λ‹€λ₯Έ μš”μ†Œ λ“±μœΌλ‘œ 예츑 λΆˆκ°€λŠ₯ν•˜κ²Œ μ΄λ™ν•©λ‹ˆλ‹€. λͺ¨λ‹¬ 창을 λ‹«μ•˜λŠ”λ° ν¬μ»€μŠ€κ°€ νŽ˜μ΄μ§€μ˜ 맨 처음으둜 μ΄λ™ν•˜κ±°λ‚˜ μ‚¬λΌμ§‘λ‹ˆλ‹€.
  • 링크의 λͺ©μ μ΄ λ¬Έλ§₯μ—μ„œ λͺ…ν™•ν•œκ°€? 2.4.4 Link Purpose (In Context) (A)
  • 닀쀑 탐색 방법(μ‚¬μ΄νŠΈλ§΅, 검색 λ“±)을 μ œκ³΅ν–ˆλŠ”κ°€? 2.4.5 Multiple Ways (AA)
  • 제λͺ©κ³Ό λ ˆμ΄λΈ”μ΄ λͺ…ν™•ν•˜κ³  일관적인가? 2.4.6 Headings and Labels (AA)
    • Do: νŽ˜μ΄μ§€ ꡬ쑰에 맞게 <h1>λΆ€ν„° <h6>κΉŒμ§€ 제λͺ©(Heading) νƒœκ·Έλ₯Ό λ…Όλ¦¬μ μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€. λͺ¨λ“  μž…λ ₯ ν•„λ“œμ—λŠ” λͺ…ν™•ν•œ <label>을 μ œκ³΅ν•˜κ³ , λ²„νŠΌμ—λŠ” "μ €μž₯", "μ·¨μ†Œ", "λ‹€μŒ 단계" λ“± λ™μž‘μ„ λͺ…ν™•νžˆ μ„€λͺ…ν•˜λŠ” ν…μŠ€νŠΈλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ‚¬μ΄νŠΈ μ „μ²΄μ—μ„œ 동일 κΈ°λŠ₯의 λ²„νŠΌμ€ λ™μΌν•œ λ ˆμ΄λΈ”μ„ μœ μ§€ν•©λ‹ˆλ‹€(예: λͺ¨λ“  μ €μž₯ λ²„νŠΌμ€ "μ €μž₯").
    • Don't: μ‹œκ°μ μœΌλ‘œ 제λͺ©μ²˜λŸΌ 보이게 ν•˜κΈ° μœ„ν•΄ <div>에 큰 ν°νŠΈμ™€ ꡡ은 μŠ€νƒ€μΌλ§Œ μ μš©ν•©λ‹ˆλ‹€. λ²„νŠΌμ— "클릭", "μ—¬κΈ°" λ“± λͺ¨ν˜Έν•œ λ ˆμ΄λΈ”μ„ μ‚¬μš©ν•˜κ±°λ‚˜, μ•„μ΄μ½˜λ§Œ μžˆλŠ” λ²„νŠΌμ— 슀크린 리더가 읽을 수 μžˆλŠ” μˆ¨μ€ ν…μŠ€νŠΈλ‚˜ aria-label을 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • ν¬μ»€μŠ€κ°€ μ‹œκ°μ μœΌλ‘œ λ³΄μ΄λŠ”κ°€? 2.4.7 Focus Visible (AA)

2.5 μž…λ ₯ 방식

  • λ³΅μž‘ν•œ 제슀처 λŒ€μ‹  단일 포인터 λ™μž‘μœΌλ‘œ λŒ€μ²΄ κ°€λŠ₯ν•˜λ„λ‘ ν–ˆλŠ”κ°€? 2.5.1 Pointer Gestures (A)
  • 포인터 μž…λ ₯이 μ‹€μˆ˜λ‘œ μ‹€ν–‰λ˜μ§€ μ•Šλ„λ‘ μ·¨μ†Œ κ°€λŠ₯성을 μ œκ³΅ν–ˆλŠ”κ°€? 2.5.2 Pointer Cancellation (A)
    • Do: λ²„νŠΌ 클릭과 같은 μ•‘μ…˜μ€ 'down' 이벀트(mousedown, touchstart)κ°€ μ•„λ‹Œ 'up' 이벀트(mouseup, click, touchend)μ—μ„œ μ‹€ν–‰λ˜λ„λ‘ κ΅¬ν˜„ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ λ²„νŠΌμ„ λˆ„λ₯Έ μƒνƒœμ—μ„œ 포인터λ₯Ό λ²„νŠΌ λ°–μœΌλ‘œ μ΄λ™ν•œ ν›„ λ–Όλ©΄ 아무 λ™μž‘λ„ μΌμ–΄λ‚˜μ§€ μ•Šμ•„μ•Ό ν•©λ‹ˆλ‹€.
    • Don't: λ²„νŠΌμ„ λˆ„λ₯΄λŠ” μˆœκ°„(mousedown, touchstart) λ°”λ‘œ λ™μž‘(예: μ‚­μ œ, 전솑)이 μ‹€ν–‰λ˜λ„λ‘ ν•˜μ—¬, μ‚¬μš©μžκ°€ μ‹€μˆ˜λ‘œ λˆŒλ €λ‹€κ°€ λ–ΌκΈ° 전에 μ·¨μ†Œν•  기회λ₯Ό μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ ˆμ΄λΈ”κ³Ό ν”„λ‘œκ·Έλž˜λ°μ  이름이 μΌμΉ˜ν•˜λŠ”κ°€? 2.5.3 Label in Name (A)
  • λͺ¨μ…˜ 기반 μž…λ ₯(예: 흔듀기)이 ν•„μˆ˜κ°€ μ•„λ‹Œ 선택 사항인가? 2.5.4 Motion Actuation (A)

3. μ΄ν•΄μ˜ μš©μ΄μ„± (Understandable)

μ‚¬μš©μžκ°€ μ½˜ν…μΈ μ™€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‰½κ²Œ 이해할 수 μžˆλ„λ‘ 섀계.

3.1 가독성

  • νŽ˜μ΄μ§€μ˜ κΈ°λ³Έ μ–Έμ–΄κ°€ λͺ…μ‹œλ˜μ–΄ μžˆλŠ”κ°€? 3.1.1 Language of Page (A)
  • νŠΉμ • λΆ€λΆ„μ˜ μ–Έμ–΄κ°€ 변경될 경우 이λ₯Ό λͺ…μ‹œν–ˆλŠ”κ°€? 3.1.2 Language of Parts (AA)

3.2 예츑 κ°€λŠ₯μ„±

  • 포컀슀 λ³€κ²½μ‹œ 예기치 μ•Šμ€ λ³€ν™”κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”κ°€? 3.2.1 On Focus (A)
    • Do: μ‚¬μš©μžκ°€ λΌλ””μ˜€ λ²„νŠΌ κ·Έλ£Ή 쀑 ν•˜λ‚˜λ₯Ό μ„ νƒν•˜κ±°λ‚˜ λ“œλ‘­λ‹€μš΄ λ©”λ‰΄μ—μ„œ μ˜΅μ…˜μ„ μ„ νƒν–ˆμ„ λ•Œ, λ³„λ„μ˜ '적용' λ˜λŠ” 'λ‹€μŒ' λ²„νŠΌμ„ ν΄λ¦­ν•΄μ•Όλ§Œ λ‚΄μš©μ΄ λ³€κ²½λ˜κ±°λ‚˜ νŽ˜μ΄μ§€κ°€ μ΄λ™ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. μž…λ ₯ ν•„λ“œμ— ν¬μ»€μŠ€κ°€ κ°”λ‹€κ³  ν•΄μ„œ μžλ™μœΌλ‘œ νŒμ—… 창이 λœ¨μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.
    • Don't: λ“œλ‘­λ‹€μš΄ λ©”λ‰΄μ—μ„œ νŠΉμ • μ˜΅μ…˜μ„ μ„ νƒν•˜λŠ” μ¦‰μ‹œ νŽ˜μ΄μ§€κ°€ μƒˆλ‘œκ³ μΉ¨λ˜κ±°λ‚˜ λ‹€λ₯Έ νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•©λ‹ˆλ‹€. μ²΄ν¬λ°•μŠ€λ₯Ό μ„ νƒν•˜μžλ§ˆμž λ™μ˜μ„œκ°€ μ œμΆœλ©λ‹ˆλ‹€.
  • μž…λ ₯ μ‹œ λ¬Έλ§₯이 예기치 μ•Šκ²Œ λ³€κ²½λ˜μ§€ μ•ŠλŠ”κ°€? 3.2.2 On Input (A)
  • λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ λͺ¨λ“  νŽ˜μ΄μ§€μ—μ„œ 일관적인가? 3.2.3 Consistent Navigation (AA)
    • Do: 메인 메뉴(κΈ€λ‘œλ²Œ λ‚΄λΉ„κ²Œμ΄μ…˜ λ°”), ν‘Έν„°, 검색창 λ“± λ°˜λ³΅λ˜λŠ” μš”μ†ŒλŠ” λͺ¨λ“  νŽ˜μ΄μ§€μ—μ„œ λ™μΌν•œ μœ„μΉ˜μ™€ ν˜•νƒœλ‘œ μ œκ³΅ν•©λ‹ˆλ‹€. 'μž₯λ°”κ΅¬λ‹ˆ λ‹΄κΈ°' λ²„νŠΌμ€ μ‚¬μ΄νŠΈ λ‚΄ λͺ¨λ“  μƒν’ˆ νŽ˜μ΄μ§€μ—μ„œ λ™μΌν•œ μ•„μ΄μ½˜κ³Ό ν…μŠ€νŠΈ λ ˆμ΄λΈ”μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • Don't: μ–΄λ–€ νŽ˜μ΄μ§€μ—μ„œλŠ” 상단에 있던 μ£Ό 메뉴가 λ‹€λ₯Έ νŽ˜μ΄μ§€μ—μ„œλŠ” μ™Όμͺ½μ— λ‚˜νƒ€λ‚©λ‹ˆλ‹€. 'νŽΈμ§‘' κΈ°λŠ₯을 μ–΄λ–€ κ³³μ—μ„œλŠ” μ—°ν•„ μ•„μ΄μ½˜μœΌλ‘œ, λ‹€λ₯Έ κ³³μ—μ„œλŠ” 'μˆ˜μ •'μ΄λΌλŠ” ν…μŠ€νŠΈ λ²„νŠΌμœΌλ‘œ ν‘œμ‹œν•©λ‹ˆλ‹€.
  • λ™μΌν•œ κΈ°λŠ₯의 μš”μ†Œκ°€ μΌκ΄€λ˜κ²Œ μ‹λ³„λ˜λŠ”κ°€? 3.2.4 Consistent Identification (AA)

3.3 μž…λ ₯ 도움

  • 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 이λ₯Ό λͺ…ν™•νžˆ 식별할 수 μžˆλŠ” λ©”μ‹œμ§€λ₯Ό μ œκ³΅ν–ˆλŠ”κ°€? 3.3.1 Error Identification (A)
    • Do: 폼 제좜 μ‹œ 였λ₯˜κ°€ μžˆλ‹€λ©΄, μ–΄λ–€ ν•„λ“œμ—μ„œ 였λ₯˜κ°€ λ°œμƒν–ˆλŠ”μ§€ ν•΄λ‹Ή ν•„λ“œ μ˜†μ΄λ‚˜ μ•„λž˜μ— λͺ…ν™•ν•œ ν…μŠ€νŠΈ(예: "이메일 μ£Όμ†Œλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.")둜 μ•Œλ €μ£Όκ³ , ν•΄λ‹Ή ν•„λ“œλ‘œ 포컀슀λ₯Ό μ΄λ™μ‹œν‚€κ±°λ‚˜ 였λ₯˜ μš”μ•½ 정보λ₯Ό 상단에 μ œκ³΅ν•©λ‹ˆλ‹€. aria-describedbyλ₯Ό μ‚¬μš©ν•΄ 였λ₯˜ λ©”μ‹œμ§€μ™€ μž…λ ₯ ν•„λ“œλ₯Ό ν”„λ‘œκ·Έλž˜λ°μ μœΌλ‘œ μ—°κ²°ν•©λ‹ˆλ‹€.
    • Don't: 폼 제좜 μ‹€νŒ¨ μ‹œ νŽ˜μ΄μ§€ 상단에 "μž…λ ₯ 였λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€."λΌλŠ” λ©”μ‹œμ§€λ§Œ λ„μš°κ³  μ–΄λŠ ν•„λ“œκ°€ 잘λͺ»λ˜μ—ˆλŠ”μ§€ μ•Œλ €μ£Όμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 였λ₯˜ ν•„λ“œμ— ν…Œλ‘λ¦¬ μƒ‰μƒλ§Œ λ³€κ²½ν•˜κ³  ν…μŠ€νŠΈ μ„€λͺ…을 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μž…λ ₯ ν•„λ“œμ— λ ˆμ΄λΈ” λ˜λŠ” μ§€μ‹œλ¬Έμ„ μ œκ³΅ν–ˆλŠ”κ°€? 3.3.2 Labels or Instructions (A)
  • 였λ₯˜ λ°œμƒ μ‹œ μˆ˜μ • μ œμ•ˆμ„ μ œκ³΅ν–ˆλŠ”κ°€? 3.3.3 Error Suggestion (AA)
  • 법적/금육/데이터 κ΄€λ ¨ 였λ₯˜λ₯Ό λ°©μ§€ν•  μˆ˜λ‹¨(확인 단계 λ“±)을 μ œκ³΅ν–ˆλŠ”κ°€? 3.3.4 Error Prevention (Legal, Financial, Data) (AA)

4. 견고성 (Robust)

λ‹€μ–‘ν•œ 기술과 보쑰 λ„κ΅¬μ—μ„œ μ•ˆμ •μ μœΌλ‘œ μž‘λ™ν•˜λ„λ‘ 섀계.

4.1 ν˜Έν™˜μ„±

  • HTML/CSSκ°€ νŒŒμ‹± 였λ₯˜ 없이 μ˜¬λ°”λ₯΄κ²Œ μž‘μ„±λ˜μ—ˆλŠ”κ°€? 4.1.1 Parsing (A)
  • λͺ¨λ“  μš”μ†Œμ— 이름(Name), μ—­ν• (Role), κ°’(Value)이 ν”„λ‘œκ·Έλž˜λ°μ μœΌλ‘œ μ œκ³΅λ˜μ—ˆλŠ”κ°€? 4.1.2 Name, Role, Value (A)
    • Do: μ»€μŠ€ν…€ μ²΄ν¬λ°•μŠ€λ₯Ό <div>와 CSS둜 λ§Œλ“€μ—ˆλ‹€λ©΄, <div role="checkbox" aria-checked="true" tabindex="0" aria-labelledby="label-id"> 와 같이 ARIA 속성을 μ‚¬μš©ν•˜μ—¬ μ—­ν• (checkbox), μƒνƒœ(checked), 이름(labelledby)을 λͺ…μ‹œν•©λ‹ˆλ‹€. ν‘œμ€€ HTML 컨트둀(<button>, <input type="checkbox"> λ“±)을 μ΅œλŒ€ν•œ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • Don't: μ•„μ΄μ½˜ λ²„νŠΌμ„ <span> νƒœκ·Έμ™€ λ°°κ²½ μ΄λ―Έμ§€λ‘œλ§Œ λ§Œλ“€κ³ , 슀크린 리더가 읽을 수 μžˆλŠ” aria-labelμ΄λ‚˜ μˆ¨μ€ ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•˜μ§€ μ•Šμ•„ μš©λ„λ₯Ό μ•Œ 수 μ—†κ²Œ λ§Œλ“­λ‹ˆλ‹€. μ»€μŠ€ν…€ μ»΄ν¬λ„ŒνŠΈμ— roleμ΄λ‚˜ μƒνƒœλ₯Ό λ‚˜νƒ€λ‚΄λŠ” aria-* 속성을 λˆ„λ½ν•©λ‹ˆλ‹€.
  • μƒνƒœ λ©”μ‹œμ§€κ°€ 보쑰 기술둜 μ „λ‹¬λ˜λ„λ‘ μ„€κ³„λ˜μ—ˆλŠ”κ°€? 4.1.3 Status Messages (AA)
    • Do: ν•­λͺ©μ„ μž₯λ°”κ΅¬λ‹ˆμ— μΆ”κ°€ν–ˆμ„ λ•Œ, "μƒν’ˆμ΄ μž₯λ°”κ΅¬λ‹ˆμ— μΆ”κ°€λ˜μ—ˆμŠ΅λ‹ˆλ‹€." 와 같은 λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚˜λŠ” μ˜μ—­μ„ <div aria-live="polite"> λ˜λŠ” <div role="status"> 둜 κ°μ‹Έμ„œ 슀크린 리더가 ν•΄λ‹Ή λ©”μ‹œμ§€λ₯Ό μ‚¬μš©μžμ—κ²Œ μžλ™μœΌλ‘œ 읽어주도둝 ν•©λ‹ˆλ‹€.
    • Don't: 검색 κ²°κ³Όκ°€ λ‘œλ“œλ˜κ±°λ‚˜, 섀정이 μ €μž₯λ˜μ—ˆλ‹€λŠ” μ‹œκ°μ  ν”Όλ“œλ°±λ§Œ μ œκ³΅ν•˜κ³ , 슀크린 리더 μ‚¬μš©μžμ—κ²ŒλŠ” μ•„λ¬΄λŸ° 정보 전달 없이 쑰용히 λ³€κ²½ 사항이 μ μš©λ©λ‹ˆλ‹€.

5. ν•œκ΅­ν˜• νŠΉν™” μš”κ΅¬μ‚¬ν•­

ν•œκ΅­ν˜• μ›Ή μ½˜ν…μΈ  μ ‘κ·Όμ„± μ§€μΉ¨ 2.2μ—μ„œ κ°•μ‘°λœ ν•œκ΅­ νŠΉν™” μš”κ΅¬μ‚¬ν•­λ“€.

  • 반볡 μž…λ ₯ 정보 μ΅œμ†Œν™”: μ‚¬μš©μžκ°€ 반볡적으둜 μž…λ ₯ν•΄μ•Ό ν•˜λŠ” 정보λ₯Ό μ€„μ˜€λŠ”κ°€? (7.3.4)
    • Do: νšŒμ›κ°€μž… μ‹œ μž…λ ₯ν•œ μ£Όμ†Œλ₯Ό μ£Όλ¬Έ μ‹œ 'κΈ°λ³Έ λ°°μ†‘μ§€λ‘œ μ‚¬μš©' μ˜΅μ…˜μœΌλ‘œ 뢈러올 수 있게 ν•˜κ±°λ‚˜, 이전 결제 정보λ₯Ό μ•ˆμ „ν•˜κ²Œ μ €μž₯ν•˜μ—¬ λ‹€μŒ 결제 μ‹œ μž¬μ‚¬μš©ν•  수 μžˆλ„λ‘(μ‚¬μš©μž λ™μ˜ ν•˜μ—) κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • Don't: μƒν’ˆ μ£Όλ¬Έ μ‹œ 맀번 이름, μ—°λ½μ²˜, μ£Όμ†Œλ₯Ό μ²˜μŒλΆ€ν„° μƒˆλ‘œ μž…λ ₯ν•˜λ„λ‘ μš”κ΅¬ν•©λ‹ˆλ‹€. μ—¬λŸ¬ λ‹¨κ³„λ‘œ 이루어진 μ‹ μ²­μ„œμ—μ„œ 이전 단계에 μž…λ ₯ν–ˆλ˜ λ™μΌν•œ 정보λ₯Ό λ‹€μŒ λ‹¨κ³„μ—μ„œ 또 λ¬Όμ–΄λ΄…λ‹ˆλ‹€.
  • 점근 κ°€λŠ₯ν•œ 인증: 인증 κ³Όμ •μ—μ„œ 보쑰 기술 μ‚¬μš©μžκ°€ μ ‘κ·Ό κ°€λŠ₯ν•˜λ„λ‘ μ„€κ³„ν–ˆλŠ”κ°€? (7.3.3)
    • Do: 이미지 CAPTCHA λŒ€μ‹  μŒμ„± CAPTCHA μ˜΅μ…˜μ„ μ œκ³΅ν•˜κ±°λ‚˜, reCAPTCHA v3와 같이 μ‚¬μš©μž μΈν„°λž™μ…˜μ΄ 적은 방식을 μ‚¬μš©ν•©λ‹ˆλ‹€. κ³΅λ™μΈμ¦μ„œ(ꡬ κ³΅μΈμΈμ¦μ„œ), κΈˆμœ΅μΈμ¦μ„œ λ“± κ΅­λ‚΄ 인증 μˆ˜λ‹¨μ„ μ‚¬μš©ν•  λ•Œ ν•„μš”ν•œ ν”„λ‘œκ·Έλž¨ μ„€μΉ˜ 및 μ‹€ν–‰ 과정이 ν‚€λ³΄λ“œλ‘œ μ ‘κ·Ό κ°€λŠ₯ν•˜κ³  슀크린 λ¦¬λ”λ‘œ μ•ˆλ‚΄λ˜λ„λ‘ ν•©λ‹ˆλ‹€. (κ°€λŠ₯ν•œ 경우 λŒ€μ²΄ 인증 μˆ˜λ‹¨ 제곡)
    • Don't: μ‹œκ°μ  이미지 CAPTCHA만 μ œκ³΅ν•˜κ³  λŒ€μ²΄ μˆ˜λ‹¨μ΄ μ—†μŠ΅λ‹ˆλ‹€. νŠΉμ • λ³΄μ•ˆ ν”„λ‘œκ·Έλž¨(ActiveX λ˜λŠ” μ‹€ν–‰ 파일 ν˜•νƒœ) μ„€μΉ˜κ°€ ν•„μˆ˜μ΄λ©°, ν•΄λ‹Ή ν”„λ‘œκ·Έλž¨μ΄ ν‚€λ³΄λ“œ μ‘°μž‘μ΄λ‚˜ 슀크린 리더λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ‹œκ°„ μ œν•œμ΄ μžˆλŠ” OTP μž…λ ₯ ν™”λ©΄μ—μ„œ μ‹œκ°„ μ—°μž₯ κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • κ΅­λ‚΄ 법적 μ€€μˆ˜: γ€Œμž₯애인 μ°¨λ³„κΈˆμ§€λ²•γ€ 및 γ€Œκ΅­κ°€μ •λ³΄ν™”κΈ°λ³Έλ²•γ€μ— λ”°λ₯Έ 의무 사항을 λ°˜μ˜ν–ˆλŠ”κ°€?
  • λͺ¨λ°”일 ν™˜κ²½ κ³ λ €: PC뿐만 μ•„λ‹ˆλΌ λͺ¨λ°”일 κΈ°κΈ°μ—μ„œμ˜ 접근성을 κ²€ν† ν–ˆλŠ”κ°€? (1 적용 λ²”μœ„)
    • Do: λͺ¨λ°”일 ν™”λ©΄μ—μ„œ λ²„νŠΌμ΄λ‚˜ 링크 λ“± ν„°μΉ˜ λŒ€μƒμ˜ 크기λ₯Ό μ΅œμ†Œ 44x44 CSS ν”½μ…€ μ΄μƒμœΌλ‘œ μΆ©λΆ„νžˆ ν™•λ³΄ν•˜κ³ , μš”μ†Œ κ°„ 간격도 적절히 λ°°μΉ˜ν•˜μ—¬ 잘λͺ» ν„°μΉ˜ν•  κ°€λŠ₯성을 μ€„μž…λ‹ˆλ‹€. ν•€μΉ˜ 쀌(Pinch zoom) κΈ°λŠ₯을 막지 μ•Šμ•„ μ‚¬μš©μžκ°€ 화면을 ν™•λŒ€ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. ν™”λ©΄ λ°©ν–₯(κ°€λ‘œ/μ„Έλ‘œ) μ „ν™˜ μ‹œ μ½˜ν…μΈ κ°€ μž˜λ¦¬μ§€ μ•Šκ³  μžμ—°μŠ€λŸ½κ²Œ μž¬λ°°μΉ˜λ˜λ„λ‘ λ°˜μ‘ν˜•μœΌλ‘œ λ””μžμΈν•©λ‹ˆλ‹€.
    • Don't: λͺ¨λ°”일 ν™”λ©΄μ—μ„œ λ²„νŠΌλ“€μ΄ λ„ˆλ¬΄ μž‘κ³  μ΄˜μ΄˜ν•˜κ²Œ λΆ™μ–΄ μžˆμ–΄ λˆ„λ₯΄κΈ° μ–΄λ ΅μŠ΅λ‹ˆλ‹€. <meta name="viewport" content="..., user-scalable=no">λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžμ˜ ν™•λŒ€/μΆ•μ†Œ κΈ°λŠ₯을 λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€. κ°€λ‘œ λͺ¨λ“œμ—μ„œλŠ” μ½˜ν…μΈ μ˜ 일뢀가 μž˜λ €λ‚˜κ°€ 슀크둀 μ—†μ΄λŠ” λ³Ό 수 μ—†μŠ΅λ‹ˆλ‹€.

μ‚¬μš© 방법

  • 각 μ»΄ν¬λ„ŒνŠΈ(λ²„νŠΌ, μž…λ ₯ ν•„λ“œ, λ‚΄λΉ„κ²Œμ΄μ…˜ λ“±)λ₯Ό 섀계할 λ•Œ 이 체크리슀트λ₯Ό μ°Έκ³ 
  • 체크리슀트 ν•­λͺ©μ„ ν•˜λ‚˜μ”© κ²€ν† ν•˜λ©° "예/μ•„λ‹ˆμ˜€"둜 ν™•μΈν•˜κ³ , λ―Έμ€€μˆ˜ ν•­λͺ©μ€ κ°œμ„  κ³„νš 수립
  • 개발 및 QA λ‹¨κ³„μ—μ„œ 슀크린 리더(NVDA, VoiceOver λ“±)와 ν‚€λ³΄λ“œ ν…ŒμŠ€νŠΈ 병행

참고 자료

Clone this wiki locally