본문으로 건너뛰기
피드

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

요즘 픽셀 폰트가 그냥 복고 감성이 아닌 이유

1990년대 기기 화면 느낌을 현대 폰트 시스템으로 재해석한 픽셀 폰트 몇 가지를 소개한 글이다. 핵심은 예쁜 복고풍 글자 모양만이 아니라, 실제 제품에서 쓸 수 있게 기준선, 자간, 메타데이터, 세로 메트릭까지 챙기는지가 중요하다는 점이다.

frontend

HTML을 캔버스 안에 넣는 데모 모음이 등장함

구글 크롬 랩스 저장소에 HTML-in-Canvas 관련 데모와 프레임워크 지원 목록이 정리됐다. Duck Hunt 스타일 폼, 흔들리는 버튼, 셰이더 기반 페이지 전환, 천처럼 매달린 폼 같은 실험적 예제가 포함돼 있고 Three.js와 PlayCanvas 쪽 샘플도 연결돼 있다.

frontend

싱글 페이지 앱이 웹을 너무 비싸게 만들었다는 불평

이 글은 싱글 페이지 앱(SPA)이 사용자 경험을 좋게 만든다는 명분 아래 웹의 초기 로딩 비용, 도구 복잡도, 개발 진입 장벽을 키웠다고 비판한다. 페이스북 로그인 페이지의 CSS 3.8MB, 레딧 몇 개 클릭 후 33MB 다운로드 같은 숫자를 들며, 지금의 프론트엔드 생태계가 사람보다 대기업의 요구에 맞춰져 있다고 주장한다.

frontend

네이티브로 끝까지 가려다 텍스트에서 막힌 macOS 개발자의 고백

20년 가까이 macOS와 iOS 네이티브 개발을 해온 작성자가 SwiftUI, AppKit, TextKit 2로 마크다운 채팅 UI를 만들다 결국 WebKit과 Electron 쪽이 훨씬 낫다는 결론에 도달한 글이다. 문제는 성능 하나가 아니라 선택, 스트리밍, 스크롤, 접근성, 텍스트 상호작용 같은 ‘사용자가 당연히 기대하는 기본기’가 네이티브 조합에서 계속 깨진다는 점이다.

frontend

Tailwind를 떠나며 다시 CSS 구조를 배운 이야기

Julia Evans가 몇 년간 써온 Tailwind를 걷어내고, 의미 있는 HTML과 순수 CSS로 사이트를 다시 정리한 경험을 공유했다. 핵심은 Tailwind를 단순히 버린 게 아니라, Tailwind가 줬던 제약과 시스템을 CSS 코드베이스 안에서 직접 재구성했다는 점이다.