HTML/DOM 구조

수십 페이지의 게시판 페이지네이션(Pagination)에서 현재 페이지 안내와 접근성 링크

게시판 하단의 1, 2, 3... 페이지 이동 번호 링크에 nav, aria-label, aria-current='page'를 적용하여 스크린리더 혼선을 방지하는 표준을 분석합니다.

작성자 서호영 (기획·개발·콘텐츠 검토) · 발행 · 수정 · 읽기 8분

실무 검증 기록

실무 판단 기준 및 판정 조건

본 기록은 공개 fixture와 재현 조건을 기준으로 정리한 기술 설명입니다. 실제 브라우저·스크린리더 조합의 동작은 별도 수동 검토가 필요합니다.

접근성 기술 검증 상세 내역
검증 상태공개 fixture 기반 재현 완료
검증 기준공개 fixture 및 재현 조건
검증 범위게시판 페이지네이션 내비게이션 접근성 구조 검증 및 명시된 입력값에 한정
수동 확인실제 브라우저·키보드·스크린리더 환경에서 별도 확인 필요
fixture에서 확인한 기대 결과[실패 상태] 단순 숫자 링크 나열로 현재 페이지 미인식 ➔ [수정 목표] nav, ul 구조 및 aria-current='page' 상태 동기화

검증에 사용된 실제 픽스처 / 재현 조건

nav[aria-label='페이지 번호 내비게이션'] > ul > li > a[aria-current='page']
검증 범위 및 한계
  • 비동기 갱신 시 게시판 목록 첫머리로의 초점 이동 로직 점검
  • 첫/마지막 페이지 화살표의 비활성화 상태 전달 수동 확인

주장과 직결된 W3C 공식 규격

블로그 글 목록, 게시판, 쇼핑몰 검색 결과 등 대량의 게시물 목록 하단에 위치한 '페이지네이션(Pagination, 페이지 번호 매기기)' 내비게이션은 사용자가 원하는 콘텐츠를 탐색할 수 있도록 돕는 필수적인 UI 요소입니다. 이전 페이지(<), 1, 2, 3, 4, 5, 다음 페이지(>) 형태로 나열된 숫자 버튼들은 눈으로 보는 사용자에게는 지극히 명확해 보입니다. 그러나 화면을 볼 수 없어 스크린리더를 사용하는 시각장애인에게 이러한 숫자들의 나열은 극심한 혼란을 유발합니다. 브라우저가 링크를 읽어줄 때 단지 '1 링크, 2 링크, 3 링크'라고만 낭독하여 이 숫자가 무엇을 의미하는지 전혀 알 수 없으며, 특히 '현재 내가 머물고 있는 페이지가 몇 번인지'를 알려주는 시각적 하이라이트(예: 2번에 파란색 원형 배경)가 보조공학에는 아무런 상태 단서 없이 증발해 버리기 때문입니다. WCAG 2.2 성공 기준 1.3.1(Info and Relationships)과 4.1.2(Name, Role, Value)는 페이지네이션의 구조적 명확성을 보장할 것을 요구합니다. 이 글에서는 접근 가능한 페이지네이션 설계법을 완벽히 정리합니다.

페이지네이션 마크업에서 자주 발견되는 치명적 접근성 결함

웹 접근성 진단에서 페이지네이션 영역은 의외로 수많은 결함이 집중되는 사각지대입니다.

첫째, <nav> 랜드마크의 누락입니다. 페이지 번호 링크들을 단순한 <div> 태그로 감싸두면, 스크린리더 사용자가 랜드마크 이동 단축키(D 키)로 페이지네이션 영역을 신속하게 찾아올 수 없습니다.

둘째, 현재 활성화된 페이지(Current Page)에 aria-current='page'가 누락된 경우입니다. 눈으로는 3번 번호가 굵은 글씨로 하이라이트되어 있어 3페이지임을 알 수 있지만, 스크린리더는 모든 번호를 동일한 톤으로 낭독하여 시각장애인은 자신이 몇 페이지에 있는지 확인할 방법이 없습니다.

셋째, '이전(<)', '다음(>)' 화살표 링크에 텍스트 레이블이 없는 경우입니다. SVG 화살표만 덩그러니 들어있어 스크린리더가 '링크' 또는 알 수 없는 특수문자로 낭독하는 문제입니다.

W3C 표준 페이지네이션 4대 필수 마크업 아키텍처

스크린리더와 키보드 사용자 모두에게 완벽한 사용성을 보장하는 페이지네이션 코드는 다음과 같이 작성되어야 합니다.

  • 1. <nav aria-label='페이지 번호 내비게이션'>: 사이트 상단의 메인 메뉴(GNB)와 구별되도록 명확한 한국어 aria-label을 부여합니다.
  • 2. <ul>과 <li>를 활용한 목록 구조화: 전체 페이지 개수를 스크린리더가 '목록 7개 항목 포함' 형태로 먼저 알려줄 수 있도록 순서 없는 목록 태그로 감쌉니다.
  • 3. aria-current='page' 속성 부여: 현재 열려 있는 활성 페이지 번호 링크에 aria-current='page'를 선언합니다. 스크린리더는 '3, 현재 페이지, 링크'라고 명확하게 낭독합니다.
  • 4. 명확한 접근 가능한 이름(Accessible Name): 각 숫자 링크에 aria-label='1페이지로 이동', '2페이지로 이동'을 부여하고, 화살표 버튼에는 aria-label='이전 페이지 목록으로 이동', '다음 페이지 목록으로 이동'을 확실히 명시합니다.

첫 페이지(First) 및 마지막 페이지(Last) 비활성화 처리

사용자가 현재 1페이지에 머물고 있을 때 '이전 페이지(<)' 버튼은 당연히 동작하지 않아야 합니다.

이때 흔히 하는 실수는 비활성화된 이전 버튼에 <a href='#'>를 그대로 남겨두는 것입니다. 키보드 사용자가 Tab 키로 이동하여 엔터를 눌렀을 때 페이지 최상단으로 튕겨 올라가는 불쾌한 오작동이 발생합니다.

비활성화된 화살표 버튼은 <a> 태그 대신 <button disabled aria-disabled='true'>로 마크업하거나, 링크 태그에서 href 속성을 완전히 제거하고 aria-disabled='true'를 부여하여 더 이상 클릭할 수 없는 상태임을 보조공학 엔진에 명확히 알려주어야 합니다.

페이지 전환 시 초점 관리(Focus Management) 실무 전략

Next.js나 React 기반의 SPA 환경에서 비동기(Ajax)로 페이지네이션을 처리할 때 가장 중요한 것은 '페이지 번호를 클릭한 직후 초점을 어디로 보낼 것인가'입니다.

3페이지 번호를 클릭하여 새로운 게시물 10개가 화면에 로드되었을 때, 초점이 화면 맨 하단의 3번 번호 링크에 그대로 머물러 있으면 시각장애인 사용자는 새로운 게시물이 떴는지조차 알지 못합니다.

페이지 번호 클릭 시 새 데이터 로딩이 완료되면, 자바스크립트를 통해 게시판 목록의 최상단 헤딩(예: <h2 id='board-title' tabindex='-1'>게시물 목록</h2>)으로 초점을 프로그래밍적으로 즉시 이동(boardTitle.focus())시켜야 합니다. 그래야만 스크린리더가 3페이지의 첫 번째 게시물부터 차례대로 낭독을 시작할 수 있습니다.

예외 조건 및 수동 검토 범위

  • 페이지 번호가 100개 이상으로 방대한 경우 입력창을 통해 특정 페이지로 바로 점프할 수 있는 '페이지 번호 직접 입력 폼'을 병행 제공해야 합니다.
  • 무한 스크롤(Infinite Scroll) 방식을 채택할 경우 푸터 영역으로의 키보드 접근이 영구히 차단되는 심각한 결함이 생기므로 페이지네이션 방식이 접근성 면에서 우월합니다.

주요 공식 상세 규격

규격 검토 기준일 2026-08-08

작성 및 검토 책임 정보

  • 작성자: 서호영
  • 실제 수행 역할: 기획·개발·콘텐츠 검토
  • 최초 작성일:
  • 최종 수정일:
  • 검증 기준: 공개 fixture 및 재현 조건

네이티브 HTML, ARIA 명세, 브라우저 및 스크린리더 조합에 따라 실제 보조공학 동작은 차이가 발생할 수 있습니다. 오류를 발견하셨거나 검증 데이터에 보완이 필요한 경우 오류 제보 및 문의 또는 liebe2460@naver.com로 알려주시면 사실 확인 후 정정합니다.