테이블 · 폼 · 시맨틱 HTML
데이터를 행과 열로 구조화하는 테이블의 문법(table, thead/tbody/tfoot, tr/th/td)과 셀 병합(colspan, rowspan), 접근성을 위한 scope/caption을 익힙니다. 사용자로부터 데이터를 입력받는 폼의 모든 것 — form 태그, input의 다양한 type, label, select, textarea, fieldset, 그리고 입력 검증 속성까지. 의미 있는 태그를 사용해 SEO와 접근성에 강한 HTML을 작성합니다. div의 무더기를 header/nav/main/section/article/aside/footer로 대체합니다.
이 강의에서 배우는 것
- 1thead/tbody/tfoot 구조를 이해한다
- 2tr/th/td를 적절히 사용한다
- 3colspan/rowspan으로 셀을 병합한다
- 4scope와 caption으로 접근성을 높인다
- 5form의 action/method 속성과 GET/POST 차이를 이해한다
- 6input의 다양한 type(text/email/password/checkbox/radio/file/date 등)을 적재적소에 사용한다
- 7label로 입력 요소와 설명을 연결한다 (접근성)
- 8fieldset/legend로 폼을 그룹화한다
- 9required/pattern/min/max 같은 검증 속성을 적용한다
- 10비시맨틱 div와 시맨틱 태그의 차이를 설명한다
- 11header/nav/main/section/article/aside/footer를 적절히 배치한다
- 12section vs article을 구분한다
- 13time/address/figure 같은 보조 시맨틱 태그를 활용한다
테이블
데이터를 행과 열로 구조화하는 테이블의 문법(table, thead/tbody/tfoot, tr/th/td)과 셀 병합(colspan, rowspan), 접근성을 위한 scope/caption을 익힙니다.
1. 테이블이란
행(row)과 열(column)로 이루어진 격자에 데이터를 정렬해 표시합니다. 엑셀 표를 HTML로 표현한다고 생각하면 됩니다.
테이블은 데이터 표현용입니다. 페이지 레이아웃에는 절대 사용하지 마세요 — Flexbox/Grid가 올바른 도구입니다.
2. 기본 테이블 구조
<table>
<thead>
<tr>
<th>이름</th>
<th>나이</th>
<th>직업</th>
</tr>
</thead>
<tbody>
<tr>
<td>홍길동</td>
<td>25</td>
<td>학생</td>
</tr>
<tr>
<td>김철수</td>
<td>30</td>
<td>개발자</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan="3">총 2명</td>
</tr>
</tfoot>
</table>3. thead / tbody / tfoot
| 태그 | 역할 |
|---|---|
| <thead> | 머리글 행 — 열 제목 |
| <tbody> | 본문 데이터 행 |
| <tfoot> | 바닥글 — 합계·요약 |
4. colspan — 열 병합
<tr>
<td>수학</td>
<td colspan="2">영어 (2시간)</td> <!-- 가로 2칸 병합 -->
</tr>5. rowspan — 행 병합
<tr>
<td rowspan="2">홍길동</td> <!-- 세로 2칸 병합 -->
<td>수학</td>
<td>90</td>
</tr>
<tr>
<td>영어</td>
<td>85</td>
</tr>6. scope 속성 (접근성)
<th scope="col">이름</th> <!-- 열 제목 -->
<th scope="row">1반</th> <!-- 행 제목 -->스크린리더가 테이블을 올바르게 읽도록 th에 scope를 지정합니다.
7. caption — 테이블 제목
<table>
<caption>2026년 1분기 판매 실적</caption>
<thead>...</thead>
</table>폼 (Form)
사용자로부터 데이터를 입력받는 폼의 모든 것 — form 태그, input의 다양한 type, label, select, textarea, fieldset, 그리고 입력 검증 속성까지.
1. form 태그
<form action="처리할 URL" method="get 또는 post">
<!-- 입력 요소들 -->
</form>GET vs POST
<!-- GET: URL에 데이터 노출, 검색 등 -->
<form action="/search" method="get">
<input type="text" name="query">
<button type="submit">검색</button>
</form>
<!-- 제출 시 URL: /search?query=값 -->
<!-- POST: URL에 노출 X, 회원가입·로그인 -->
<form action="/login" method="post">
<input type="email" name="email">
<input type="password" name="password">
<button type="submit">로그인</button>
</form>2. input 타입별
<input type="text" name="username" placeholder="이름" maxlength="20">
<input type="email" name="email" placeholder="example@email.com">
<input type="password" name="password" minlength="8">
<input type="number" name="age" min="0" max="150" step="1">
<input type="checkbox" name="hobby" value="reading" checked>
<input type="radio" name="gender" value="male">
<input type="file" name="profile" accept="image/*">
<input type="date" name="birthday" min="1900-01-01" max="2026-12-31">
<input type="range" name="rate" min="1" max="10" value="5">
<input type="hidden" name="user_id" value="12345">
<input type="tel" placeholder="010-0000-0000">
<input type="url" placeholder="https://example.com">
<input type="color">
<input type="search" placeholder="검색">3. label
<!-- 방법 1: for + id (권장) -->
<label for="username">이름:</label>
<input type="text" id="username" name="username">
<!-- 방법 2: 감싸기 -->
<label>
이름:
<input type="text" name="username">
</label>라벨을 클릭하면 연결된 입력 요소가 포커스됩니다. 스크린리더도 label을 읽으므로 접근성에 필수.
4. select — 드롭다운
<select name="city">
<option value="">-- 선택하세요 --</option>
<option value="seoul" selected>서울</option>
<option value="busan">부산</option>
</select>
<!-- optgroup으로 그룹화 -->
<select name="job">
<optgroup label="IT 분야">
<option value="dev">개발자</option>
<option value="design">디자이너</option>
</optgroup>
<optgroup label="일반">
<option value="sales">영업</option>
</optgroup>
</select>
<!-- 다중 선택 -->
<select name="skills" multiple size="4">
<option value="html">HTML</option>
<option value="css">CSS</option>
</select>5. textarea — 여러 줄 입력
<label for="message">메시지:</label>
<textarea id="message" name="message" rows="5" cols="40"
placeholder="여기에 입력하세요..." maxlength="500"></textarea>6. button
<button type="submit">제출하기</button>
<button type="reset">다시 작성</button>
<button type="button" onclick="alert('클릭!')">일반 버튼</button>7. fieldset / legend — 폼 그룹화
<form>
<fieldset>
<legend>개인 정보</legend>
<label for="name">이름:</label>
<input type="text" id="name">
</fieldset>
<fieldset>
<legend>계정 정보</legend>
<label for="pw">비밀번호:</label>
<input type="password" id="pw">
</fieldset>
<button type="submit">가입하기</button>
</form>8. 입력 검증 속성
<input type="text" required> <!-- 필수 -->
<input type="text" placeholder="홍길동"> <!-- 힌트 -->
<input type="text" disabled> <!-- 비활성화 -->
<input type="text" value="값" readonly> <!-- 읽기 전용 -->
<input type="text" minlength="2" maxlength="20"> <!-- 길이 -->
<input type="number" min="1" max="150"> <!-- 숫자 범위 -->
<input type="text" pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}"
placeholder="010-1234-5678"> <!-- 정규식 -->시맨틱 HTML
의미 있는 태그를 사용해 SEO와 접근성에 강한 HTML을 작성합니다. div의 무더기를 header/nav/main/section/article/aside/footer로 대체합니다.
1. 시맨틱이란
div vs 시맨틱
<!-- 비시맨틱 (나쁜 예) -->
<div id="header">...</div>
<div id="nav">...</div>
<div id="main">...</div>
<!-- 시맨틱 (좋은 예) -->
<header>...</header>
<nav>...</nav>
<main>...</main>두 코드는 브라우저에서 같아 보일 수 있지만, 시맨틱 방식은 코드의 의미가 훨씬 명확합니다.
2. 왜 시맨틱 HTML?
- SEO: 검색엔진이 페이지 내용을 더 잘 이해 → 검색 순위에 영향
- 접근성: 스크린리더가 페이지 구조를 안내 ("내비게이션 메뉴", "주요 콘텐츠 시작" 등)
- 가독성: 개발자가 코드의 역할을 바로 이해 → 유지보수·협업이 쉬워짐
3. 주요 시맨틱 태그
header
<header>
<h1>사이트 이름</h1>
<nav>...</nav>
</header>페이지 또는 섹션의 머리글. article 안에도 사용 가능.
nav
<nav>
<ul>
<li><a href="/">홈</a></li>
<li><a href="/about">소개</a></li>
</ul>
</nav>주요 내비게이션에만. 본문 중간 일반 링크에는 사용하지 않습니다.
main
페이지의 핵심 내용. 페이지에 하나만 사용.
section vs article
| 태그 | 독립성 | 사용 예 |
|---|---|---|
| <section> | 다른 섹션과 연관된 부분 구획 | 챕터, 탭 패널, 카테고리 묶음 |
| <article> | 독립적으로 의미가 완결되는 콘텐츠 | 블로그 글, 뉴스 기사, 댓글 |
aside
주요 콘텐츠와 간접적으로 관련된 부가 정보. 사이드바, 광고, 관련 글 등.
footer
<footer>
<p>© 2026 홍길동</p>
<address>이메일: hong@example.com</address>
</footer>4. 보조 시맨틱 태그
time
<time datetime="2026-05-10">2026년 5월 10일</time>
<time datetime="2026-05-10T14:30">오후 2시 30분</time>address
<address>
작성자: <a href="mailto:hong@example.com">홍길동</a><br>
서울특별시 강남구 테헤란로 123
</address>5. 전체 페이지 레이아웃 예시
<body>
<header>
<h1>나의 블로그</h1>
<nav>
<ul><li><a href="/">홈</a></li><li><a href="/html">HTML</a></li></ul>
</nav>
</header>
<main>
<section>
<h2>최신 글</h2>
<article>
<header>
<h3>HTML 기초 완전 정복</h3>
<time datetime="2026-05-10">2026-05-10</time>
</header>
<p>본문...</p>
<footer><p>태그: HTML, 기초</p></footer>
</article>
</section>
</main>
<aside>
<h2>카테고리</h2>
<ul><li><a href="/html">HTML (6편)</a></li></ul>
</aside>
<footer>
<p>© 2026 홍길동</p>
<address>hong@example.com</address>
</footer>
</body>6. div와 span은 언제?
시맨틱 태그로 대체할 수 없을 때 사용합니다 — 단순 스타일 적용용 묶음.
<div class="card-grid">
<article>...</article>
<article>...</article>
</div>
<p>가격: <span class="price">35,000원</span> (부가세 포함)</p>댓글 0
아직 댓글이 없습니다. 첫 댓글을 남겨 주세요.
댓글은 회원만 쓸 수 있습니다.
광고·욕설·비방·개인정보·불법 내용이 담긴 댓글은 숨기거나 지웁니다. 댓글은 닉네임과 함께 공개됩니다. 개인정보처리방침