도입 스토리
"이 약관 페이지, 너무 어렵지 않나요?" 김개발이 말했습니다. "법적 문구라서 어쩔 수 없다는데..."
"읽기 쉽게 만드는 건 다양한 방법이 있어요." 박멘토가 화면을 보며 말했습니다. "약어는 풀어쓰기, 어려운 용어는 설명 추가, 중요한 내용은 요약 제공. WCAG는 3.1.3에서 특이한 단어에 설명을 제공하도록 권장해요. 필수는 아니지만 AAA 기준이에요."
"약어마다 다 설명을 달아야 하나요?"
"처음 등장할 때 한 번만 풀어쓰면 돼요. HTML은 이를 위한 태그도 있어요."
핵심 개념 설명
약어 설명 — WCAG 3.1.4
약어가 처음 등장할 때 전체 의미를 제공합니다.
<!-- 방법 1: abbr 태그로 풀어쓰기 --><p> <abbr title="Web Content Accessibility Guidelines">WCAG</abbr> 2.2는 W3C가 발행한 웹 접근성 국제 표준입니다.</p><!-- 방법 2: 괄호로 처음 한 번 --><p> WCAG(Web Content Accessibility Guidelines) 2.2는 국제 표준입니다. 이후 WCAG라고 줄여 씁니다.</p><!-- 방법 3: 용어집 링크 --><p> <a href="/glossary#wcag">WCAG</a> 2.2를 준수해야 합니다.</p>
<abbr title="..."> 태그는 마우스 hover 시 전체 의미가 표시되고, 스크린리더도 읽어줍니다.
발음 안내 — WCAG 3.1.6
동음이의어나 특수한 발음이 있는 단어에 읽기 방법을 제공합니다. (AAA 기준, 일본어 한자 등에 특히 중요)
<!-- ruby 태그로 읽기 안내 (주로 동아시아 언어) --><ruby> 韓國語 <rp>(</rp> <rt>한국어</rt> <rp>)</rp></ruby><!-- 특수 발음 안내 --><p> 이 약품의 성분명은 <span title="아세트아미노펜으로 발음">acetaminophen</span>입니다.</p>
오류 방지 — WCAG 3.3.4
법적·금융·개인 정보 변경처럼 되돌리기 어려운 작업은 확인 단계가 필요합니다.
| 방법 | 설명 | 예시 |
|---|---|---|
| 확인 단계 | 제출 전 검토 페이지 | 주문 확인, 결제 검토 |
| 수정 가능 기간 | 제출 후 일정 시간 동안 취소 가능 | 이메일 발송 취소 |
| 입력 검사 | 제출 전 자동 오류 감지 | 폼 유효성 검사 |
<!-- 개인정보 삭제 같은 위험한 작업 --><button type="button" onclick="confirmDelete()" aria-describedby="delete-warning"> 계정 삭제</button><p id="delete-warning" class="warning-text"> 계정을 삭제하면 모든 데이터가 영구적으로 삭제되며 복구할 수 없습니다.</p>
function confirmDelete() { // 확인 대화상자 const confirmed = window.confirm( '계정을 삭제하시겠습니까?\n\n이 작업은 되돌릴 수 없습니다.' ); // 더 나은 방법: 커스텀 확인 모달 if (confirmed) deleteAccount();}
도움 기능 — WCAG 3.3.5
복잡한 폼이나 프로세스에 도움말이 있어야 합니다.
<!-- 폼 필드 옆 도움말 버튼 --><div class="field-group"> <label for="biz-number">사업자 등록번호</label> <div class="input-row"> <input type="text" id="biz-number" pattern="\d{3}-\d{2}-\d{5}" placeholder="000-00-00000" aria-describedby="biz-hint" > <button type="button" aria-label="사업자 등록번호 입력 도움말" onclick="showHelp('biz-number')" > ? </button> </div> <p id="biz-hint" class="sr-only">10자리 숫자를 하이픈 포함하여 입력하세요.</p></div>
글쓰기 접근성 원칙
기술적 마크업 외에도, 글 자체가 이해하기 쉬워야 합니다.
명확한 글쓰기 원칙:
- 짧은 문장 선호 (한 문장에 하나의 개념)
- 능동태 사용 ("클릭해야 합니다" → "클릭하세요")
- 전문 용어는 처음 등장 시 설명
- 헤딩과 목록으로 구조화
- 요약 제공 (긴 내용의 첫 단락에 핵심 요약)
<!-- 복잡한 내용에 요약 제공 --><article> <h2>개인정보처리방침</h2> <!-- 요약 --> <div class="summary" aria-label="요약"> <h3>핵심 내용 요약</h3> <ul> <li>수집 정보: 이름, 이메일, 서비스 이용 기록</li> <li>보유 기간: 서비스 이용 종료 후 3년</li> <li>제3자 제공: 법령에 따른 경우 외 없음</li> </ul> </div> <!-- 전문 --> <details> <summary>전체 개인정보처리방침 보기</summary> <div class="full-text"> <!-- 긴 전문 --> </div> </details></article>
단계별 실습
따라하기: 약어 표시하기
페이지에서 약어를 찾아 <abbr> 태그를 추가합니다.
// 페이지 내 abbr 태그 현황 확인document.querySelectorAll('abbr').forEach(abbr => { if (!abbr.title) { console.warn('title 없는 abbr:', abbr.textContent); } else { console.log(`${abbr.textContent} → ${abbr.title}`); }});
변형하기: 주문 확인 단계 추가
단일 제출 버튼을 검토 단계가 있는 흐름으로 변경합니다.
<!-- Step 1: 주문 내용 --><section aria-labelledby="order-title"> <h2 id="order-title">주문 내용 확인</h2> <dl> <dt>상품</dt><dd>노트북 Pro</dd> <dt>수량</dt><dd>1개</dd> <dt>결제금액</dt><dd>1,500,000원</dd> </dl> <button type="button" onclick="proceedToPayment()" > 결제하기 </button> <button type="button" onclick="goBack()">수정하기</button></section>
정리와 확인
핵심 내용 요약
<abbr title="...">: 약어 전체 의미 제공 (WCAG 3.1.4)- 오류 방지(WCAG 3.3.4): 되돌리기 어려운 작업 — 확인 단계 또는 취소 기간
- 도움말 제공(WCAG 3.3.5): 복잡한 입력에 맥락 도움말 연결
- 명확한 글쓰기: 짧은 문장, 능동태, 요약 제공
확인 문제
문제 1. 다음 중 WCAG 3.3.4(오류 방지)가 적용되어야 하는 작업은?
A: 게시글 임시 저장 ← 적용 불필요 (언제든 수정 가능)
B: 계정 삭제 ← 적용 필요 (되돌릴 수 없음)
C: 프로필 사진 변경 ← 적용 불필요 (언제든 다시 변경 가능)
D: 금융 거래 처리 ← 적용 필요 (법적·금융적 결과)
문제 2. <abbr> 태그의 title 속성 없이 약어를 표시했을 때의 문제점은?
마우스 hover 시 전체 의미가 표시되지 않습니다.
스크린리더도 약어 그대로 읽어서 의미를 파악할 수 없습니다.
PART 04를 마쳤습니다. 다음 PART에서는 마지막 원칙인 "견고성(Robust)"을 다룹니다. 시맨틱 HTML과 ARIA의 올바른 조합으로 현재와 미래의 보조기기 모두에서 작동하는 코드를 만드는 방법을 알아봅니다.