게시일

웹 접근성: React로 접근성을 고려한 웹 서비스 개발

작성자
  • 이름
    Twitter

웹 접근성(별칭: a11y)은 모든 사람이 웹을 원활하게 사용할 수 있도록 보장하는 개념으로, 특히 장애가 있는 사람들에게 중요한 역할을 합니다. React로 웹 애플리케이션을 개발할 때 웹 접근성을 제대로 구현하면 더 많은 사용자들이 콘텐츠에 접근할 수 있고, SEO 및 사용자 경험(UX)도 함께 개선됩니다. 해당 글은 React 공식 문서를 참고하여 작성했습니다.

1. Semantic HTML 활용하기

웹 콘텐츠를 구조적으로 명확히 표현하는 시맨틱 HTML 요소는 접근성을 높이는 데 핵심적인 역할을 합니다. 스크린 리더는 페이지의 구조를 파악하기 위해 시맨틱 요소를 분석하며, 이를 통해 사용자들은 웹 페이지의 내용을 쉽게 탐색할 수 있습니다.

  • 적절한 시맨틱 태그 사용: 단순히 div나 span을 사용하는 대신, 콘텐츠의 의미에 맞는 HTML 요소 사용이 필요합니다.
  • header, footer, nav, main, section, article, aside 등은 페이지의 구조를 명확히 설명합니다.
  • 예를 들어, 페이지의 주요 콘텐츠를 담는 영역은 main요소로 감싸야 하며, 내비게이션은 nav로 표현해야 합니다.

예제 코드:

<header>
  <h1>My Website</h1>
  <nav>
    <ul>
      <li><a href="#home">Home</a></li>
      <li><a href="#about">About</a></li>
      <li><a href="#contact">Contact</a></li>
    </ul>
  </nav>
</header>
<main>
  <section>
    <h2>Welcome to Our Site</h2>
    <p>Explore our content and enjoy a great experience.</p>
  </section>
</main>
<footer>
  <p>© 2024 My Website. All rights reserved.</p>
</footer>

: 시맨틱 HTML을 사용하면 스크린 리더 사용자들이 페이지를 논리적으로 탐색할 수 있어 훨씬 더 유용합니다.

2. ARIA 속성의 활용

ARIA(Accessible Rich Internet Applications) 속성은 복잡한 사용자 인터페이스를 보완하여 접근성을 높일 수 있도록 도와줍니다. 하지만 ARIA 속성은 시맨틱 HTML로 대체할 수 없는 경우에만 사용하는 것이 좋습니다. 과도한 ARIA 속성 사용은 오히려 혼란을 초래할 수 있습니다.

  • ARIA 속성의 주요 사용법:
    • aria-label: 버튼이나 링크와 같은 인터페이스 요소에 라벨을 제공할 때 사용합니다.
    • aria-labelledby: 요소를 설명하는 다른 요소의 텍스트를 참조합니다.
    • aria-hidden: 요소를 시각적으로 표시하지만, 스크린 리더에서는 무시하게 합니다.
    • aria-live: 콘텐츠가 실시간으로 업데이트될 때 스크린 리더에 알려주는 속성입니다.

예제 코드:

<button aria-label="Close menu">X</button>

<div role="alert" aria-live="assertive">
  Your settings have been saved successfully.
</div>

주의사항: ARIA를 사용할 때는 시맨틱 요소로 충분히 설명할 수 있는지 먼저 검토한 후, 꼭 필요한 경우에만 적용이 필요합니다.

3. 키보드 접근성 보장

웹 페이지나 애플리케이션의 모든 상호작용 요소는 키보드로 접근할 수 있어야 합니다. 예를 들어, tab 키로 버튼, 링크, 폼 요소를 탐색할 수 있어야 하며, Enter 키 또는 Space 키로 클릭 이벤트를 실행할 수 있도록 설정해야 합니다.

  • tabindex 속성: 기본적으로 포커스가 가지 않는 요소에 포커스를 설정할 때 사용됩니다. tabindex="0"을 설정하면 요소가 자연스러운 포커스 흐름에 포함됩니다.
  • 키보드 이벤트 핸들러: 이벤트 핸들러를 추가해 키보드로도 상호작용할 수 있게 설정이 필요합니다.

예제 코드:

function AccessibleButton() {
  const handleClick = () => {
    alert('Button clicked!')
  }

  const handleKeyDown = (event) => {
    if (event.key === 'Enter' || event.key === ' ') {
      handleClick()
    }
  }

  return (
    <button onClick={handleClick} onKeyDown={handleKeyDown} tabIndex="0">
      Accessible Button
    </button>
  )
}

: 키보드 접근성을 보장하면 스크린 리더 사용자뿐 아니라, 마우스를 사용하기 어려운 사용자에게도 도움을 줄 수 있습니다.

4. 폼(form) 요소의 접근성

폼 요소를 사용할 때는 모든 입력 필드에 라벨을 제공하고, 오류 메시지를 명확하게 전달해야 합니다. label 요소와 폼 컨트롤을 연결할 때는 htmlFor 속성을 사용합니다. 또한, aria-describedby를 활용하여 사용자에게 추가 정보를 제공할 수 있습니다.

  • 폼 라벨과 연결: 입력 필드가 무엇을 의미하는지 명확히 설명합니다.
  • 유효성 검사 및 에러 메시지: 사용자가 입력 오류를 쉽게 수정할 수 있도록 에러 메시지를 명확하게 제공해야 합니다.

예제 코드:

<form>
  <label htmlFor="email">Email Address</label>
  <input id="email" type="email" aria-describedby="emailHelp" />
  <small id="emailHelp">We'll never share your email with anyone else.</small>

  <button type="submit">Submit</button>
</form>

5. 이미지와 대체 텍스트

이미지, 아이콘, 비디오 등 시각적 콘텐츠는 반드시 대체 텍스트를 포함해야 합니다. 대체 텍스트는 alt 속성에 제공하며, 이미지가 의미가 없거나 장식적일 경우에는 빈 문자열 alt=""을 사용합니다.

예제 코드:

<img src="logo.png" alt="Company Logo" />

<!-- 장식 이미지 -->
<img src="decorative-pattern.jpg" alt="" />

6. 색상 대비 및 텍스트 가독성

WCAG(Web Content Accessibility Guidelines) 에서는 텍스트와 배경 사이의 색상 대비를 권장합니다. 색상 대비는 시각적 장애가 있는 사용자나 조명이 나쁜 환경에서도 콘텐츠를 읽을 수 있도록 도와줍니다. 일반 텍스트는 최소 4.5:1, 큰 텍스트는 최소 3:1의 대비를 권장합니다. 색 대비에 대한 테스트 기능을 확장할 경우, 다음 도구를 사용할 수 있습니다: WebAIM - 색 채도 검사기

  • 대비 체크: Contrast Ratio Checker를 사용해 대비 비율을 확인할 수 있습니다.
  • 텍스트 스타일링: 텍스트의 크기, 글꼴 스타일, 간격 등을 조정해 가독성을 높여야 합니다.

7. 실시간 상태 업데이트 알림

React 애플리케이션에서 상태가 실시간으로 업데이트될 때, 중요한 정보는 사용자에게 즉시 알리는 것이 중요합니다. aria-live 속성은 스크린 리더가 콘텐츠 변경 사항을 알리는 데 사용됩니다.

  • aria-live 속성: polite는 중요하지 않은 변경 사항을, assertive는 즉각적인 알림이 필요한 경우 사용됩니다.

예제 코드:

function Notification({ message }) {
  return <div aria-live="polite">{message}</div>
}