๐ฆด FrontendDevGuide0002 — HTML ์์ ์ ๋ณต A-Z
๐ก ์ด ๊ธ์ ์ฝ๊ณ ๋๋ฉด...
HTML ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ถํฐ ์๋งจํฑ ํ๊ทธ, ํผ, ์ ๊ทผ์ฑ, SEO๊น์ง —
ํ์ ์์ HTML์ ์์ ์๊ฒ ์์ฑํ ์ ์๋ ์์ค์ด ๋ฉ๋๋ค!
๐ ์์ ํ์ต ๊ธฐ๊ฐ: 2~3์ฃผ | ๋์ด๋: โญโญโโโ | ์ ์ ์ง์: ์ธํฐ๋ท ๊ธฐ์ด (Guide0001)
๐ 1. HTML์ด๋? — ์นํ์ด์ง์ ๋ผ๋
HTML(HyperText Markup Language)์ ์นํ์ด์ง์ ๊ตฌ์กฐ(๋ผ๋)๋ฅผ ๋ง๋๋ ์ธ์ด์
๋๋ค.
"๋งํฌ์
์ธ์ด"๋ผ๋ ์ด๋ฆ์ฒ๋ผ, ํ๊ทธ(Tag)๋ฅผ ์ฌ์ฉํด์ ์ฝํ
์ธ ์ ์๋ฏธ๋ฅผ ๋ถ์ฌํฉ๋๋ค.
๐ ์ง์ผ๋ก ๋น์ ํ๋ฉด:
HTML = ๊ฑด๋ฌผ์ ๊ณจ์กฐ (๊ธฐ๋ฅ, ๋ฒฝ, ๋ฐฉ ๋ฐฐ์น — ๊ตฌ์กฐ)
CSS = ์ธํ ๋ฆฌ์ด (์๊น, ๋ฒฝ์ง, ๊ฐ๊ตฌ ๋ฐฐ์น — ๋์์ธ)
JavaScript = ์ ๊ธฐ·์๋·์๋๋ฌธ (๋์, ๊ธฐ๋ฅ)
๐ ํ๊ทธ(Tag)๋?
HTML์ ๊บฝ์ ๊ดํธ(<>)๋ก ๊ฐ์ธ์ง ํ๊ทธ๋ก ์ฝํ ์ธ ๋ฅผ ํ์ํฉ๋๋ค.
๋๋ถ๋ถ์ ํ๊ทธ๋ ์ฌ๋ ํ๊ทธ์ ๋ซ๋ ํ๊ทธ ์์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค:
<h1>์๋ ํ์ธ์</h1> — ์ฌ๋ ํ๊ทธ / ๋ซ๋ ํ๊ทธ
์ผ๋ถ ํ๊ทธ๋ ๋จ๋ ์ฌ์ฉ: <img>, <br>, <hr>, <input>
๐ 2. HTML ๊ธฐ๋ณธ ๊ตฌ์กฐ — ๋ชจ๋ ์นํ์ด์ง์ ํ
๋ชจ๋ HTML ํ์ผ์ ์๋ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด ํ์ ๋ฐ๋์ ์ธ์์ผ ํฉ๋๋ค!
๐ head ํ๊ทธ ์์ ๋ค์ด๊ฐ๋ ์ฃผ์ ์์:
<meta charset="UTF-8"> — ํ๊ธ์ด ๊นจ์ง์ง ์๋๋ก ์ธ์ฝ๋ฉ ์ค์
<meta name="viewport" content="width=device-width"> — ๋ชจ๋ฐ์ผ ๋ฐ์ํ ํ์
<title>ํ์ด์ง ์ ๋ชฉ</title> — ๋ธ๋ผ์ฐ์ ํญ์ ํ์๋๋ ์ ๋ชฉ
<link rel="stylesheet" href="style.css"> — CSS ํ์ผ ์ฐ๊ฒฐ
<script src="app.js"></script> — JS ํ์ผ ์ฐ๊ฒฐ
๐ 3. ๊ผญ ์์์ผ ํ HTML ํ๊ทธ ์์ ์ ๋ฆฌ
HTML ํ๊ทธ๋ 100๊ฐ๊ฐ ๋์ง๋ง, ์ค๋ฌด์์ ์์ฃผ ์ฐ๋ 20~30๊ฐ๋ง ์ ๋๋ก ์์๋ ์ถฉ๋ถํฉ๋๋ค.
๐ ํ ์คํธ ๊ด๋ จ ํ๊ทธ ์์ธ
์ ๋ชฉ ํ๊ทธ h1 ~ h6:
h1์ ํ์ด์ง๋น 1๊ฐ๋ง ์ฌ์ฉ (SEO ํต์ฌ — ๊ฐ์ฅ ์ค์ํ ์ ๋ชฉ)
h2๋ ์น์ ์ ๋ชฉ, h3๋ ์์ ๋ชฉ ์์ผ๋ก ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ง์ผ์ผ ํฉ๋๋ค
์) h1 → "ํ๋ก ํธ์๋ ์์ ๊ฐ์ด๋" / h2 → "HTML์ด๋?" / h3 → "๊ธฐ๋ณธ ๊ตฌ์กฐ"
๊ฐ์กฐ ํ๊ทธ strong vs em vs b vs i:
<strong> — ์๋ฏธ์ ์ค์ํ ๊ฐ์กฐ (๊ตต๊ฒ, ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ๊ฐ์กฐํด์ ์ฝ์) ← ๊ถ์ฅ
<em> — ์๋ฏธ์ ๊ฐ์กฐ (๊ธฐ์ธ์, ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ๊ฐ์กฐํด์ ์ฝ์) ← ๊ถ์ฅ
<b> — ์๊ฐ์ ๊ตต๊ฒ๋ง (์๋ฏธ ์์) ← ์คํ์ผ์ฉ
<i> — ์๊ฐ์ ๊ธฐ์ธ์๋ง (์๋ฏธ ์์) ← ์์ด์ฝ ํฐํธ์ ๋ง์ด ์ฌ์ฉ
๋งํฌ ํ๊ทธ <a> ์์ ์ ๋ณต:
href="URL" — ์ด๋ํ ์ฃผ์
href="#id" — ๊ฐ์ ํ์ด์ง ๋ด ํน์ ์์น๋ก ์ด๋ (์ต์ปค ๋งํฌ)
href="mailto:email@naver.com" — ์ด๋ฉ์ผ ์ฑ ์ด๊ธฐ
target="_blank" — ์ ํญ์ผ๋ก ์ด๊ธฐ
rel="noopener noreferrer" — target="_blank" ์ฌ์ฉ ์ ๋ณด์์ ์ํด ๋ฐ๋์ ์ถ๊ฐ!
์ด๋ฏธ์ง ํ๊ทธ <img> ์์ ์ ๋ณต:
src — ์ด๋ฏธ์ง ํ์ผ ๊ฒฝ๋ก ๋๋ URL
alt — ์ด๋ฏธ์ง ๋์ฒด ํ ์คํธ (์ ๊ทผ์ฑ, SEO ํ์! ์ ๋ ๋น ๋จ๋ฆฌ๋ฉด ์ ๋จ)
width / height — ํฌ๊ธฐ ์ง์ (๋ ์ด์์ ์์ ์ฑ์ ์ํด ์ง์ ๊ถ์ฅ)
loading="lazy" — ํ๋ฉด์ ๋ณด์ผ ๋ ๋ก๋ (์ฑ๋ฅ ์ต์ ํ)
์) <img src="logo.png" alt="ํ์ฌ ๋ก๊ณ " width="200" height="100" loading="lazy">
๐ฆ 4. ๋ธ๋ก vs ์ธ๋ผ์ธ — HTML์ ํต์ฌ ๊ฐ๋
HTML ์์๋ ํฌ๊ฒ ๋ธ๋ก(Block) ์์์ ์ธ๋ผ์ธ(Inline) ์์๋ก ๋๋ฉ๋๋ค. CSS ๋ ์ด์์์ ์ดํดํ๊ธฐ ์ํ ํต์ฌ ๊ฐ๋ ์ ๋๋ค.
๐ก ์ค์ ํ:
<div> ์์ <span> ๋ฃ๊ธฐ โ (๋ธ๋ก ์์ ์ธ๋ผ์ธ OK)
<span> ์์ <div> ๋ฃ๊ธฐ โ (์ธ๋ผ์ธ ์์ ๋ธ๋ก NG)
<p> ์์ <div> ๋ฃ๊ธฐ โ (p๋ ๋ธ๋ก์ด์ง๋ง ๋ธ๋ก ์์ ๋ถ๊ฐ)
CSS์ display: block / inline / inline-block / flex๋ก ์ธ์ ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅ
๐๏ธ 5. ์๋งจํฑ(Semantic) HTML — ํ์ ํ์
์๋งจํฑ ํ๊ทธ๋ ํ๊ทธ ์ด๋ฆ ์์ฒด๊ฐ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ ํ๊ทธ์
๋๋ค.
๋จ์ํ <div>๋ก ๋ชจ๋ ๊ตฌ์ญ์ ๋๋๋ ๊ฒ๋ณด๋ค ์๋ฏธ ์๋ ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฉด SEO, ์ ๊ทผ์ฑ, ์ฝ๋ ๊ฐ๋
์ฑ์ด ๋ชจ๋ ํฅ์๋ฉ๋๋ค.
๐ article vs section ์ฐจ์ด:
<article> — ํ์ด์ง์์ ๋ผ์ด๋ด๋ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ฏธ ์๋ ์ฝํ ์ธ
์) ๋ธ๋ก๊ทธ ๊ธ ํ๋, ๋ด์ค ๊ธฐ์ฌ, ์ฌ์ฉ์ ๋๊ธ
<section> — ์ฃผ์ ๋ณ๋ก ๊ทธ๋ฃนํํ๋ ๋จ์ (๋ณดํต ์ ๋ชฉ h2~h3์ ํฌํจ)
์) "์๊ฐ ์น์ ", "๊ธฐ์ ์น์ ", "์ฐ๋ฝ์ฒ ์น์ "
๐ 6. HTML Form — ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ์ ๋ชจ๋ ๊ฒ
๋ก๊ทธ์ธ, ํ์๊ฐ์
, ๊ฒ์์ฐฝ, ๋๊ธ ์์ฑ — ๋ชจ๋ HTML Form์ผ๋ก ๋ง๋ค์ด์ง๋๋ค.
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด Form์ ์๋ฒฝํ ์ดํดํด์ผ ํฉ๋๋ค.
๐ Form ๊ธฐ๋ณธ ๊ตฌ์กฐ:
action — ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์๋ฒ URL
method — GET(URL์ ๋ฐ์ดํฐ ํฌํจ) / POST(์จ๊ฒจ์ ์ ์ก)
→ ๋น๋ฐ๋ฒํธ, ๊ฐ์ธ์ ๋ณด๋ ๋ฐ๋์ POST ์ฌ์ฉ!
<form action="/login" method="POST">
<input type="email" name="email" required>
<input type="password" name="pw" required>
<button type="submit">๋ก๊ทธ์ธ</button>
</form>
โญ label ํ๊ทธ์ ์ค์์ฑ:
input์๋ ๋ฐ๋์ <label>์ ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค (์ ๊ทผ์ฑ ํ์!)
<label for="email">์ด๋ฉ์ผ</label>
<input type="email" id="email" name="email">
→ label ํด๋ฆญ ์ input์ ํฌ์ปค์ค → ์ฌ์ฉ์ฑ ํฅ์
→ ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ "์ด๋ฉ์ผ ์ ๋ ฅ์นธ"์ด๋ผ๊ณ ์๋ด ๊ฐ๋ฅ
๐ก๏ธ HTML5 ๋ด์ฅ ์ ํจ์ฑ ๊ฒ์ฌ ์์ฑ:
required — ํ์ ์ ๋ ฅ
minlength / maxlength — ์ต์/์ต๋ ๊ธ์ ์
min / max — ์ซ์ ์ต์/์ต๋๊ฐ
pattern — ์ ๊ท์์ผ๋ก ํ์ ๊ฒ์ฌ
type="email" — ์ด๋ฉ์ผ ํ์ ์๋ ๊ฒ์ฌ
→ JS ์์ด๋ ๊ธฐ๋ณธ ์ ํจ์ฑ ๊ฒ์ฌ ๊ฐ๋ฅ!
โฟ 7. ์ ๊ทผ์ฑ(a11y)๊ณผ SEO — ํ๋ก ๊ฐ๋ฐ์์ ๊ธฐ์ค
์ ๊ทผ์ฑ(Accessibility, a11y)์ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๋ ์น์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์
๋๋ค.
์ ๊ทผ์ฑ์ด ์ข์ผ๋ฉด SEO๋ ์ข์์ง๋๋ค. ๋ ๋ง๋ฆฌ ํ ๋ผ๋ฅผ ๋์์ ์ก๋ ๋ฐฉ๋ฒ์
๋๋ค!
๐ WAI-ARIA ๊ธฐ์ด:
์๋งจํฑ ํ๊ทธ๋ง์ผ๋ก ํํํ ์ ์๋ ์ญํ ์ ์ค๋ช ํ๋ ์์ฑ์ ๋๋ค.
role — ์์์ ์ญํ ๋ช ์ (role="button", role="navigation")
aria-label — ์์ ์ค๋ช ํ ์คํธ (๋์ ์ ๋ณด์ด์ง๋ง ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ์ฝ์)
aria-hidden="true" — ์คํฌ๋ฆฐ๋ฆฌ๋๊ฐ ๋ฌด์ํ๊ฒ ํจ (์ฅ์์ฉ ์์ด์ฝ ๋ฑ)
์) <button aria-label="๊ฒ์"><i class="icon-search"></i></button>
๐ 8. ํ์ผ ๊ฒฝ๋ก ์์ ์ ๋ณต
์ด๋ฏธ์ง, CSS, JS ํ์ผ์ ์ฐ๊ฒฐํ ๋ ๊ฒฝ๋ก๋ฅผ ์๋ชป ์ ์ผ๋ฉด ์๋ฌด๊ฒ๋ ํ์๋์ง ์์ต๋๋ค. ๊ฒฝ๋ก์ ๋ ๊ฐ์ง ๋ฐฉ์์ ๊ผญ ์์์ผ ํฉ๋๋ค.
๐ ์๋ ๊ฒฝ๋ก (Relative Path) — ํ์ฌ ํ์ผ ๊ธฐ์ค:
./images/logo.png — ํ์ฌ ํด๋ ์์ images ํด๋
../images/logo.png — ํ ๋จ๊ณ ์ ํด๋์ images ํด๋
images/logo.png — ./๋ฅผ ์๋ตํด๋ ๊ฐ์ ์๋ฏธ
→ ์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ์
๐ ์ ๋ ๊ฒฝ๋ก (Absolute Path) — ๋ฃจํธ/URL ๊ธฐ์ค:
/images/logo.png — ์ฌ์ดํธ ๋ฃจํธ(/)๋ถํฐ ์์
https://example.com/images/logo.png — ์ ์ฒด URL
→ CDN ์ด๋ฏธ์ง๋ ์ธ๋ถ ๋ฆฌ์์ค ์ฐ๊ฒฐ ์ ์ฌ์ฉ
๐ป 9. ํ์ ์์ค์ HTML ์ฝ๋ ์์ฑ๋ฒ
โ ํ์ ์์ ์ง์ผ์ผ ํ HTML ์์ฑ ์์น:
1. ์๋งจํฑ ํ๊ทธ ์ฐ์ — div/span๋ณด๋ค ์๋ฏธ ์๋ ํ๊ทธ๋ฅผ ๋จผ์ ์ฐพ๋๋ค
2. h1์ ํ์ด์ง๋น 1๊ฐ — SEO์ ํต์ฌ, ๊ฐ์ฅ ์ค์ํ ์ ๋ชฉ์๋ง
3. img์ alt ํ์ — ์ ๋ ๋น ๋จ๋ฆฌ์ง ์๊ธฐ
4. ๋ค์ฌ์ฐ๊ธฐ 2์นธ ๋๋ 4์นธ ํต์ผ — ํ๊ณผ ํ์ ํ ์ผ๊ด์ฑ ์ ์ง
5. ์๋ฌธ์ ํ๊ทธ ์ฌ์ฉ — HTML5์์๋ ์๋ฌธ์๊ฐ ํ์ค
6. ์์ฑ๊ฐ ๋ฐ์ดํ ์ฌ์ฉ — class="btn" (๋ฐ์ดํ ์๋ต ๋น๊ถ์ฅ)
7. ๋ถํ์ํ div ์ค์ด๊ธฐ — "div ์ง์ฅ(div hell)" ํผํ๊ธฐ
๐ง VS Code์์ HTML ๋น ๋ฅด๊ฒ ์์ฑํ๋ ๊ฟํ (Emmet):
! + Tab — HTML ๊ธฐ๋ณธ ๊ตฌ์กฐ ์๋ ์์ฑ
div.container + Tab — <div class="container"></div>
ul>li*5 + Tab — ul ์์ li 5๊ฐ ์๋ ์์ฑ
h2.title#main + Tab — class="title" id="main"์ธ h2
→ Emmet์ ์ตํ๋ฉด HTML ์์ฑ ์๋๊ฐ 3~5๋ฐฐ ๋นจ๋ผ์ง๋๋ค!
โ๏ธ 10. ์ค์ต — ํฌํธํด๋ฆฌ์ค ๊ธฐ๋ณธ ํ์ด์ง ๋ง๋ค๊ธฐ
๋ฐฐ์ด ๋ด์ฉ์ ๋ชจ๋ ํ์ฉํ ์ค์ ์ฝ๋์ ๋๋ค. ์ด ๊ตฌ์กฐ๊ฐ ์ค๋ฌด ํฌํธํด๋ฆฌ์ค ์ฌ์ดํธ์ ๊ธฐ์ด๊ฐ ๋ฉ๋๋ค.
๐ ์ค์ต ํ์ผ ๊ตฌ์กฐ:
my-portfolio/
โโโ index.html
โโโ css/style.css (๋์ค์ ์ถ๊ฐ)
โโโ images/ (์ด๋ฏธ์ง ํด๋)
๐ ์ค์ต ๋ฏธ์ :
โ VS Code ์ค์น ํ ์ ํด๋ "my-portfolio" ์์ฑ
โก index.html ํ์ผ ์์ฑ ํ ! + Tab์ผ๋ก ๊ธฐ๋ณธ ๊ตฌ์กฐ ์์ฑ
โข header, nav, main, section, footer ์๋งจํฑ ํ๊ทธ ์ฌ์ฉํด์ ํ์ด์ง ๊ตฌ์ฑ
โฃ ์ด๋ฆ, ์๊ฐ๊ธ, ๊ธฐ์ ๋ชฉ๋ก(ul>li), ์ฐ๋ฝ์ฒ ๋งํฌ(mailto:) ์ถ๊ฐ
โค ๋ชจ๋ ์ด๋ฏธ์ง์ alt ์์ฑ ์ถ๊ฐ
โฅ ํฌ๋กฌ์ผ๋ก ์ด์ด์ ํ์ธ, F12 Elements ํญ์์ ๊ตฌ์กฐ ํ์ธ
โ ํต์ฌ ์์ฝ & ํ์ต ์ฒดํฌ๋ฆฌ์คํธ
"HTML์ ๋จ์ํ ํ๊ทธ๋ฅผ ์ธ์ฐ๋ ๊ฒ์ด ์๋๋๋ค.
์ฝํ ์ธ ์ ์ฌ๋ฐ๋ฅธ ์๋ฏธ๋ฅผ ๋ถ์ฌํ๋ ๊ฒ — ๊ทธ๊ฒ์ด ์ข์ HTML์ ๋ณธ์ง์ ๋๋ค."
๐ ํ์ต ์๋ฃ ์ฒดํฌ๋ฆฌ์คํธ:
โ HTML ๊ธฐ๋ณธ ๊ตฌ์กฐ(!DOCTYPE, html, head, body)๋ฅผ ์ธ์ ๋ค
โ ์ฃผ์ ํ๊ทธ 20๊ฐ ์ด์์ ์ฉ๋๋ฅผ ์๋ค
โ ๋ธ๋ก ์์์ ์ธ๋ผ์ธ ์์์ ์ฐจ์ด๋ฅผ ์ค๋ช ํ ์ ์๋ค
โ ์๋งจํฑ ํ๊ทธ 7๊ฐ(header/nav/main/article/section/aside/footer)๋ฅผ ์๋ค
โ form, input, button ํ๊ทธ๋ก ๋ก๊ทธ์ธ ํผ์ ๋ง๋ค ์ ์๋ค
โ img ํ๊ทธ์ alt ์์ฑ์ ํญ์ ์ถ๊ฐํ๋ค
โ ์๋ ๊ฒฝ๋ก์ ์ ๋ ๊ฒฝ๋ก์ ์ฐจ์ด๋ฅผ ์๋ค
โ VS Code์์ Emmet(! + Tab)์ ์ฌ์ฉํด๋ดค๋ค
โ ํฌํธํด๋ฆฌ์ค ๊ธฐ๋ณธ ํ์ด์ง๋ฅผ ์ง์ ๋ง๋ค์ด๋ดค๋ค
โ ํฌ๋กฌ DevTools์ Elements ํญ์์ HTML ๊ตฌ์กฐ๋ฅผ ํ์ธํด๋ดค๋ค
๐ ๋ค์ ๋จ๊ณ: FrontendDevGuide0003 — CSS ์์ ์ ๋ณต ์ผ๋ก ๋์ด๊ฐ์ธ์!
HTML ๋ผ๋๋ฅผ ๋ง๋ค์์ผ๋, ์ด์ ์์๊ฒ ๊พธ๋ฐ ์ฐจ๋ก์ ๋๋ค ๐