들어가며#
웹 개발을 하다 보면 이런 코드를 마주하게 됩니다:
<div class="header">
<div class="nav">
<div class="nav-item">홈</div>
<div class="nav-item">소개</div>
</div>
</div>
<div class="main">
<div class="article">
<div class="title">제목</div>
<div class="content">내용...</div>
</div>
</div>
<div class="footer">...</div>겉으로 보기엔 문제없어 보이죠? 하지만 이 코드에는 심각한 문제가 숨어 있어요. 스크린 리더 사용자는 이 페이지의 구조를 전혀 파악할 수 없습니다. 검색 엔진도 마찬가지고요.
사실 제가 처음 개발 일을 시작하던 15년쯤 전에는 이런 일도 있었어요. 기존 웹사이트를 리뉴얼하라는 지시를 받고 코드를 열어봤는데, <table> 태그가 겹겹이 중첩되어 있더라고요. 진짜 초보 개발자 시절이라 울면서 작업하던 기억이 나네요 😂 예전에는 테이블로 레이아웃을 잡는 게 흔한 일이었거든요.
지금 생각하면 그때의 테이블 지옥이나, 요즘의 div 지옥이나… 본질은 같아요. 의미 없는 태그로 구조를 만들면 결국 누군가는 고생하게 됩니다.

사진: Pankaj Patel / Unsplash
이 글에서는 시맨틱 HTML이 무엇인지, 왜 중요한지, 그리고 어떻게 올바르게 사용하는지 실전 예제와 함께 알아보겠습니다.
시맨틱 HTML이란?#
의미 있는 마크업#
**시맨틱(Semantic)**은 “의미론적"이라는 뜻이에요. 시맨틱 HTML은 태그 자체가 콘텐츠의 의미를 설명하는 HTML을 말합니다.
<!-- 비시맨틱: 의미 없음 -->
<div class="header">사이트 제목</div>
<!-- 시맨틱: 의미 있음 -->
<header>사이트 제목</header>둘 다 시각적으로는 똑같이 보일 수 있어요. 하지만 브라우저, 스크린 리더, 검색 엔진에게 전달하는 정보는 완전히 다릅니다.
<div>: “여기에 뭔가가 있어요” (의미 없음)<header>: “여기는 머리글 영역이에요” (명확한 의미)
왜 시맨틱 HTML이 중요할까요?#

사진: Vitaly Gariev / Unsplash
1. 접근성 (Accessibility)#
스크린 리더는 시맨틱 태그를 통해 페이지 구조를 파악합니다:
<nav>: “여기는 네비게이션입니다”<main>: “여기가 주요 콘텐츠입니다”<aside>: “여기는 부가 정보입니다”
시각장애인 사용자는 이 정보를 바탕으로 원하는 콘텐츠로 바로 이동할 수 있어요.
2. SEO (검색 엔진 최적화)#
구글, 네이버 같은 검색 엔진은 시맨틱 태그를 통해 콘텐츠의 중요도를 파악합니다:
<article>안의 내용 → 핵심 콘텐츠<aside>안의 내용 → 부가 정보<h1>→ 페이지의 주제
3. 유지보수성#
6개월 후 자신의 코드를 봤을 때:
<!-- 이게 뭐지? -->
<div class="wrapper">
<div class="inner">
<div class="content-area">...</div>
</div>
</div>
<!-- 바로 이해됨 -->
<main>
<article>
<section>...</section>
</article>
</main>핵심 시맨틱 태그 완벽 정리#
문서 구조 태그#
<header> - 머리글 영역#
페이지나 섹션의 도입부를 나타냅니다.
<!-- 페이지 헤더 -->
<header>
<h1>Codeslog</h1>
<nav>...</nav>
</header>
<!-- 아티클 헤더 -->
<article>
<header>
<h2>시맨틱 HTML 가이드</h2>
<p>작성일: 2025-12-23</p>
</header>
<p>본문...</p>
</article>주의: <header>는 페이지당 하나만 있어야 하는 게 아니에요! 각 <article>, <section> 안에도 넣을 수 있습니다.
<nav> - 네비게이션#
주요 탐색 링크를 그룹화합니다.
<nav aria-label="주요 메뉴">
<ul>
<li><a href="/">홈</a></li>
<li><a href="/about">소개</a></li>
<li><a href="/posts">포스트</a></li>
<li><a href="/contact">연락처</a></li>
</ul>
</nav>팁: 페이지에 여러 <nav>가 있다면 aria-label로 구분해주세요.
<nav aria-label="주요 메뉴">...</nav>
<nav aria-label="푸터 링크">...</nav><main> - 주요 콘텐츠#
페이지의 핵심 콘텐츠를 감쌉니다. 페이지당 하나만 사용해야 해요.
<body>
<header>...</header>
<nav>...</nav>
<main>
<!-- 이 페이지의 핵심 내용 -->
<article>...</article>
</main>
<footer>...</footer>
</body><footer> - 바닥글 영역#
페이지나 섹션의 마무리 정보를 담습니다.
<footer>
<p>© 2025 Codeslog. All rights reserved.</p>
<nav aria-label="푸터 링크">
<a href="/privacy">개인정보처리방침</a>
<a href="/terms">이용약관</a>
</nav>
</footer>콘텐츠 구조 태그#

사진: Hal Gatewood / Unsplash
<article> - 독립적인 콘텐츠#
그 자체로 완결된 콘텐츠를 나타냅니다. 블로그 포스트, 뉴스 기사, 댓글 등이 해당돼요.
<article>
<header>
<h2>React Hooks 입문</h2>
<time datetime="2025-12-23">2025년 12월 23일</time>
</header>
<p>React Hooks는 함수형 컴포넌트에서...</p>
<footer>
<p>작성자: Isaac</p>
</footer>
</article>핵심 기준: “이 콘텐츠만 따로 떼어내서 RSS 피드나 다른 곳에 배포할 수 있는가?”
<section> - 주제별 그룹#
주제가 있는 콘텐츠 그룹을 나타냅니다. 보통 제목(<h2> 등)을 포함해요.
<article>
<h1>시맨틱 HTML 가이드</h1>
<section>
<h2>시맨틱 HTML이란?</h2>
<p>...</p>
</section>
<section>
<h2>핵심 태그 정리</h2>
<p>...</p>
</section>
</article><aside> - 부가 콘텐츠#
본문과 관련 있지만 분리해도 되는 콘텐츠입니다.
<main>
<article>
<h1>JavaScript 비동기 처리</h1>
<p>Promise와 async/await를...</p>
<aside>
<h3>💡 알고 계셨나요?</h3>
<p>Promise는 ES6에서 도입되었습니다.</p>
</aside>
</article>
<aside>
<h2>관련 포스트</h2>
<ul>...</ul>
</aside>
</main>article vs section vs div#
이 세 가지를 언제 써야 할지 헷갈리시죠? 간단한 기준이 있어요:
| 상황 | 사용할 태그 |
|---|---|
| 독립적으로 배포 가능한 콘텐츠 | <article> |
| 주제가 있는 콘텐츠 그룹 (제목 있음) | <section> |
| 스타일링만을 위한 그룹 | <div> |
<!-- 블로그 포스트 목록 페이지 -->
<main>
<h1>최근 포스트</h1>
<!-- 각 포스트는 독립적 → article -->
<article>
<h2>포스트 제목 1</h2>
<p>요약...</p>
</article>
<article>
<h2>포스트 제목 2</h2>
<p>요약...</p>
</article>
</main>
<!-- 포스트 상세 페이지 -->
<article>
<h1>포스트 제목</h1>
<!-- 주제별 구분 → section -->
<section>
<h2>소개</h2>
<p>...</p>
</section>
<section>
<h2>본론</h2>
<p>...</p>
</section>
</article>텍스트 레벨 시맨틱#
제목 태그 <h1> ~ <h6>#
계층 구조를 지켜야 합니다!
<!-- ❌ 잘못된 예: 레벨 건너뛰기 -->
<h1>제목</h1>
<h3>소제목</h3> <!-- h2를 건너뜀 -->
<!-- ✅ 올바른 예 -->
<h1>제목</h1>
<h2>소제목</h2>
<h3>세부 제목</h3>
사진: Maarten van den Heuvel / Unsplash
<time> - 날짜/시간#
기계가 읽을 수 있는 형식으로 날짜를 표시합니다.
<time datetime="2025-12-23">2025년 12월 23일</time>
<time datetime="2025-12-23T14:30:00+09:00">오후 2시 30분</time><figure>와 <figcaption> - 그림과 설명#
이미지, 다이어그램, 코드 블록 등에 설명을 붙일 때 사용합니다.
<figure>
<img src="chart.png" alt="2024년 매출 추이 그래프">
<figcaption>그림 1. 2024년 분기별 매출 추이</figcaption>
</figure>기타 유용한 태그들#
<!-- 강조 (의미적) -->
<strong>매우 중요한 내용</strong> <!-- 강한 강조 -->
<em>강조하고 싶은 내용</em> <!-- 약한 강조 -->
<!-- 스타일링만 (비시맨틱) -->
<b>굵게</b> <!-- strong 대신 쓰지 마세요 -->
<i>기울임</i> <!-- em 대신 쓰지 마세요 -->
<!-- 인용 -->
<blockquote cite="https://example.com">
인용문입니다.
</blockquote>
<!-- 약어 -->
<abbr title="HyperText Markup Language">HTML</abbr>
<!-- 코드 -->
<code>const x = 1;</code>
<!-- 키보드 입력 -->
<kbd>Ctrl</kbd> + <kbd>C</kbd>실전 예제: 블로그 페이지 구조화#
이론은 충분히 배웠어요. 이제 실제 블로그 페이지를 시맨틱하게 구조화해볼게요.
Before: div 지옥#
<div class="wrapper">
<div class="header">
<div class="logo">Codeslog</div>
<div class="nav">
<div class="nav-item"><a href="/">홈</a></div>
<div class="nav-item"><a href="/posts">포스트</a></div>
</div>
</div>
<div class="content">
<div class="post">
<div class="post-title">시맨틱 HTML 가이드</div>
<div class="post-date">2025-12-23</div>
<div class="post-body">
<div class="section">
<div class="section-title">소개</div>
<div class="text">...</div>
</div>
</div>
</div>
<div class="sidebar">
<div class="widget">
<div class="widget-title">최근 포스트</div>
<div class="widget-list">...</div>
</div>
</div>
</div>
<div class="footer">
<div class="copyright">© 2025 Codeslog</div>
</div>
</div>After: 시맨틱 HTML#
<body>
<header>
<a href="/" class="logo">Codeslog</a>
<nav aria-label="주요 메뉴">
<ul>
<li><a href="/">홈</a></li>
<li><a href="/posts">포스트</a></li>
</ul>
</nav>
</header>
<main>
<article>
<header>
<h1>시맨틱 HTML 가이드</h1>
<time datetime="2025-12-23">2025년 12월 23일</time>
</header>
<section>
<h2>소개</h2>
<p>...</p>
</section>
<section>
<h2>핵심 태그</h2>
<p>...</p>
</section>
<footer>
<p>작성자: Isaac</p>
</footer>
</article>
<aside>
<section>
<h2>최근 포스트</h2>
<ul>...</ul>
</section>
</aside>
</main>
<footer>
<p>© 2025 Codeslog. All rights reserved.</p>
</footer>
</body>개선된 점:
- ✅ 스크린 리더가 구조를 파악할 수 있음
- ✅ 검색 엔진이 주요 콘텐츠를 식별 가능
- ✅ 코드만 봐도 페이지 구조가 명확함
- ✅ CSS 클래스 의존도 감소
시맨틱 HTML과 접근성#

사진: Muhammad Asim / Unsplash
랜드마크(Landmark) 역할#
시맨틱 태그는 자동으로 ARIA 랜드마크 역할을 가집니다:
| HTML 태그 | ARIA 역할 |
|---|---|
<header> | banner (최상위일 때) |
<nav> | navigation |
<main> | main |
<aside> | complementary |
<footer> | contentinfo (최상위일 때) |
<section> | region (제목이 있을 때) |
<article> | article |
스크린 리더 사용자는 이 랜드마크로 빠르게 이동할 수 있어요:
“네비게이션으로 이동” →
<nav>로 점프 “메인 콘텐츠로 이동” →<main>으로 점프
ARIA와의 관계#
시맨틱 HTML을 사용하면 ARIA 속성이 거의 필요 없어요:
<!-- 불필요한 ARIA -->
<div role="navigation">...</div>
<!-- 시맨틱 HTML로 충분 -->
<nav>...</nav>
<!-- 불필요한 ARIA -->
<div role="main">...</div>
<!-- 시맨틱 HTML로 충분 -->
<main>...</main>ARIA 첫 번째 규칙: 시맨틱 HTML로 해결할 수 있다면, ARIA를 사용하지 마세요!
흔한 실수와 해결법#
1. div 남용#
<!-- ❌ -->
<div class="card">
<div class="card-header">제목</div>
<div class="card-body">내용</div>
</div>
<!-- ✅ -->
<article class="card">
<header class="card-header">
<h3>제목</h3>
</header>
<p class="card-body">내용</p>
</article>2. 제목 레벨 건너뛰기#
<!-- ❌ h2 없이 h3 사용 -->
<h1>페이지 제목</h1>
<h3>소제목</h3>
<!-- ✅ 순서대로 사용 -->
<h1>페이지 제목</h1>
<h2>소제목</h2>3. 스타일 목적으로 시맨틱 태그 사용#
<!-- ❌ 들여쓰기만을 위해 blockquote 사용 -->
<blockquote>
이건 인용이 아니라 그냥 들여쓰기가 필요해서요
</blockquote>
<!-- ✅ CSS로 스타일링 -->
<p class="indented">
이건 인용이 아니라 그냥 들여쓰기가 필요해서요
</p>4. 하나의 main에 여러 article 대신 여러 section#
<!-- ❌ 독립적인 콘텐츠인데 section 사용 -->
<main>
<section>
<h2>포스트 1</h2>
<p>...</p>
</section>
<section>
<h2>포스트 2</h2>
<p>...</p>
</section>
</main>
<!-- ✅ 독립적인 콘텐츠는 article -->
<main>
<article>
<h2>포스트 1</h2>
<p>...</p>
</article>
<article>
<h2>포스트 2</h2>
<p>...</p>
</article>
</main>시맨틱 HTML 체크리스트#
포스트를 작성하거나 코드 리뷰할 때 이 체크리스트를 확인해보세요:
문서 구조#
-
<header>로 페이지/섹션 머리글 감싸기 -
<nav>로 주요 네비게이션 감싸기 -
<main>으로 핵심 콘텐츠 감싸기 (페이지당 1개) -
<footer>로 바닥글 감싸기 -
<aside>로 부가 콘텐츠 분리
콘텐츠 구조#
- 독립적인 콘텐츠에
<article>사용 - 주제별 그룹에
<section>사용 - 스타일링만 필요한 곳에
<div>사용
제목#
-
<h1>페이지당 하나만 - 제목 레벨 순서 지키기 (h1 → h2 → h3)
- 모든 섹션에 적절한 제목 포함
텍스트#
- 중요한 내용은
<strong> - 강조는
<em> - 날짜/시간은
<time datetime="..."> - 약어는
<abbr title="...">
이미지#
- 모든
<img>에 의미있는alt속성 - 설명이 필요한 이미지는
<figure>+<figcaption>
마치며#

사진: Arnold Francisca / Unsplash
시맨틱 HTML은 어렵지 않아요. 핵심은 간단합니다:
“이 콘텐츠가 무엇인지 태그로 설명하자”
처음에는 어떤 태그를 써야 할지 고민될 수 있어요. 하지만 몇 번 연습하다 보면 자연스럽게 습관이 됩니다.
시맨틱 HTML을 사용하면:
- 접근성 향상: 스크린 리더 사용자가 페이지를 이해할 수 있어요
- SEO 개선: 검색 엔진이 콘텐츠를 더 잘 파악해요
- 유지보수성: 코드가 자기 문서화(self-documenting)됩니다
- 미래 대비: 웹 표준을 따르면 브라우저 호환성이 좋아져요
다음에 <div>를 쓰려고 할 때, 잠깐 멈추고 생각해보세요:
“이 콘텐츠를 더 잘 설명하는 태그가 있을까?”
우리가 작성하는 코드 한 줄이 누군가에게는 세상을 여는 문이 될 수 있어요. 더 나은 웹을 함께 만들어가요! 🚀
