HTML 입문: 시맨틱 문서와 접근 가능한 폼 만들기

··설명 약 8분·작성: 해비·블로그 소개

시맨틱 HTML 문서와 라벨이 연결된 폼을 어떻게 만드나요?

HTML은 header·nav·main·section·footer로 영역의 의미를 나눕니다. 폼은 label의 for와 input의 id를 연결해, 라벨을 눌러도 입력창에 초점이 가도록 만듭니다.

공식 문서 참고: W3C WAI: 시맨틱 HTML로 페이지 영역 구성 · W3C WAI: label과 폼 입력을 명시적으로 연결

독립 실습: 한 파일로 문서와 폼 확인하기

HTML 입문: 시맨틱 문서와 접근 가능한 폼 만들기 · 독립 실습

이메일을 잘못 입력한 뒤 확인을 눌러 label 연결과 브라우저의 형식 검증을 확인하세요.

예제 크게 보기 (새 탭)

독자 질문: 시맨틱 문서와 라벨이 연결된 폼을 처음부터 어떻게 만들고 확인할까요? 앞선 TaskFlow 파일은 필요하지 않습니다. 빈 폴더에 practice.html을 만들고 아래 전체 코드를 저장한 뒤 브라우저에서 엽니다.

<!doctype html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>문의 폼 연습</title>
</head>
<body>
  <header>
    <nav aria-label="주요 메뉴"><a href="#contact">문의하기</a></nav>
  </header>
  <main>
    <h1>서비스 안내</h1>
    <section id="contact">
      <h2>문의하기</h2>
      <form>
        <label for="email">이메일</label>
        <input id="email" name="email" type="email" required>
        <button type="submit">확인</button>
      </form>
    </section>
  </main>
  <footer><p>연습 페이지</p></footer>
</body>
</html>
  1. 위쪽 ‘문의하기’ 링크를 선택하면 id="contact"인 영역으로 이동합니다. 이동을 담당하므로 링크를 사용했습니다.
  2. ‘이메일’ 글자를 클릭하면 입력 칸에 초점이 이동합니다. label의 for와 input의 id가 email로 일치하기 때문입니다.
  3. 빈 칸 또는 올바르지 않은 이메일 형식으로 ‘확인’을 누르면 브라우저의 기본 입력 검사가 제출을 막는지 확인합니다. 이 파일에는 서버가 연결되지 않았으므로 실제 문의는 전송하지 않습니다.
  4. DevTools Elements에서 header, nav, main, section, form, footer 순서와 h1 다음 h2를 확인합니다.

완료 기준: 파일 하나를 열어 링크 이동, 라벨 클릭, 기본 입력 검사, 문서 구조를 직접 설명할 수 있습니다. 실제 주소나 개인정보 대신 예시 값을 사용합니다.

준비

별도 Node.js나 npm이 필요하지 않습니다.

준비할 것은 다음 세 가지입니다.

VS Code
브라우저
작업 폴더

폴더를 만듭니다.

taskflow-publishing/
├─ index.html
└─ style.css

HTML 기본 문서

<!doctype html>
<html lang="ko">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1.0"
    />
    <title>TaskFlow</title>
    <link
      rel="stylesheet"
      href="./style.css"
    />
  </head>
  <body>
    <main>
      <h1>TaskFlow</h1>
    </main>
  </body>
</html>

lang

lang="ko"는 문서의 기본 언어가 한국어라는 의미입니다.

화면에 보이지 않지만 브라우저와 보조기술이 문서를 이해하는 데 사용합니다.

charset

UTF-8을 지정해 한글과 다양한 문자를 안정적으로 처리합니다.

viewport

모바일 브라우저에서 실제 화면 폭을 기준으로 반응형 CSS가 동작하도록 합니다.

시맨틱 HTML

다음처럼 모든 영역을 div로 만들 수도 있습니다.

<div class="header">
  ...
</div>
<div class="main">
  ...
</div>

하지만 문서 역할을 이미 설명하는 HTML 요소가 있다면 이를 먼저 사용합니다.

<header>
  ...
</header>


<main>
  ...
</main>


<footer>
  ...
</footer>

시맨틱 HTML은 검색 엔진만을 위한 기술이 아닙니다. 브라우저, 보조기술, 개발자가 문서 구조를 이해하는 공통 기준입니다.

시맨틱 요소로 영역의 역할을 구분하고, 입력창에는 연결된 label을 제공합니다.
개념 설명용 일러스트. 시맨틱 요소로 영역의 역할을 구분하고, 입력창에는 연결된 label을 제공합니다. 이미지 원본 열기

header와 nav

<header>
  <a href="/">
    TaskFlow
  </a>


  <nav aria-label="주요 메뉴">
    <a href="#features">기능</a>
    <a href="#contact">문의</a>
  </nav>
</header>

nav가 여러 개라면 aria-label로 목적을 구분하는 것이 도움이 됩니다.

main

한 페이지의 핵심 콘텐츠는 main에 둡니다.

<main>
  <section>
    <h1>오늘의 작업을 정리하세요</h1>
    <p>
      TaskFlow는 해야 할 일을 빠르게 정리하는 서비스입니다.
    </p>
  </section>
</main>

일반적인 문서에서는 main landmark를 하나만 사용하는 것이 이해하기 쉽습니다.

section과 heading

section은 주제가 있는 문서 영역에 사용합니다.

<section id="features">
  <h2>주요 기능</h2>
  <p>작업 추가, 완료, 정리를 한 화면에서 관리합니다.</p>
</section>

section을 단순 스타일 wrapper처럼 사용하기보다 heading과 함께 명확한 주제를 갖도록 구성합니다.

heading 순서

h1
└─ h2
   └─ h3

글자 크기를 줄이기 위해 h4로 건너뛰는 식으로 사용하지 않습니다.

크기는 CSS가 담당하고 heading level은 문서 구조를 담당합니다.

접근 가능한 폼

문의 폼을 만들어 보겠습니다.

<form>
  <div>
    <label for="name">
      이름
    </label>
    <input
      id="name"
      name="name"
      type="text"
      autocomplete="name"
    />
  </div>


  <div>
    <label for="email">
      이메일
    </label>
    <input
      id="email"
      name="email"
      type="email"
      autocomplete="email"
    />
  </div>


  <div>
    <label for="message">
      문의 내용
    </label>
    <textarea
      id="message"
      name="message"
      rows="5"
    ></textarea>
  </div>


  <button type="submit">
    문의 보내기
  </button>
</form>

label의 for와 input의 id가 같아야 합니다.

라벨 텍스트를 클릭하면 input에 focus가 이동하는지도 확인합니다.

placeholder는 label을 대신하지 않습니다

<input
  type="email"
  placeholder="이메일"
/>

placeholder는 입력 후 사라질 수 있고 label과 역할이 다릅니다.

입력 필드가 무엇인지 설명하는 label은 유지합니다.

link와 button

링크는 이동을 담당합니다.

<a href="/pricing">
  요금제 보기
</a>

버튼은 동작을 실행합니다.

<button type="submit">
  문의 보내기
</button>

디자인 때문에 anchor와 button의 의미를 뒤섞지 않습니다.

DevTools로 구조 확인

브라우저에서 index.html을 연 뒤 DevTools Elements를 확인합니다.

다음 순서가 실제 DOM에도 존재하는지 봅니다.

header
main
  section
  section
  form
footer

Elements에서 잘못 중첩된 요소나 예상과 다른 DOM 구조가 없는지 확인합니다.

자주 발생하는 오류

CSS가 연결되지 않습니다

href 경로를 확인합니다.

<link
  rel="stylesheet"
  href="./style.css"
/>

Network 탭에서 style.css 요청이 404인지 확인합니다.

label을 클릭해도 input에 focus가 안 갑니다

for와 id가 같은지 확인합니다.

heading을 디자인 용도로 사용합니다

문서 구조를 먼저 정하고 글자 크기는 다음 회차 CSS에서 조절합니다.

학습 완료 체크리스트

  • HTML 기본 문서를 만들 수 있습니다.
  • header, nav, main, section, footer 역할을 설명할 수 있습니다.
  • heading 순서를 문서 구조 기준으로 사용할 수 있습니다.
  • label과 input을 연결할 수 있습니다.
  • link와 button을 구분할 수 있습니다.
  • DevTools Elements에서 DOM 구조를 확인할 수 있습니다.

독립 실습은 여기서 마칠 수 있습니다. 아래 선택 실습은 TaskFlow 프로젝트 파일로 진행합니다.

선택 실습: 할 일 앱에 적용하기

TaskFlow는 간단한 서비스 화면에서 시작해 할 일 앱으로 이어 만드는 예제입니다. 이 선택 실습에서는 HTML과 CSS로 이번 화면을 만듭니다.

시맨틱 문서 구조와 label로 연결한 이메일 문의 폼을 만듭니다.

선택: 연재 프로젝트와 전체 자료

연재 프로젝트를 이어 만드는 분을 위한 자료입니다. 이 글의 개념과 예제만 찾으셨다면 필요한 파일과 실행 방법만 펼쳐보세요.

TaskFlow 프로젝트 적용

HTML 입문: 시맨틱 문서와 접근 가능한 폼 만들기 · 단계별 TaskFlow

TaskFlow 누적 1단계입니다. 이메일을 잘못 입력한 뒤 확인을 눌러 label 연결과 브라우저의 형식 검증을 확인하세요.

예제 크게 보기 (새 탭)

실행 가능한 시작본과 이번 단계

이 글은 TaskFlow 웹 퍼블리싱의 첫 단계입니다. 빈 taskflow-publishing 폴더에 아래 index.html과 style.css를 만들거나, 이번 단계 시작 ZIP을 새 폴더에 풀어 시작하세요. 이전 글의 완료 파일은 필요 없습니다. 이번 단계 완료 ZIP은 작성 결과와 비교할 때 사용합니다.

전체 HTML과 최소 CSS로 시맨틱 문서와 문의 폼을 만듭니다. VS Code와 브라우저, 파일을 만들고 저장할 수 있는 작업 폴더를 준비하세요.

  1. index.html: 이 파일의 기존 내용을 아래 완료 파일 전체와 대조하여 교체합니다. 다른 파일은 유지합니다.
  2. style.css: 이 파일의 기존 내용을 아래 완료 파일 전체와 대조하여 교체합니다. 다른 파일은 유지합니다.

짧은 코드 예제는 변경 위치를 설명합니다. 파일 전체를 작성하거나 교체할 때는 완료 파일 전체를 사용하세요. 생략 표시가 있는 부분 코드를 파일 전체로 저장하지 않습니다.

실행: ZIP의 index.html을 브라우저에서 엽니다. 외부 서버나 npm 설치 없이 로컬 HTML·CSS·이미지를 사용합니다. 문의 폼은 서버 전송을 연결하지 않은 문서 예제입니다. 연습 값만 사용하고 입력 형식을 확인합니다.

직접 확인할 결과: header·nav·main·footer가 있고 이름·이메일·문의 내용의 label이 각 입력에 연결됩니다.

전체 파일·코드 보기

완료 파일 전체

index.html

index.html 전체 파일

<!DOCTYPE html>
<html lang="ko">
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
  <title>
   TaskFlow
  </title>
  <link href="./style.css" rel="stylesheet"/>
 </head>
 <body>
  <header>
   <a href="#home">
    TaskFlow
   </a>
   <nav aria-label="주요 메뉴">
    <a href="#features">
     기능
    </a>
    <a href="#contact">
     문의
    </a>
   </nav>
  </header>
  <main id="home">
   <section>
    <h1>
     해야 할 일을 한눈에 정리하세요
    </h1>
    <p>
     TaskFlow는 오늘의 작업을 빠르게 정리하는 서비스입니다.
    </p>
   </section>
   <section id="features">
    <h2>
     주요 기능
    </h2>
    <article>
     <h3>
      빠른 작업 추가
     </h3>
     <p>
      해야 할 일을 바로 기록할 수 있습니다.
     </p>
    </article>
   </section>
   <section id="contact">
    <h2>
     문의하기
    </h2>
    <form>
     <div>
      <label for="name">
       이름
      </label>
      <input autocomplete="name" id="name" name="name" type="text"/>
     </div>
     <div>
      <label for="email">
       이메일
      </label>
      <input autocomplete="email" id="email" name="email" type="email"/>
     </div>
     <div>
      <label for="message">
       문의 내용
      </label>
      <textarea id="message" name="message" rows="5"></textarea>
     </div>
     <button type="submit">
      문의 보내기
     </button>
    </form>
   </section>
  </main>
  <footer>
   <p>
    © TaskFlow
   </p>
  </footer>
 </body>
</html>

style.css

이번 단계에서는 CSS 연결을 확인할 수 있는 최소 스타일을 사용합니다.

style.css 전체 파일

body {
  font-family: Arial, sans-serif;
}

위 파일과 ZIP의 동명 파일은 동일합니다. 회차별 README·CHANGES 문서는 ZIP에 포함합니다. 생성 산출물·node_modules·실제 환경 변수 파일은 포함하지 않습니다.

실행 확인

  • index.html을 브라우저에서 엽니다.
  • CSS가 연결되는지 확인합니다.
  • Tab 키로 링크, input, button에 이동합니다.
  • label을 클릭했을 때 input에 focus가 이동하는지 확인합니다.
  • DevTools Elements에서 시맨틱 구조를 확인합니다.

완료 체크포인트

publishing-step-01-html-form

다음 학습

원문에서 안내한 다른 학습 순서 (선택)

다음 글에서는 박스 모델·선택자·캐스케이드를 이용해 TaskFlow의 기본 레이아웃과 카드 스타일을 만듭니다.

글 소개·학습 준비·전체 목차
HTML 입문: 시맨틱 문서와 접근 가능한 폼 만들기 대표 일러스트

웹 퍼블리싱 · 1 / 15 · 필수 최초 진입 · HTML 시맨틱 문서와 폼

HTML 문서는 header·nav·main·section·footer로 영역의 의미를 구분하고, 폼은 label의 for와 input의 id를 같게 연결해 작성합니다. 파일을 브라우저에서 열어 링크 이동·라벨 초점·기본 입력 검사를 확인하면 문서와 폼의 구조를 직접 설명할 수 있습니다.

이번 글에서는 VS Code에서 HTML/CSS 파일을 만들고 브라우저로 확인하는 것부터 시작해 header, nav, main, section, form, footer를 사용하는 시맨틱 문서와 label이 연결된 접근 가능한 폼을 작성합니다.

상단의 practice.html 한 파일로 문서와 폼을 확인합니다. 하단에서는 같은 원칙으로 15회 동안 발전시킬 TaskFlow 정적 서비스 화면의 첫 체크포인트를 만듭니다.

이번 글에서 배우는 내용

  • HTML 기본 문서 구조
  • lang, charset, viewport
  • header·nav·main·section·footer
  • heading 순서
  • form·label·input·button
  • link와 button의 역할 차이
  • DevTools Elements 확인
  • TaskFlow 정적 화면 첫 구성

먼저 알아야 할 내용

파일·폴더를 만들고 HTML을 UTF-8로 저장할 수 있으면 됩니다. VS Code와 브라우저 외에 별도 런타임은 필요 없습니다.

목차

이 글이 도움이 되었나요?

조회 중

읽음 기록

읽음 — / 전체 15개 · 필수 13개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기