표의 본문 행 그룹. 데이터 셀들이 들어가는 컨테이너. thead가 헤더 행, tbody가 데이터 행의 시맨틱 분리.
SEO 관점에서 tbody 자체의 직접 영향은 작지만 — thead와의 분리가 검색엔진의 표 추출 정확도에 기여.
GEO 관점에서 AI가 표 데이터를 추출할 때 tbody의 행들이 진짜 데이터임을 명확히 인지. thead의 라벨과 결합되어 "Basic의 월 요금은 9,900원" 같은 구조화된 데이터 추출.
A11y 관점에서 스크린리더의 표 모드에서 헤더/본문 구분이 명확. 사용자가 헤더 행을 다시 확인할 때 thead로 점프, 데이터 탐색에는 tbody.
자주 보는 안티패턴: tbody 없이 tr 직접(브라우저 자동 보정이지만 명시적 tbody가 안전), 데이터 그룹화 가능한 표에 여러 tbody 활용 안 함(시맨틱 그룹화 기회 손실).
여러 tbody로 그룹화 — table당 여러 tbody 허용. 행 그룹을 시맨틱으로 분리. 예: 지역별 매출 표에서 "수도권", "강원·충청" 같은 지역 그룹을 각각 tbody로. 시각적으로는 행 사이 간격을 tbody 단위로 추가 가능.
<th colspan="N">을 tbody의 첫 행에 두는 패턴 — 행 그룹의 라벨. 위 예시처럼 "수도권"을 tbody 첫 행 + colspan으로 전체 너비. 시각·시맨틱 모두 그룹 헤더.
<table>의 자식 순서 — thead → tbody → tfoot. tfoot은 합계 행이라 tbody 뒤. 다만 과거 사양에서는 tfoot이 tbody 앞 위치도 허용했고, 시각적으로는 합계가 표 맨 아래로 자동 배치되어 순서 의존성이 낮다.
display: contents 적용 — 시리즈 #7의 디자인 자유 패턴. tbody { display: contents }로 시각만 변경, 시맨틱 보존.
페이지네이션·정렬·필터링 — 대용량 데이터 표에서 클라이언트 측 페이지네이션은 tbody의 행을 동적 교체. TanStack Table 같은 라이브러리가 시맨틱 tbody 유지하면서 행만 교체.
긴 표의 반응형 패턴 — 모바일에서 행 단위로 카드로 변환. CSS로 td { display: block } 또는 data-label 속성 활용. 시맨틱은 tbody·tr·td 보존.