본문으로 건너뛰기
피드

HTML의 `<dl>`이 생각보다 쓸모 많은 이유

frontend 약 6분
vote
0
댓글
북마크

이 글은 HTML의 description list, 즉 `<dl>`, `<dt>`, `<dd>`가 단순 용어 사전용 태그가 아니라 이름-값 쌍 UI를 표현하는 꽤 강력한 시맨틱 도구라고 설명한다. 숙소 편의시설, 요금 내역, 기술 용어 설명, 게임 능력치표처럼 흔한 패턴을 중첩 `<div>` 대신 의미 있는 HTML로 만들 수 있다는 얘기다.

  • 1

    `<dl>`은 이름-값 쌍 또는 이름-값 그룹을 표현하는 HTML 요소임

  • 2

    `<dt>`는 이름, `<dd>`는 값이며 하나의 이름에 여러 값을 붙일 수도 있음

  • 3

    스타일링이 필요하면 `<dt>`와 `<dd>` 그룹을 `<div>`로 감쌀 수 있지만 다른 래퍼는 허용되지 않음

  • 4

    시맨틱 마크업은 스크린리더가 목록 구조를 이해하고 더 나은 탐색 경험을 제공하게 만듦

  • <dl>은 HTML에서 은근히 저평가된 요소라는 게 글의 핵심임

    • 정식 이름은 description list고, 이름-값 쌍을 표현할 때 쓰는 목록임
    • 숙소 편의시설, 월세 청구 항목, 기술 용어집, 상품 스펙, 게임 능력치표처럼 웹 UI에서 엄청 자주 나오는 패턴에 맞음
  • 구성은 생각보다 단순함: <dl>이 전체 목록, <dt>가 이름, <dd>가 값임

    • <dt>는 description term, 즉 항목의 이름 쪽을 맡음
    • <dd>는 description detail, 즉 그 이름에 대응하는 값이나 설명을 맡음
    • <ul><li>가 일반 목록을 만들듯, <dl>·<dt>·<dd>는 이름-값 목록을 만드는 조합임
  • 하나의 이름에 값이 여러 개여도 문제 없음

    • 예를 들어 책 한 권에 저자가 여러 명이면 <dt> 하나 아래에 <dd>를 여러 개 붙일 수 있음
    • 반대로 여러 이름이 하나의 설명을 공유하는 식의 구조도 스펙상 가능해서, 단순한 1:1 테이블보다 표현 범위가 넓음
  • 스타일링 때문에 그룹을 감싸고 싶다면 <div>만 허용됨

    • <dt>와 그에 딸린 <dd>들을 하나의 묶음으로 감싸 레이아웃을 잡을 수 있음
    • 다만 이때 래퍼로 쓸 수 있는 건 <div>뿐이라, 아무 요소나 끼워 넣는 식으로 마크업하면 안 됨

중요

> <dl>은 '용어 사전 전용 태그'가 아님. 라벨과 값이 반복되는 UI라면 꽤 많은 경우에 <div> 뭉치보다 더 정확한 선택지가 될 수 있음.

  • 왜 굳이 시맨틱이 필요하냐는 질문에, 글은 접근성 관점으로 답함

    • 중첩 <div>로도 화면은 비슷하게 만들 수 있지만, 브라우저와 보조기술 입장에선 그냥 텍스트 덩어리로 보일 수 있음
    • <dl>을 쓰면 스크린리더가 '이건 이름-값 목록'이라는 구조를 이해할 여지가 생김
    • 사용자는 목록에 몇 개의 그룹이 있는지, 지금 어디쯤 읽고 있는지, 관심 없으면 통째로 건너뛸 수 있는지 같은 탐색 힌트를 받을 수 있음
  • 저자는 시맨틱 요소를 고를 때 이런 질문을 던져보라고 함

    • '컴퓨터가 이 패턴을 알아볼 수 있다면 사용자에게 어떤 이득이 생길까?'
    • 이득이 하나라도 명확하게 떠오르면, 그 패턴은 별도 시맨틱을 가질 후보라는 얘기임
    • <dl>의 경우 스크린리더 경험 개선이 꽤 직접적인 이득으로 제시됨
  • 단, 모든 브라우저와 스크린리더 조합에서 지원이 완벽한 건 아님

    • 대부분 조합에서는 <dl>의 장점을 얻을 수 있지만, 보편 지원이라고 말하긴 어렵다고 선을 그음
    • 특정 사용 사례에서 fallback이 아쉽다면 <ul> 같은 대안을 선택할 수도 있음
  • 글에서 제일 재밌는 예시는 Dungeons & Dragons 능력치 블록임

    • 능력치, 공격, 특성처럼 겉보기엔 서로 다른 UI가 사실상 전부 이름-값 쌍으로 구성돼 있음
    • 저자는 한 statblock 안에서 <dl> 후보를 5개나 봤다고 함
    • 이 예시가 좋은 이유는 <dl>이 단조로운 용어집뿐 아니라 복잡한 정보 카드에도 적용될 수 있다는 걸 보여주기 때문임

기술 맥락

  • 여기서 중요한 선택은 라벨과 값을 <div> 두 개로 배치할지, <dl>·<dt>·<dd>로 의미를 줄지예요. 화면만 보면 둘 다 비슷하지만, 브라우저와 보조기술이 이해하는 구조는 완전히 달라질 수 있거든요.

  • <dl>을 고르는 이유는 접근성 정보를 HTML 자체에 담을 수 있기 때문이에요. 스크린리더가 이 구조를 목록으로 인식하면 사용자는 항목 개수, 현재 위치, 목록 건너뛰기 같은 탐색상의 도움을 받을 수 있어요.

  • 대안으로는 <ul>이나 중첩 <div>가 있어요. <ul>은 지원이 더 안정적으로 느껴질 수 있지만 이름-값 관계를 직접 표현하진 못하고, <div>는 스타일링은 편하지만 의미가 거의 없어요. 그래서 정보 구조가 명확한 UI라면 <dl>을 먼저 검토할 만해요.

  • 실무에서는 제품 스펙, 결제 내역, 프로필 메타데이터, 설정 요약 화면에서 특히 자주 마주쳐요. 이런 컴포넌트는 디자인 시스템에 한 번 들어가면 여러 화면에 퍼지기 때문에, 처음부터 시맨틱을 맞춰두는 게 나중에 접근성 품질을 유지하기 쉬워요.

프론트엔드에서 접근성은 ARIA를 더하는 일만이 아니라, 이미 있는 HTML 요소를 제대로 고르는 일에서 시작함. `<dl>`은 딱 그런 케이스라서, 디자인 시스템의 상세 정보·메타데이터 UI를 만들 때 다시 볼 만함.

댓글

댓글

댓글을 불러오는 중...

frontend

타입스크립트 7.0, Go 네이티브 포팅으로 빌드가 8~12배 빨라졌다

마이크로소프트가 타입스크립트 7.0을 출시하면서 기존 자바스크립트 기반 구현을 Go로 네이티브 포팅했다. 전체 빌드는 평균 8~12배 빨라졌고, VS코드 빌드는 125.7초에서 10.6초로 줄었으며, 슬랙은 CI 타입 검사 시간을 7.5분에서 1.25분으로 낮췄다.

frontend

타입스크립트 7 공개, 고 포팅으로 빌드가 최대 10배 이상 빨라짐

마이크로소프트가 고(Go)로 네이티브 포팅한 타입스크립트 7을 공개했다. 전체 빌드는 보통 8~12배 빨라지고, VS 코드 코드베이스에서는 125.7초가 10.6초로 줄었으며, 편집기 첫 오류 표시도 17.5초에서 1.3초 미만으로 내려갔다.

frontend

“98% 지원”이 생각보다 별로 안 넉넉한 이유

브라우저 기능 지원률 98%는 얼핏 높아 보이지만, 실제 서비스에서는 2%의 사용자를 깨진 화면 앞에 세우는 숫자일 수 있다는 글이다. 특히 일반 통계와 내 서비스 방문자 분포는 다를 수 있고, 실제 사례로 어떤 사이트는 최신 중첩 CSS 기능 지원 브라우저가 방문자의 약 70%뿐이었다.

frontend

메타, AI가 읽고 쓰는 디자인 시스템 ‘Astryx’ 오픈소스로 공개

메타가 내부 디자인 시스템 Astryx를 오픈소스로 공개했다. React와 StyleX 기반의 150개 이상 접근성 지원 컴포넌트, 디자인 토큰, 테마, 템플릿, CLI를 제공하며, 특히 AI 에이전트가 컴포넌트 구조를 이해하고 UI를 생성·수정할 수 있도록 MCP 서버까지 포함한 점이 핵심이다.

frontend

shadcn/ui, 기본 컴포넌트 라이브러리를 Radix에서 Base UI로 변경

shadcn/ui가 새 프로젝트의 기본 컴포넌트 라이브러리를 Radix가 아니라 Base UI로 바꿨어. Radix 지원은 계속되지만, Base UI가 안정화됐고 주간 다운로드 600만 이상, shadcn/create 신규 프로젝트 선택 비율 2대1이라는 이유로 기본값을 바꾼 거야. 동시에 채팅 UI용 MessageScroller와 관련 컴포넌트, headless 패키지인 @shadcn/react도 공개됐어.