๐Ÿ“Œ 1๏ธโƒฃ ์›น ์ ‘๊ทผ์„ฑ (Web Accessibility) ์‹ฌํ™” ํ™•์žฅ

๐ŸŸข 1-1. ์›น ์ ‘๊ทผ์„ฑ ๊ฐœ๋… + ์‹ค๋ฌด ํ•„์ˆ˜

๐Ÿ›๏ธ ์ •์˜ ๋ชจ๋“  ์‚ฌ์šฉ์ž(์žฅ์•  ํฌํ•จ)์—๊ฒŒ ๋™๋“ฑํ•œ ์›น ์‚ฌ์šฉ ๊ฒฝํ—˜ ์ œ๊ณต
๐Ÿ“ข ๋น„์œ  ์›น์‚ฌ์ดํŠธ = ๊ณต๊ณต๋„์„œ๊ด€ ๐Ÿ“š โ†’ ํœ ์ฒด์–ด ๊ฒฝ์‚ฌ๋กœ, ์ ์ž, ์•ˆ๋‚ดํŒ
๐ŸŒ ์‹ค๋ฌด ์ค‘์š”์„ฑ ์žฅ์• ์ธ์ฐจ๋ณ„๊ธˆ์ง€๋ฒ•, WCAG 2.1 ์ค€์ˆ˜ ํ•„์ˆ˜ (๊ณต๊ณต๊ธฐ๊ด€, ๋Œ€๊ธฐ์—… ์˜๋ฌด)
๐Ÿ“Š SEO ์˜ํ–ฅ ์‹œ๋งจํ‹ฑ ๊ตฌ์กฐ โ†’ ๊ฒ€์ƒ‰ ์—”์ง„ ์ธ์‹ & ์Šคํฌ๋ฆฐ๋ฆฌ๋” ์ ‘๊ทผ โ†‘

๐Ÿ› ๏ธ 1-2. ์ ‘๊ทผ์„ฑ ํ•„์ˆ˜ HTML ์š”์†Œ ์‹ฌํ™”

์š”์†Œ ์—ญํ•  ์‹ค๋ฌด ์˜ˆ์‹œ ๋น„์œ  ๐ŸŒŸ
<label> ํผ ์š”์†Œ์™€ ์—ฐ๊ด€ ์„ค๋ช… ์ œ๊ณต <label for="email">๐Ÿ“ง Email</label><input id="email"> ์•ˆ๋‚ด ํ‘œ์ง€ํŒ
alt ์ด๋ฏธ์ง€ ๋Œ€์ฒด ํ…์ŠคํŠธ <img src="logo.png" alt="ํšŒ์‚ฌ ๋กœ๊ณ "> ์ ์ž ์„ค๋ช…
<fieldset> + <legend> ํผ ๊ทธ๋ฃนํ™” ๋ฐ ์„ค๋ช… <fieldset><legend>ํšŒ์›์ •๋ณด</legend>...</fieldset> ํผ ๊ทธ๋ฃน ๋ฌถ๊ธฐ
<button> ๋ฒ„ํŠผ์—” ํ…์ŠคํŠธ or aria-label ํ•„์ˆ˜ <button aria-label="๋‹ซ๊ธฐ">โŒ</button> ์„ค๋ช… ์—†๋Š” ๋ฒ„ํŠผ X
tabindex ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ์ˆœ์„œ ์ œ์–ด <a href="#" tabindex="0">๋งํฌ</a> ํ‚ค๋ณด๋“œ ๋‚ด๋น„

โœ… ์‹ฌํ™” ํผ ์˜ˆ์ œ + ์ฃผ์„

<form>
  <!-- ๐Ÿ“ง Email ์ž…๋ ฅ + label ์—ฐ๊ฒฐ -->
  <label for="email">๐Ÿ“ง Email</label>
  <input type="email" id="email" required>

  <!-- ๐Ÿ”‘ Password ์ž…๋ ฅ -->
  <label for="password">๐Ÿ”‘ Password</label>
  <input type="password" id="password" required>

  <!-- ๐Ÿ“… ๋‚ ์งœ ์„ ํƒ + ๊ทธ๋ฃนํ™” -->
  <fieldset>
    <legend>๐Ÿ“… ์˜ˆ์•ฝ ์ •๋ณด</legend>
    <label for="date">๋‚ ์งœ</label>
    <input type="date" id="date">
  </fieldset>

  <!-- ๋ฒ„ํŠผ์—” ๋ฐ˜๋“œ์‹œ ํ…์ŠคํŠธ or aria-label -->
  <button type="submit">์ œ์ถœ</button>
</form>

๐ŸŽฏ 1-3. ARIA ์†์„ฑ ์‹ฌํ™” ์ •๋ฆฌ

์†์„ฑ ์—ญํ•  ์˜ˆ์‹œ ์‹ค๋ฌด ํŒ ๐Ÿš€
aria-label ์Šคํฌ๋ฆฐ๋ฆฌ๋”์šฉ ํ…์ŠคํŠธ <button aria-label="๋‹ซ๊ธฐ">โŒ</button> ํ…์ŠคํŠธ ์—†๋Š” ๋ฒ„ํŠผ ํ•„์ˆ˜
aria-hidden ์žฅ์‹ ์š”์†Œ ์ˆจ๊น€ <i aria-hidden="true">โญ</i> ์Šคํฌ๋ฆฐ๋ฆฌ๋” ํ˜ผ๋ž€ ๋ฐฉ์ง€
aria-live ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ <div aria-live="polite">์ƒˆ ๋ฉ”์‹œ์ง€!</div> ์ฑ„ํŒ…, ์•Œ๋ฆผ ์˜์—ญ
role ์—ญํ•  ๋ช…์‹œ <div role="dialog">๋ชจ๋‹ฌ์ฐฝ</div> ๋น„ํ‘œ์ค€ ํƒœ๊ทธ์— ์˜๋ฏธ ๋ถ€์—ฌ
aria-expanded ์—ด๋ฆผ/๋‹ซํž˜ ์ƒํƒœ <button aria-expanded="false">๋ฉ”๋‰ด</button> ๋“œ๋กญ๋‹ค์šด, ์•„์ฝ”๋””์–ธ

๐Ÿš€ 1-4. ์‹ค์ „ ๋‚ด๋น„๊ฒŒ์ด์…˜ ์˜ˆ์ œ (์ ‘๊ทผ์„ฑ 100์ )

<nav aria-label="์ฃผ ๋‚ด๋น„๊ฒŒ์ด์…˜">
  <ul>
    <li><a href="/home">๐Ÿ  <span>ํ™ˆ</span></a></li>
    <li><a href="/about">โ„น๏ธ <span>์†Œ๊ฐœ</span></a></li>
    <li><a href="/contact">๐Ÿ“ž <span>์—ฐ๋ฝ์ฒ˜</span></a></li>
  </ul>
</nav>

โœ… ํฌ์ธํŠธ:


๐Ÿง  1-5. WCAG ํ•ต์‹ฌ ์›์น™ + ์‹ฌํ™”

์›์น™ ์„ค๋ช… ๋น„์œ  ๐ŸŒŸ
Perceivable (์ง€๊ฐ ๊ฐ€๋Šฅ) ๋ชจ๋“  ์ •๋ณด๋Š” ํ…์ŠคํŠธ/๋Œ€์ฒด์ˆ˜๋‹จ ์ œ๊ณต ์ ์ž, ์ž๋ง‰
Operable (์กฐ์ž‘ ๊ฐ€๋Šฅ) ํ‚ค๋ณด๋“œ, ์Œ์„ฑ, ํ„ฐ์น˜ ์ž…๋ ฅ ๋ชจ๋‘ ์ง€์› ์—˜๋ฆฌ๋ฒ ์ดํ„ฐ ๋ฒ„ํŠผ
Understandable (์ดํ•ด ๊ฐ€๋Šฅ) ์ผ๊ด€๋œ UI, ๋ช…ํ™•ํ•œ ๋„ค๋น„ ๋„์„œ๊ด€ ์•ˆ๋‚ด ํ‘œ์ง€
Robust (๊ฒฌ๊ณ ์„ฑ) ๋‹ค์–‘ํ•œ ๊ธฐ๊ธฐ, ๋ณด์กฐ๊ธฐ์ˆ ์—์„œ๋„ ํ˜ธํ™˜ ๋‹ค๊ตญ์  ATM


๐Ÿ” 2๏ธโƒฃ SEO ์‹ฌํ™” ํ™•์žฅ

๐Ÿš€ 2-1. SEO ๊ธฐ๋ณธ + ์‹ค๋ฌด ์ค‘์š”์„ฑ

์ •์˜ ๊ฒ€์ƒ‰ ์—”์ง„ ๊ฒฐ๊ณผ ์ƒ์œ„ ๋…ธ์ถœ ์œ„ํ•œ ์ตœ์ ํ™”
๐Ÿ“ข ๋น„์œ  ์›น์‚ฌ์ดํŠธ = ๊ฐ€๊ฒŒ ๐Ÿช โ†’ SEO = ๊ฐ„ํŒ + ์ง€๋„ ๋“ฑ๋ก + ์ „๋‹จ์ง€
์‹ค๋ฌด ๊ฒ€์ƒ‰ ์œ ์ž… = ๋งค์ถœ, ๋ฐฉ๋ฌธ์ž ์ˆ˜ ์ง์ ‘ ์˜ํ–ฅ

๐Ÿ—๏ธ 2-2. SEO ํ•„์ˆ˜ ์š”์†Œ

์š”์†Œ ์—ญํ•  ์˜ˆ์‹œ
<title> ํŽ˜์ด์ง€ ์ œ๋ชฉ <title>๐Ÿ”ฅ UX ๋””์ž์ด๋„ˆ ํฌํŠธํด๋ฆฌ์˜ค</title>
<meta description> ๊ฒ€์ƒ‰๊ฒฐ๊ณผ ์„ค๋ช… <meta name="description" content="UX ์ „๋ฌธ๊ฐ€ ํ”„๋กœ์ ํŠธ">
์‹œ๋งจํ‹ฑ ๊ตฌ์กฐ <header>, <main>, <article> ๋ช…ํ™•ํ•˜๊ฒŒ ย 
๋ช…ํ™•ํ•œ ๋งํฌ <a href="/portfolio">ํฌํŠธํด๋ฆฌ์˜ค ๋ณด๊ธฐ</a> ย 
ํ‚ค์›Œ๋“œ ์ตœ์ ํ™” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ ๋ฐฐ์น˜ ย 

๐ŸŒ 2-3. Open Graph + Canonical + Sitemap

<!-- SNS ๊ณต์œ  ์ตœ์ ํ™” -->
<meta property="og:title" content="๐Ÿ”ฅ UX ํฌํŠธํด๋ฆฌ์˜ค">
<meta property="og:description" content="UI/UX ์ „๋ฌธ๊ฐ€์˜ ํ”„๋กœ์ ํŠธ">
<meta property="og:image" content="thumbnail.jpg">
<meta property="og:url" content="https://myportfolio.com/">

<!-- ์ค‘๋ณต ๋ฐฉ์ง€ -->
<link rel="canonical" href="https://myportfolio.com/">

โœ… robots.txt + sitemap.xml โ†’ ๊ฒ€์ƒ‰๋ด‡ ์ตœ์  ๊ด€๋ฆฌ


๐Ÿš€ 2-4. ์ตœ์‹  SEO ํŠธ๋ Œ๋“œ ์‹ฌํ™”

๊ธฐ์ˆ  ์„ค๋ช… ์‹ค๋ฌด ํŒ ๐Ÿš€
Core Web Vitals UX ์„ฑ๋Šฅ ์ง€ํ‘œ (LCP, FID, CLS) ๊ตฌ๊ธ€ ์ˆœ์œ„ ์˜ํ–ฅ
Mobile-First Indexing ๋ชจ๋ฐ”์ผ ๊ธฐ์ค€ ํฌ๋กค๋ง ๋ฐ˜์‘ํ˜• ํ•„์ˆ˜
Schema.org (๊ตฌ์กฐํ™” ๋ฐ์ดํ„ฐ) ๋ณ„์ , ๋ฆฌ๋ทฐ ํ‘œ์‹œ ๊ฐ€๋Šฅ SEO CTRโ†‘
HTTPS ๋ณด์•ˆ ์—ฐ๊ฒฐ ์ˆœ์œ„ ๊ฐ€์‚ฐ์ 


๐ŸŽ๏ธ 3๏ธโƒฃ ์›น ํŽ˜์ด์ง€ ์ตœ์ ํ™” ์‹ฌํ™”

๐Ÿ“ฆ 3-1. ์ด๋ฏธ์ง€ ์ตœ์ ํ™”

๊ธฐ๋ฒ• ์„ค๋ช… ์˜ˆ์‹œ
WebP/AVIF ์‚ฌ์šฉ ๊ณ ์••์ถ• ํฌ๋งท <img src="img.webp" loading="lazy">
Responsive Image ๋‹ค์–‘ํ•œ ํ•ด์ƒ๋„ ๋Œ€์‘ <img srcset="small.jpg 400w, large.jpg 800w">
Lazy Loading ์Šคํฌ๋กค์‹œ ๋กœ๋”ฉ <img loading="lazy">

๐Ÿ“ถ 3-2. ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™”

๊ธฐ๋ฒ• ์„ค๋ช…
CSS/JS Minify ๊ณต๋ฐฑ ์ œ๊ฑฐ
Gzip/Brotli ์„œ๋ฒ„ ์••์ถ•
CDN ๊ธ€๋กœ๋ฒŒ ๋น ๋ฅธ ์ „์†ก
ํŒŒ์ผ ๋ณ‘ํ•ฉ ์š”์ฒญ ์ˆ˜ โ†“ (๋‹จ, HTTP/2๋Š” ๊ถŒ์žฅ X)

โœ… 3-3. ์‹ค์ „ ์ตœ์ ํ™” ์˜ˆ์‹œ + ์ฃผ์„

<img src="product.webp" width="600" height="400" loading="lazy"
     srcset="product-400.webp 400w, product-800.webp 800w"
     sizes="(max-width: 600px) 400px, 800px" alt="์ƒํ’ˆ ์ด๋ฏธ์ง€">

ํฌ์ธํŠธ:


๐Ÿง  4๏ธโƒฃ ๊ธฐ์ˆ  ๋ฉด์ ‘ ์˜ˆ์ƒ ์งˆ๋ฌธ (์‹ฌํ™” ํฌ์ธํŠธ)

์งˆ๋ฌธ ์‹ฌํ™” ๋‹ต๋ณ€
SEO ํ•ต์‹ฌ ์š”์†Œ? <title>, ๋ฉ”ํƒ€ํƒœ๊ทธ, Open Graph, ์‹œ๋งจํ‹ฑ ๊ตฌ์กฐ, ์†๋„ ์ตœ์ ํ™”
์›น ์ ‘๊ทผ์„ฑ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„? ์‹œ๋งจํ‹ฑ ํƒœ๊ทธ, label, alt, ARIA ์ตœ์†Œํ™”, ํ‚ค๋ณด๋“œ ๋‚ด๋น„
WCAG ์›์น™์€? Perceivable, Operable, Understandable, Robust
Core Web Vitals๋ž€? LCP(์ตœ๋Œ€ ์ฝ˜ํ…์ธ  ๋กœ๋”ฉ), FID(์ž…๋ ฅ ์ง€์—ฐ),