콘텐츠 구조

hidden
notion image
 
 
MDN Web DocsMDN Web DocsUsing HTML landmark roles to improve accessibility | MDN Blog

콘텐츠 구조

디지털 접근성에서 가장 중요한 요소 중 하나는 페이지의 기본 구조다.
  • 스타일 측면만 고려하지 말고 (비시멘틱 태그인 div, span 남발)

구조적 요소의 역할

  • 콘텐츠의 개요(Outline) 역할
    • 시멘틱 태그(<header>, <nav>, <main>, <section> 등)를 사용하면, 페이지가 논리적으로 잘 구성되고, 콘텐츠의 구조가 명확해짐.
  • 내비게이션 포인트(Anchor points) 역할
    • 보조 기술(AT) 사용자는 이 구조적 요소들을 활용해 콘텐츠 내에서 쉽게 이동할 수 있음.

예시

스크린 리더(Screen Reader) 사용자의 경우
  • <nav> 태그를 사용하면 "Navigation 영역으로 이동" 같은 명령을 내려 한 번에 내비게이션 바로 이동 가능.
  • <main> 태그를 사용하면 "본문(Main Content)으로 바로 이동" 가능.
키보드 사용자(예: Tab 키 사용)
  • 시멘틱 요소가 있으면, 탭(Tab) 키를 눌러 중요한 영역을 빠르게 건너뛸 수 있음.
    • <header>, <main>, <section>
  • 반대로, 비시멘틱 태그(div, span 등)로만 구성하면 키보드 내비게이션이 비효율적이 됨.
📌
구조적 요소를 올바르게 사용하면, 단순히 화면을 보기 좋게 하는 것뿐만 아니라, AT 사용자들에게도 유용한 내비게이션 기능을 제공할 수 있다

시멘틱 태그 사용

  • 시멘틱 HTML 요소를 사용하면 각 요소의 고유한 의미가 접근성 트리(Accessibility Tree)에 전달되고,
  • 보조 기술(AT)이 이를 활용하여 콘텐츠의 의미를 보다 정확하게 이해할 수 있다.
  • 비시멘틱 요소보다 시멘틱 요소를 사용하면 콘텐츠에 더 많은 의미를 부여할 수 있다.
📌
추가적인 ARIA 속성을 사용하여 요소 간의 관계를 설정하거나 사용자 경험을 향상해야 하는 경우도 있을 수 있지만, 대부분의 상황에서는 100개 이상의 HTML 요소 중 하나 그 자체로 충분한 역할을 한다.
 

Landmarks

AT 사용자는 페이지의 전체 레이아웃에 대한 정보를 제공하는 구조적 요소에 의존한다.
페이지 콘텐츠를 큰 부분들로 sectioning 할 때 ARIA landmark roles를 부여하거나 HTML landmark 요소로 페이지의 구조적 맥락을 명시할 수 있다.

역할

랜드마크(Landmarks)는 콘텐츠가 탐색 가능한 영역에 있도록 보장하는 역할을 한다.
navigable regions(탐색 가능한 영역)은 사용자가 키보드(예: Tab 키)나 보조 기술(예: 스크린 리더)을 사용하여 쉽게 이동할 수 있는 영역을 의미
<header>, <nav>, <main> 같은 시멘틱 태그를 사용
  • 보조 기술이 이를 자동으로 인식하고 사용자가 빠르게 이동할 수 있다.
<div>만 사용
  • 추가적인 ARIA 속성이 없을 경우 AT가 해당 영역을 자동으로 탐색하지 못한다.

권장사항

  • 각 페이지마다 최소한 하나의 랜드마크를 제공하는 것이 권장된다.
  • HTML과 ARIA가 중복 정보를 제공한다면 HTML 랜드마크만 사용하는 것이 권장된다. (브라우저 지원이 매우 강력하다)
아래 그림과 같이 각 시멘틱 HTML 요소에 대응되는 ARIA 랜드마크들이 있지만, html 만으로도 충분하니까 둘을 중복해서 지정할 필요는 없다.
notion image
📌
Main Landmark: ARIA Landmarks Example

예시

❌ Bad
<div> <div>...</div> </div> <div> <p>Stamp collecting, also known as philately, is the study of postage stamps, stamped envelopes, postmarks, postcards, and other materials relating to postal delivery.</p> </div> <div> <p>© 2022 - Stamps R Awesome</p> </div>
시멘틱 태그를 쓴 것도 아니고, ARIA 속성을 지정한 것도 아니다.
따라서 AT가 이 내용을 올바르게 전달할 수 없고, 접근 가능한 영역 판단도 어려워 키보드로도 접근하기 어렵다.
시멘틱 태그와 ARIA 속성을 잘 사용하여 구조가 잘 보이도록 해야한다.
 
✅ Good
<header> <nav>...</nav> </header> <main> <section aria-label="Introduction to stamp collecting"> <p>Stamp collecting, also known as philately, is the study of postage stamps, stamped envelopes, postmarks, postcards, and other materials relating to postal delivery.</p> </section> </main> <footer> <p>© 2022 - Stamps R Awesome</p> </footer>
 

Heading

YouTubeYouTubeWhy headings and landmarks are so important -- A11ycasts #18
 
  • 올바르게 구현되었을 때, HTML의 제목(heading) 레벨들은 전체 페이지 콘텐츠의 목차를 형성한다.
  • h1~h6 까지 총 6개로 제목을 나타낼 수 있다.
  • <h1>은 페이지에서 가장 중요한 정보를 표시하는 데 사용되며,
  • <h6>은 가장 하위의 덜 중요한 정보를 나타내는 데 사용된다.
  • 보조 기술(AT) 사용자들은 제목을 주요 탐색 수단으로 활용하기 때문에 제목 레벨의 순서는 중요하다.
  • h1에서 갑자기 바로 h5로 건너뛰는 등의 행위는 지양해야 한다.

예시

✅ Good
<header class="center"> <h1 class="serif lead size-xl">Stamp collecting</h1> </header> <main> <section aria-label="Introduction to stamp collecting"> <h2 class="size-l serif">What is stamp collecting?</h2> <p>Stamp collecting, also known as philately, is the study of postage stamps, stamped envelopes, postmarks, postcards, and other materials relating to postal delivery.</p> </section> <section aria-label="Start a stamp collection"> <h2 class="sansserif radial size-l">How do I start a stamp collection?</h2> <h3 class="serif size-m">Required equiment</h3> <p>...</p> <h3 class="serif size-m">How to acquire stamps</h3> <p>...</p> <h3 class="serif radial size-s">Organizations you can join</h3> <p>...</p> </section> </main>
페이지의 타이틀이 headerh1으로 표현되고,
각 섹션 내부에서는 h2로 섹션의 제목, h3로 섹션의 주요 세부 주제들을 나타내고 있다.
헤딩이 올바르게 사용되었다.
 

Lists

HTML Lists는 서로 유사한 항목을 시맨틱 하게 그룹화하는 하나의 방법이다.

HTML 리스트 태그 3가지

notion image
ordered list <ol>
  • 순서가 있는 1234, abcd, …
  • list item <li> 태그를 하위로 가진다.
 
notion image
unordered list <ul> (순서가 없는)
  • list item <li> 태그를 하위로 가진다.
 
notion image
description list <dl> (설명 목록)
  • 설명할 용어(term)은 <dt> 태그로 명시하고,
  • 용어에 대한 정의(definition)은 <dd> 태그를 사용한다.

의미

스크린리더에 의존하는 사람들에게, AT시멘틱한 리스트(semantic list)를 만나면,
  1. 해당 리스트의 이름과 총 항목 개수를 사용자에게 알려준다.
  1. 또한 사용자가 리스트 내에서 이동할 때, 각 항목을 읽어주면서
    1. "총 5개의 항목 중 1번 항목", "총 5개의 항목 중 2번 항목"
      이런 식으로 안내해 준다.

예시

❌ Bad
<div> <p>How do I start a stamp collection?</p> <p>Equipment you will need</p> <div> <p>Small tongs with rounded tips</p> <p>Stamp hinges</p> <p>Stockbook or albumn</p> <p>Magnifying glass</p> <p>Stamps</p> </div> </div>
시멘틱한 의미 없이 단지 구조만 잡는 div 태그를 이용해서 리스트를 구성하지 말자.
✅ Good
<div> <h1>How do I start a stamp collection?</h1> <h2>Equipment you will need</h2> <ol> <li>Small tongs with rounded tips</li> <li>Stamp hinges</li> <li>Stockbook or albumn</li> <li>Magnifying glass</li> <li>Stamps</li> </ol> </div>
리스트 형식을 의도했다면 그 의도가 전달되도록 적절한 리스트 태그를 사용하자.
 

Tables

HTML에서 테이블은 일반적으로
  • 데이터를 정리하거나
  • 페이지 레이아웃을 구성하는 데 사용된다.
목적에 따라 다양한 시멘틱 구조 요소를 사용하게 된다.
구조가 매우 복잡할 수 있지만 기본적인 시멘틱 규칙을 지킨다면 큰 수정 없이도 충분히 접근 가능하다.

Layout

인터넷 초창기에는 테이블은 페이지의 시각적 구조를 만드는 주요 요소였다.
요즘은 <div>와 같은 비시멘틱 요소와 조합하여 레이아웃을 만든다.
테이블로 페이지 레이아웃을 구성시키는 시대는 끝났다.
 
하지만 여전히 시각적으로 풍부한 이메일, 뉴스레터 광고와 같은 특정 상황에서는 레이아웃 목적으로 사용되기도 한다. 이러한 경우는 특별한 의미를 지닌 게 아니므로 AT에게 전달되지 않도록 주의해야 한다.
  • <th><caption> 처럼 관계와 의미를 추가하는 구조적 요소는 사용하지 않아야 한다.
 
❌ Bad
페이지 레이아웃을 목적으로 하는 경우에는 시멘틱 태그를 사용하면 안된다.
<table> <caption>My stamp collection</caption> <tr> <th>[Stamp Image 1]</th> <th>[Stamp Image 2]</th> <th>[Stamp Image 3]</th> </tr> </table>
✅ Good
레이아웃을 목적으로 하는 경우 ARIA rolepresentation 또는 aria-hidden으로 설정해서 AT가 읽지 않도록 해야한다.
<table role="presentation"> <tr> <td>[Stamp Image 1]</td> <td>[Stamp Image 2]</td> <td>[Stamp Image 3]</td> </tr> </table>
 

Data

테이블이 데이터 목적으로 쓰이는 경우, AT 사용자에게 데이터 테이블과 그 모든 요소들은 보여져야 한다.
 
테이블의 구조는 정보를 이해하는 데 중요하다.
테이블이 올바르게 구조화 되지 못하면 AT가 정보를 올바르게 전달하지 못하고, 사용자가 테이블의 정보와 그 의미를 해석해야 하는 상황이 발생할 수 있다.
 
테이블의 복잡성에 따라, 관계를 코드로 형성하는 방법은 달라진다.
테이블의 접근성을 고려하는 첫 번째 단계는 헤더 셀<th>로, 데이터 셀<td>로 마크업하는 것이다.
더 복잡한 테이블의 경우 <rowgroup><colgroup><caption>scope와 같은 추가 HTML 테이블 요소들을 사용하여 의미와 관계를 전달할 수 있다.
📌
table의 접근성 관련 부분은 HTML 태그 글의 접근성 고려 부분에서 더 자세히 정리해뒀다.
❌ Bad
헤더 정보도 없고, 열만 나열되어 있어서 뭐가 무슨 정보인지 알기 어렵다.
<table> <tr> <td>Animal</td> <td>Year</td> <td>Condition</td> </tr> <tr> <td>Bird</td> <td>1947</td> <td>Fair</td> </tr> <tr> <td>Lion</td> <td>1982</td> <td>Good</td> </tr> <tr> <td>Horse</td> <td>1978</td> <td>Mint</td> </tr> </table>
✅ Good
구조에 맞는 시멘틱 태그를 사용하여 적절하게 의미를 전달한다.
<table> <caption>요일별 식단표</caption> <thead> <tr> <th></th> <th scope="col">월</th> <th scope="col">화</th> <th scope="col">수</th> </tr> </thead> <tbody> <tr> <th scope="row">아침</th> <td>토스트</td> <td>시리얼</td> <td>오트밀</td> </tr> <tr> <th scope="row">점심</th> <td>샐러드</td> <td>김밥</td> <td>파스타</td> </tr> </tbody> </table>