"ARIA 의 첫 번째 규칙은: ARIA 쓰지 마. 두 번째 규칙은: 써야 할 때 이 작은 set 을 잘 써."
명세 자체가 피하라고 해
W3C 의 Using ARIA 문서가 문자 그대로 경고로 시작해: "이미 내장된 semantic 과 행동을 가진 native HTML element 를 쓸 수 있다면, element 의 용도를 바꾸고 ARIA role/state/property 를 추가해서 접근성을 만들지 말고 그 native 를 써라." ARIA 오용 대부분은 이미 맞는 semantic 을 가진 element 에 ARIA 를 더하는 데서 나와. <button aria-label="Submit">Submit</button> — aria-label 이 조용히 redundant; 버튼의 텍스트 콘텐츠가 이미 접근성 이름.
그럼 ARIA 가 언제 제 값 해? 다섯 상황이 정당한 경우 90% 를 커버해.
1. 이름 없는 element 에 이름 주기
보이는 텍스트가 유용한 이름이 아닐 때 — icon-only 버튼, 돋보기 아이콘으로만 라벨링된 검색 입력, X 만 보이는 close 버튼 — 이름 줘.
aria-label="Close menu"— 접근성 이름이 이 속성에서 옴 (보이는 label 없을 때).aria-labelledby="id-of-another-element"— 이름이 다른 element 안 텍스트에서 옴 (label 이 화면 다른 어딘가에 보일 때).
2. Element 묘사하기
Input 에 연결된 helper 텍스트, 힌트, 검증 메시지용:
aria-describedby="id"— description 가진 element 를 가리켜. Screen reader 가 이름 먼저, 그 다음 description 읽음. Password 힌트 ("최소 8 자, 숫자 하나"), 검증 에러, 포맷 가이드용.
3. 상태 전달하기
인터랙티브 element 의 상태가 중요하지만 native semantic 만으로는 명확하지 않을 때:
aria-expanded="true" | "false"— 메뉴, 아코디언, 드롭다운 여는 버튼.aria-pressed="true" | "false"— 토글 버튼 (에디터의 bold/italic 떠올려).aria-checked="true" | "false" | "mixed"— custom 체크박스 (mixed = indeterminate).aria-selected="true" | "false"— custom 탭 리스트나 listbox 의 항목.aria-disabled="true"— disabled 처럼 보이지만 여전히 focusable 하길 원하는 element (screen reader 사용자가 존재 알게).disabled속성과 달라.
4. 폼 검증
aria-required="true"— nativerequired못 쓸 때만 필요 (custom 폼 컨트롤). Native HTML 입력에는required가 이걸 이미 설정.aria-invalid="true"— 검증 실패 시 필드와 페어. Screen reader 가 필드 focus 받을 때 "invalid entry" announce. 에러 메시지 가리키는aria-describedby와 페어.
5. 동적 콘텐츠용 Live Region
사용자가 네비 안 하는데 콘텐츠가 업데이트될 때 (toast 알림, 저장 확인, 사용자 타이핑에 따라 필터링되는 검색 결과), screen reader 가 알아채지 못해 — 업데이트된 영역이 live region 이 아니면:
aria-live="polite"— screen reader 가 한가할 때 업데이트 announce. 대부분 알림의 기본 선택.aria-live="assertive"— screen reader 가 말하던 거 interrupt. 중요한 메시지 (에러, 연결 끊김) 용. 절제해서 — 대문자 외침이야.role="status"— polite live region 의 약자. 상태 메시지용.role="alert"— assertive live region 의 약자. 에러용.
보조 기술에서 숨기기: aria-hidden="true"
보이지만 screen reader 가 건너뛰어야 할 때 — 장식용 아이콘, redundant 텍스트 — aria-hidden="true" 설정. 가장 흔한 케이스: 보이는 아이콘과 보이는 텍스트 라벨 둘 다 가진 버튼. 아이콘은 장식; 텍스트가 이름. 아이콘을 screen reader 에서 숨겨 "button, Settings" 전에 "image, settings" 가 announce 안 되게.
tabindex="-1" 이나 native hidden 속성도 더해.만트라: Native 먼저, ARIA 다음
aria-expanded, 모든 aria-checked, 모든 aria-invalid 가 JavaScript 로 유지. 유지보수에서 native 가 매번 이김.피파의 노트
aria-label="Message Pippa" (보이는 label 이 시각 디자인 위해 숨겨져서), 스트리밍 응답 중일 때 aria-busy="true" (screen reader 가 기다리는 거 알게), 새 메시지 announcement 영역의 aria-live="polite" (screen reader 사용자가 응답 떨어질 때 알려지게). 끝. 나머지는 다 native — <button>, <label>, <a>, markup 선택으로 정해지는 semantic role. 작은 ARIA 표면 = 상태가 sync 빠질 자리 적음.