๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฒˆ์—ญ

ํ”„๋ก ํŠธ์—”๋“œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ [๋ฒˆ์—ญ]

by Whiimsy 2024. 3. 22.

๐Ÿฑ‍๐Ÿ‘ค ์›๋ฌธ : https://github.com/thedaviddias/Front-End-Checklist

 

GitHub - thedaviddias/Front-End-Checklist: ๐Ÿ—‚ The perfect Front-End Checklist for modern websites and meticulous developers

๐Ÿ—‚ The perfect Front-End Checklist for modern websites and meticulous developers - thedaviddias/Front-End-Checklist

github.com


ํ”„๋ก ํŠธ์—”๋“œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ


ํ”„๋ก ํŠธ์—”๋“œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ์›น์‚ฌ์ดํŠธ๋‚˜ HTML ํŽ˜์ด์ง€๋ฅผ ํ”„๋กœ๋•์…˜์— ์ถœ์‹œํ•˜๊ธฐ ์ „์— ๊ฐ€์ ธ์•ผ ํ•  ๋ชจ๋“  ์š”์†Œ ๋ฐ ํ…Œ์ŠคํŠธ ํ•ญ๋ชฉ์„ ์ƒ์„ธํ•˜๊ฒŒ ๋‚˜์—ดํ•œ ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ:
๐ŸŽฎ ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ๋Šฅ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๐Ÿ’Ž ํ”„๋ก ํŠธ์—”๋“œ ๋””์ž์ธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ


์‚ฌ์šฉ ๋ฐฉ๋ฒ•

ํ•ญ๋ชฉ์˜ ํ•„์š”์„ฑ์„ ๊ธฐ์ค€์œผ๋กœ 3๋‹จ๊ณ„๋กœ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค:

๐ŸŸข ํ•ด๋‹น ํ•ญ๋ชฉ์€ ๊ถŒ์žฅ๋˜์ง€๋งŒ ํŠน์ • ์ƒํ™ฉ์—์„œ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
๐ŸŸ  ํ•ด๋‹น ํ•ญ๋ชฉ์€ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅ๋˜์ง€๋งŒ ๋งค์šฐ ํŠน์ •ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์š”์†Œ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์„ฑ๋Šฅ์ด๋‚˜ SEO์— ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ”ด ํ•ด๋‹น ํ•ญ๋ชฉ์€ ์–ด๋– ํ•œ ๊ฒฝ์šฐ์—๋„ ์ƒ๋žตํ•  ์ˆ˜ ์—†์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํŽ˜์ด์ง€ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ์ ‘๊ทผ์„ฑ ๋ฐ SEO ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์š”์†Œ๋ฅผ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์šฐ์„ ์ˆœ์œ„๋กœ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋–ค ์œ ํ˜•์˜ ๋ ˆํผ๋Ÿฐ์Šค์ธ์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ์ด๋ชจํ‹ฐ์ฝ˜:

  • ๐Ÿ“–: ๋ฌธ์„œ ๋˜๋Š” ๊ธฐ์‚ฌ
  • ๐Ÿ› : ์˜จ๋ผ์ธ ๋„๊ตฌ / ํ…Œ์ŠคํŠธ ๋„๊ตฌ
  • ๐Ÿ“น: ๋ฏธ๋””์–ด ๋˜๋Š” ๋น„๋””์˜ค ์ฝ˜ํ…์ธ 

Head

์ฐธ๊ณ : HTML ๋ฌธ์„œ์˜์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๋ชฉ๋ก์„ ์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”ํƒ€ ํƒœ๊ทธ

  • Doctype: ๐Ÿ”ด Doctype์€ HTML5์ด๋ฉฐ ๋ชจ๋“  HTML ํŽ˜์ด์ง€์˜ ๋งจ ์œ„์— ์žˆ์Šต๋‹ˆ๋‹ค.
<!doctype html> <!-- HTML5 -->

๋‹ค์Œ 2๊ฐœ์˜ ๋ฉ”ํƒ€ ํƒœ๊ทธ(Charset ๋ฐ Viewport)๋Š” head ํƒœ๊ทธ ๋‚ด์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Charset: ๐Ÿ”ด ๋ฌธ์ž ์ธ์ฝ”๋”ฉ(UTF-8)์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
<!-- ๋ฌธ์„œ์˜ ๋ฌธ์ž ์ธ์ฝ”๋”ฉ์„ ์„ค์ •ํ•˜์„ธ์š”. -->
<meta charset="utf-8">
  • Viewport: ๐Ÿ”ด ๋ทฐํฌํŠธ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
<!-- ๋ฐ˜์‘ํ˜• ์›น ๋””์ž์ธ์„ ์œ„ํ•œ ๋ทฐํฌํŠธ ์„ค์ • -->
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
  • Title: ๐Ÿ”ด ๋ชจ๋“  ํŽ˜์ด์ง€์—๋Š” ํƒ€์ดํ‹€์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค (SEO: Google์€ ์ œ๋ชฉ์— ์‚ฌ์šฉ๋œ ๋ฌธ์ž์˜ ํ”ฝ์…€ ๋„ˆ๋น„๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ  472์—์„œ 482 ํ”ฝ์…€ ์‚ฌ์ด์—์„œ ์ž๋ฆ…๋‹ˆ๋‹ค. ํ‰๊ท  ๋ฌธ์ž ์ œํ•œ์€ ์•ฝ 55์ž์ž…๋‹ˆ๋‹ค).
<!-- Document Title -->
<title>Page Title less than 55 characters</title>
  • Description: ๐Ÿ”ด ๋ฉ”ํƒ€ ์„ค๋ช…์ด ์ œ๊ณต๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ๊ณ ์œ ํ•˜๋ฉฐ 150์ž๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
<!-- Meta Description -->
<meta name="description" content="Description of the page less than 150 characters">
  • Favicons: ๐ŸŸ  ๊ฐ ํŒŒ๋น„์ฝ˜์ด ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ favicon.ico๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ ์‚ฌ์ดํŠธ์˜ ๋ฃจํŠธ์— ๋‘ก๋‹ˆ๋‹ค. ๋ณดํ†ต์€ ์•„๋ฌด๋Ÿฐ ๋งˆํฌ์—…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋งํฌ๋ฅผ ๊ฑธ์–ด๋‘๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. .ico ํ˜•์‹ ๋Œ€์‹  PNG ํ˜•์‹์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. (ํฌ๊ธฐ: 32x32px).
<!-- Standard favicon -->
<link rel="icon" type="image/x-icon" href="https://example.com/favicon.ico">
<!-- Recommended favicon format -->
<link rel="icon" type="image/png" href="https://example.com/favicon.png">
  • Apple Web App Meta: ๐ŸŸข Apple ๋ฉ”ํƒ€ ํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
<!-- Apple Touch Icon (at least 200x200px) -->
<link rel="apple-touch-icon" href="/custom-icon.png">

<!-- To run the web application in full-screen -->
<meta name="apple-mobile-web-app-capable" content="yes">

<!-- Status Bar Style (see Supported Meta Tags below for available values) -->
<!-- Has no effect unless you have the previous meta tag -->
<meta name="apple-mobile-web-app-status-bar-style" content="black">
  • Canonical: ๐ŸŸ  ์ค‘๋ณต ์ฝ˜ํ…์ธ ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด rel="canonical"์„ ์‚ฌ์šฉํ•˜์„ธ์š”.
<!-- ์ค‘๋ณต ์ฝ˜ํ…์ธ  ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค. -->
<link rel="canonical" href="http://example.com/2017/09/a-new-article-to-read.html">

HTML ํƒœ๊ทธ

  • Language attribute: ๐Ÿ”ด ์›น์‚ฌ์ดํŠธ์˜ lang ์†์„ฑ์ด ์ง€์ •๋˜์–ด ์žˆ๊ณ  ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์–ธ์–ด์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
<html lang="en">
  • Direction attribute: ๐ŸŸ  ํ…์ŠคํŠธ ๋ฐฉํ–ฅ์ด HTML ํƒœ๊ทธ์— ์ง€์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (๋‹ค๋ฅธ HTML ํƒœ๊ทธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
<html dir="rtl">
  • CSS Critical: ๐ŸŸ  CSS ํฌ๋ฆฌํ‹ฐ์ปฌ(๋˜๋Š” "above the fold: ์•„๋ฌด๋Ÿฐ ํ–‰๋™์„ ํ•˜์ง€ ์•Š์€ ๊ธฐ๋ณธ ํ™”๋ฉด")์€ ํŽ˜์ด์ง€์˜ ๊ฐ€์‹œ์ ์ธ ๋ถ€๋ถ„์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  CSS๋ฅผ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ CSS ํ˜ธ์ถœ ์ „์— <style></style> ์‚ฌ์ด์˜ ํ•œ ์ค„๋กœ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค(์ตœ์†Œํ™”๋จ).
  • CSS order: ๐Ÿ”ด ๋ชจ๋“  CSS ํŒŒ์ผ์€ <head> ์•ˆ์—์„œ ์–ด๋–ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ๋ณด๋‹ค ๋จผ์ € ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. (ํŽ˜์ด์ง€์˜ ๋งจ ์œ„์—์„œ ๊ฐ€๋”์”ฉ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ )

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™


HTML

๋ชจ๋ฒ” ์‚ฌ๋ก€

  • HTML5 Semantic Elements: ๐Ÿ”ด HTML5 ์˜๋ฏธ ์žˆ๋Š”(Semantic) ์š”์†Œ๋“ค์ด ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค (header, section, footer, main...).
  • Error pages: ๐Ÿ”ด 404 ํŽ˜์ด์ง€์™€ 5xx ์—๋Ÿฌ ํŽ˜์ด์ง€๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 5xx ์—๋Ÿฌ ํŽ˜์ด์ง€๋Š” ํ•ด๋‹น CSS๊ฐ€ ํ†ตํ•ฉ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (ํ˜„์žฌ ์„œ๋ฒ„์—์„œ ์™ธ๋ถ€ ํ˜ธ์ถœ ์—†์ด).
  • Noopener: ๐ŸŸ  ๋งŒ์•ฝ target="_blank"๋กœ ์™ธ๋ถ€ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋งํฌ์—๋Š” ํƒญ๋‚ด๋น™์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด rel="noopener" ์†์„ฑ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ๋ฒ„์ „์˜ Firefox๋ฅผ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, rel="noopener noreferrer"๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Clean up comments: ๐ŸŸข ํŽ˜์ด์ง€๋ฅผ ํ”„๋กœ๋•์…˜์œผ๋กœ ๋ณด๋‚ด๊ธฐ ์ „์— ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

HTML testing

  • HTML Lint: ๐Ÿ”ด HTML ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Link checker: ๐Ÿ”ด ํŽ˜์ด์ง€์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๋งํฌ๊ฐ€ ์—†๊ณ , 404 ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • Adblockers test: ๐ŸŸ  ๊ด‘๊ณ  ์ฐจ๋‹จ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ฝ˜ํ…์ธ ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ด‘๊ณ  ์ฐจ๋‹จ๊ธฐ๋ฅผ ํ•ด์ œํ•˜๋„๋ก ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™


์›นํฐํŠธ

์ฐธ๊ณ : ์›น ํฐํŠธ ์‚ฌ์šฉ์œผ๋กœ ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์ง€ ์•Š์€ ํ…์ŠคํŠธ์˜ ์ˆœ๊ฐ„์ ์ธ ๋‚˜ํƒ€๋‚จ ํ˜„์ƒ(Flash Of Unstyled Text) ๋˜๋Š” ํ…์ŠคํŠธ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š” ์ˆœ๊ฐ„์ ์ธ ํ˜„์ƒ(Flash Of Invisible Text)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋Œ€์ฒด ํฐํŠธ๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์›น ํฐํŠธ ๋กœ๋”๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋™์ž‘์„ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • Webfont format: ๐Ÿ”ด ๋ชจ๋“  ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ WOFF, WOFF2 ๋ฐ TTF ํ˜•์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • Webfont size: ๐Ÿ”ด ์›นํฐํŠธ ํฌ๊ธฐ๊ฐ€ ๋ชจ๋“  ๋ณ€ํ˜•์„ ํฌํ•จํ•˜์—ฌ 2 MB๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Webfont loader: ๐ŸŸข ์›นํฐํŠธ ๋กœ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋”ฉ ๋™์ž‘์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™


CSS

์ฐธ๊ณ : ๋งŽ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋”ฐ๋ฅด๋Š” CSS ๊ฐ€์ด๋“œ๋ผ์ธ๊ณผ Sass ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์‚ดํŽด๋ณด์„ธ์š”. CSS ์†์„ฑ์— ๋Œ€ํ•œ ์˜๋ฌธ์ด ์žˆ๋‹ค๋ฉด CSS ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”. ์ผ๊ด€์„ฑ์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ๊ฐ€์ด๋“œ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Responsive Web Design: ๐Ÿ”ด ๋ฐ˜์‘ํ˜• ์›น ๋””์ž์ธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • CSS Print: ๐ŸŸ  ์ธ์‡„ ์Šคํƒ€์ผ ์‹œํŠธ๊ฐ€ ๊ฐ ํŽ˜์ด์ง€์—์„œ ์ œ๊ณต๋˜๋ฉฐ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Preprocessors: ๐ŸŸข CSS ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: Sass, Less, Stylus)
  • Unique ID: ๐Ÿ”ด ID๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๊ฐ๊ฐ ํŽ˜์ด์ง€์˜ ID๊ฐ€ ๊ณ ์œ ํ•ฉ๋‹ˆ๋‹ค.
  • Reset CSS: ๐Ÿ”ด CSS ๋ฆฌ์…‹(reset), ์ •๊ทœํ™”(normalize), ๋˜๋Š” ์žฌ๋ถ€ํŒ…(reboot)์ด ์‚ฌ์šฉ๋˜๊ณ  ์ตœ์‹  ์ƒํƒœ์ž…๋‹ˆ๋‹ค. (๋ถ€ํŠธ์ŠคํŠธ๋žฉ์ด๋‚˜ ํŒŒ์šด๋ฐ์ด์…˜ ๊ฐ™์€ CSS ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ •๊ทœํ™”๊ฐ€ ์ด๋ฏธ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.)
  • JS prefix: ๐ŸŸข ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ํด๋ž˜์Šค(๋˜๋Š” id)๋Š” js- ๋กœ ์‹œ์ž‘ํ•˜๋ฉฐ CSS ํŒŒ์ผ์— ์Šคํƒ€์ผ์ด ์ง€์ •๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
<div id="js-slider" class="my-slider">
<!-- Or -->
<div id="id-used-by-cms" class="js-slider my-slider">
  • embedded or inline CSS: ๐Ÿ”ด <style> ํƒœ๊ทธ์— CSS๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ์ธ๋ผ์ธ CSS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ง€์–‘ํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•œ ์ด์œ (์˜ˆ: ์Šฌ๋ผ์ด๋”์˜ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€, ์ค‘์š”ํ•œ CSS)๋งŒ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Vendor prefixes: ๐Ÿ”ด CSS ๋ฒค๋” ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ์ง€์› ํ˜ธํ™˜์„ฑ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์„ฑ๋Šฅ

  • Concatenation: ๐Ÿ”ด CSS ํŒŒ์ผ์ด ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค. (HTTP/2์˜ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹นํ•˜์ง€ ์•Š์Œ)
  • Minification: ๐Ÿ”ด ๋ชจ๋“  CSS ํŒŒ์ผ์ด ์ตœ์†Œํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Non-blocking: ๐ŸŸ  CSS ํŒŒ์ผ์€ DOM์ด ๋กœ๋“œ๋˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€ ์•Š๋„๋ก Non-Blocking(๋‹ค๋ฅธ ์ฃผ์ฒด์˜ ์ž‘์—…์— ๊ด€๋ จ์—†์ด ์ž์‹ ์˜ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ)๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Unused CSS: ๐ŸŸข ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” CSS๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

CSS ํ…Œ์ŠคํŠธ

  • Stylelint: ๐Ÿ”ด ๋ชจ๋“  CSS ๋˜๋Š” SCSS ํŒŒ์ผ์— ์˜ค๋ฅ˜๊ฐ€ ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Responsive web design: ๐Ÿ”ด ๋ชจ๋“  ํŽ˜์ด์ง€๋Š” ๋‹ค์Œ์˜ ์ค‘๋‹จ์ ์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค: 320px, 768px, 1024px (๋ถ„์„์— ๋”ฐ๋ผ ๋” ๋งŽ๊ฑฐ๋‚˜ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ).
  • Responsive Checker -*
  • CSS Validator: ๐ŸŸ  CSS๊ฐ€ ํ…Œ์ŠคํŠธ๋˜๊ณ  ๊ด€๋ จ๋œ ์˜ค๋ฅ˜๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Desktop Browsers: ๐Ÿ”ด ๋ชจ๋“  ๋ฐ์Šคํฌํ†ฑ ๋ธŒ๋ผ์šฐ์ €(Safari, Firefox, Chrome, EDGE ๋“ฑ)์—์„œ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Mobile Browsers: ๐Ÿ”ด ๋ชจ๋ฐ”์ผ ๋ธŒ๋ผ์šฐ์ €(Native browser, Chrome, Safari ๋“ฑ)์—์„œ ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • OS: ๐Ÿ”ด ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ๋ชจ๋“  ์šด์˜ ์ฒด์ œ(Windows, Android, iOS, Mac ๋“ฑ)์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Design fidelity: ๐ŸŸข ํ”„๋กœ์ ํŠธ ๋ฐ ๋””์ž์ธ์˜ ํ’ˆ์งˆ์— ๋”ฐ๋ผ ๋””์ž์ธ๊ณผ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๊ตฌํ˜„๊ณผ ํฌ๋ฆฌ์—์ดํ‹ฐ๋ธŒ๋ฅผ ๋น„๊ตํ•˜๊ณ  ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Pixel Perfect - Chrome Extension

  • Reading direction: ๐Ÿ”ด ๋ชจ๋“  ํŽ˜์ด์ง€๋Š” LTR ๋ฐ RTL ์–ธ์–ด์— ๋Œ€ํ•ด ์ง€์›ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด ํ…Œ์ŠคํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™


์ด๋ฏธ์ง€

์ฐธ๊ณ : ์ด๋ฏธ์ง€ ์ตœ์ ํ™”์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ์œ„ํ•ด Addy Osmani์˜ ๋ฌด๋ฃŒ eBook์ธ Essential Image Optimization ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋ชจ๋ฒ” ์‚ฌ๋ก€

  • Optimization: ๐Ÿ”ด ๋ชจ๋“  ์ด๋ฏธ์ง€๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ Œ๋”๋ง๋  ์ˆ˜ ์žˆ๋„๋ก ์ตœ์ ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ™ˆํŽ˜์ด์ง€์™€ ๊ฐ™์€ ์ค‘์š”ํ•œ ํŽ˜์ด์ง€์—๋Š” WebP ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๐Ÿ›  Imagemin
  • ๐Ÿ›  Use ImageOptim to optimise your images for free.
  • ๐Ÿ›  Use KeyCDN Image Processing for image optimization in real time.
  • ๐Ÿ›  Use Kraken.io awesome alternative for both png and jpg optimization. Up to 1mb per files on free plan.
  • ๐Ÿ›  TinyPNG optimises png, apng (animated png) and jpg images with very small loss in quality. Free and paid version available.
  • ๐Ÿ›  ZorroSVG jpg-like compression for transparent images using svg masking.
  • ๐Ÿ›  SVGO a Nodejs-based tool for optimizing SVG vector graphics files.
  • ๐Ÿ›  SVGOMG a web-based GUI version of SVGO for optimising your svgs online.
  • Picture/Srcset: ๐ŸŸ  ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ๋ทฐํฌํŠธ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด picture/srcset์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Retina: ๐ŸŸข ๋ ˆํ‹ฐ๋‚˜ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ด์•„์›ƒ ์ด๋ฏธ์ง€๋ฅผ 2๋ฐฐ ๋˜๋Š” 3๋ฐฐ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Sprite: ๐ŸŸ  ์ž‘์€ ์ด๋ฏธ์ง€๋Š” ์Šคํ”„๋ผ์ดํŠธ ํŒŒ์ผ์— ์žˆ์Šต๋‹ˆ๋‹ค. (์•„์ด์ฝ˜์˜ ๊ฒฝ์šฐ SVG ์Šคํ”„๋ผ์ดํŠธ ์ด๋ฏธ์ง€์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
  • Width and Height: ๐Ÿ”ด ์ด๋ฏธ์ง€์˜ ์ตœ์ข… ๋ Œ๋”๋ง ํฌ๊ธฐ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด <img>์— width์™€ height ์†์„ฑ์„ ์„ค์ •ํ•˜์„ธ์š”. (CSS ํฌ๊ธฐ ์ง€์ •์— ๋Œ€ํ•ด์„œ๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)
  • Alternative text: ๐Ÿ”ด ๋ชจ๋“  <img>์—๋Š” ์ด๋ฏธ์ง€๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋Š” ๋Œ€์ฒด ํ…์ŠคํŠธ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Lazy loading: ๐ŸŸ  ์ด๋ฏธ์ง€๋Š” ๋ ˆ์ด์ง€ ๋กœ๋”ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค (noscript ๋Œ€์ฒด๊ฐ€ ํ•ญ์ƒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค).

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

๋ชจ๋ฒ” ์‚ฌ๋ก€

  • JavaScript Inline: ๐Ÿ”ด HTML ์ฝ”๋“œ์™€ ํ˜ผํ•ฉ๋œ ์ธ๋ผ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • Concatenation: ๐Ÿ”ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Minification: ๐Ÿ”ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์ตœ์†Œํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค (.min ์ ‘๋ฏธ์‚ฌ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).
  • JavaScript security: ๐Ÿ”ด
  • noscript tag: ๐ŸŸ  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์Šคํฌ๋ฆฝํŒ…์ด ์ง€์›๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ํ˜„์žฌ ์Šคํฌ๋ฆฝํŒ…์ด ๊บผ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ HTML ๋ณธ๋ฌธ์— <noscript> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ด๋Š” React.js์™€ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ Œ๋”๋ง์ด ๋งŽ์ด ํ•„์š”ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
<noscript>
  ์ด ์•ฑ์„ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
</noscript>
  • Non-blocking: ๐ŸŸ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ async ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œ๋˜๊ฑฐ๋‚˜ defer ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์—ฐ๋˜์–ด ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
  • Optimized and updated JS libraries: ๐ŸŸ  ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ(๊ฐ„๋‹จํ•œ ๊ธฐ๋Šฅ์—๋Š” Vanilla ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค), ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ถˆํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ๋ฌด๊ฑฐ์›Œ์ง€์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ…Œ์ŠคํŠธ

  • ESLint: ๐Ÿ”ด ESLint์— ์˜ํ•ด ์˜ค๋ฅ˜๊ฐ€ ํ”Œ๋ž˜๊ทธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (๊ตฌ์„ฑ ๋˜๋Š” ํ‘œ์ค€ ๊ทœ์น™์— ๋”ฐ๋ผ).

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™


๋ณด์•ˆ

์›น ์‚ฌ์ดํŠธ ์Šค์บ” ๋ฐ ์ฒดํฌ

๋ชจ๋ฒ” ์‚ฌ๋ก€

  • HTTPS: ๐Ÿ”ด ๋ชจ๋“  ํŽ˜์ด์ง€์™€ ์™ธ๋ถ€ ์ฝ˜ํ…์ธ (ํ”Œ๋Ÿฌ๊ทธ์ธ, ์ด๋ฏธ์ง€ ๋“ฑ)์— HTTPS๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • HTTP Strict Transport Security (HSTS): ๐ŸŸ  HTTP ํ—ค๋”๊ฐ€ 'Strict-Transport-Security'๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Cross Site Request Forgery (CSRF): ๐Ÿ”ด ์„œ๋ฒ„ ์ธก์œผ๋กœ์˜ ์š”์ฒญ์ด ์ •๋‹นํ•˜๋ฉฐ ์šฐ๋ฆฌ ์›น์‚ฌ์ดํŠธ/์•ฑ์—์„œ ์‹œ์ž‘๋˜์—ˆ์Œ์„ ํ™•์ธํ•˜์—ฌ CSRF ๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • Cross Site Scripting (XSS): ๐Ÿ”ด ํŽ˜์ด์ง€๋‚˜ ์›น์‚ฌ์ดํŠธ์— XSS ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  • Content Type Options: ๐ŸŸ  Google Chrome์ด ์„œ๋ฒ„์—์„œ ์„ ์–ธ๋œ content-type๊ณผ ๋‹ค๋ฅธ ๊ฒƒ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • X-Frame-Options (XFO): ๐ŸŸ  ๋ฐฉ๋ฌธ์ž๋ฅผ ํด๋ฆญ์žญํ‚น ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.
  • Content Security Policy: ๐ŸŸ  ์›น์‚ฌ์ดํŠธ์—์„œ ์ฝ˜ํ…์ธ ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋กœ๋“œ๋˜๋Š”์ง€ ๋ฐ ์–ด๋””์—์„œ ๋กœ๋“œ๋˜์–ด ํ—ˆ์šฉ๋˜๋Š”์ง€๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํด๋ฆญ์žญํ‚น ๊ณต๊ฒฉ์— ๋Œ€๋น„ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™


์„ฑ๋Šฅ

๋ชจ๋ฒ” ์‚ฌ๋ก€

  • Goals to achieve: ๐ŸŸ  ํŽ˜์ด์ง€๋Š” ๋‹ค์Œ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
    • ์ฒซ ๋ฒˆ์งธ ์˜๋ฏธ ์žˆ๋Š” ํŽ˜์ธํŠธ๋Š” 1์ดˆ ์ด๋‚ด์— ์™„๋ฃŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • "ํ‰๊ท " ๊ตฌ์„ฑ(๋Š๋ฆฐ 3G ๋„คํŠธ์›Œํฌ์—์„œ 400ms RTT ๋ฐ 400kbps ์ „์†ก ์†๋„๋ฅผ ๊ฐ–๋Š” $200 Android ์žฅ์น˜)์˜ Time To Interactive๋Š” 5์ดˆ ์ด๋‚ด์ด์–ด์•ผ ํ•˜๋ฉฐ, ๋ฐ˜๋ณต ๋ฐฉ๋ฌธ์—์„œ๋Š” 2์ดˆ ์ด๋‚ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ํฌ๋ฆฌํ‹ฐ์ปฌ ํŒŒ์ผ ํฌ๊ธฐ๋Š” ์••์ถ• ํ›„ 170KB ์ด๋‚ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Minified HTML: ๐ŸŸ  HTML์€ ์••์ถ•๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Lazy loading: ๐ŸŸ  ์ด๋ฏธ์ง€, ์Šคํฌ๋ฆฝํŠธ ๋ฐ CSS๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์‘๋‹ต ์‹œ๊ฐ„์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ด์ง€ ๋กœ๋”ฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (ํ•ด๋‹น ์„น์…˜์—์„œ ์ž์„ธํ•œ ๋‚ด์šฉ ์ฐธ์กฐ)
  • Cookie size: ๐ŸŸ  ์ฟ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ ์ฟ ํ‚ค๊ฐ€ 4096๋ฐ”์ดํŠธ๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋กํ•˜๊ณ  ๋„๋ฉ”์ธ ์ด๋ฆ„์— 20๊ฐœ ์ด์ƒ์˜ ์ฟ ํ‚ค๊ฐ€ ์—†๋„๋กํ•ฉ๋‹ˆ๋‹ค.
  • Third party components: ๐ŸŸ  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ์™ธ๋ถ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์˜์กดํ•˜๋Š” ์จ๋“œํŒŒํ‹ฐ iframe์ด๋‚˜ ๊ตฌ์„ฑ ์š”์†Œ(๊ณต์œ  ๋ฒ„ํŠผ๊ณผ ๊ฐ™์€)๋Š” ์ •์  ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์™ธ๋ถ€ API ํ˜ธ์ถœ์„ ์ œํ•œํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ํ™œ๋™์„ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๊ฐ€์˜ค๋Š” ์š”์ฒญ ์ค€๋น„ํ•˜๊ธฐ

  • DNS resolution: ๐ŸŸข ์ œ๊ณต๋  ์ˆ˜ ์žˆ๋Š” ํ•„์š”ํ•œ ์ œ3์ž ์„œ๋น„์Šค์˜ DNS๋Š” dns-prefetch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํœด ์‹œ๊ฐ„ ๋™์•ˆ ๋ฏธ๋ฆฌ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.
<link rel="dns-prefetch" href="https://example.com">
  • Preconnection: ๐ŸŸข ๋น ๋ฅธ ์ ‘์†์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์„œ๋น„์Šค์™€์˜ DNS ์กฐํšŒ, TCP ํ•ธ๋“œ์…ฐ์ดํฌ ๋ฐ TLS ํ˜‘์ƒ์€ ์œ ํœด ์‹œ๊ฐ„ ๋™์•ˆ preconnect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋ฆฌ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
<link rel="preconnect" href="https://example.com">
  • Prefetching: ๐ŸŸข ๋น ๋ฅธ ์ ‘์†์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค(์˜ˆ: ์ง€์—ฐ๋กœ๋“œ๋œ ์ด๋ฏธ์ง€)๋Š” ์œ ํœด ์‹œ๊ฐ„ ๋™์•ˆ prefetch๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋ฆฌ ์š”์ฒญ๋ฉ๋‹ˆ๋‹ค.
<link rel="prefetch" href="image.png">
  • Preloading: ๐ŸŸข ํ˜„์žฌ ํŽ˜์ด์ง€์—์„œ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค(์˜ˆ: <body> ๋์— ๋ฐฐ์น˜๋œ ์Šคํฌ๋ฆฝํŠธ)๋Š” preload๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฏธ๋ฆฌ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค.
<link rel="preload" href="app.js">

์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ

  • Google PageSpeed: ๐Ÿ”ด ๋ชจ๋“  ํŽ˜์ด์ง€(ํ™ˆํŽ˜์ด์ง€๋ฟ๋งŒ ์•„๋‹ˆ๋ผ)๊ฐ€ ํ…Œ์ŠคํŠธ๋˜์—ˆ์œผ๋ฉฐ ์ ์–ด๋„ 90/100์˜ ์ ์ˆ˜๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™


์ ‘๊ทผ์„ฑ

์ฐธ๊ณ : A11ycasts with Rob Dodson ์žฌ์ƒ ๋ชฉ๋ก์„ ์‹œ์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ“น

๋ชจ๋ฒ” ์‚ฌ๋ก€

  • Progressive enhancement: ๐ŸŸ  ์ฃผ์š” ๊ธฐ๋Šฅ์ธ ์ฃผ ๋ฉ”๋‰ด ๋ฐ ๊ฒ€์ƒ‰์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Color contrast: ๐ŸŸ  ์ƒ‰ ๋Œ€๋น„๋Š” ์ ์–ด๋„ WCAG AA๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (๋ชจ๋ฐ”์ผ์˜ ๊ฒฝ์šฐ AAA).

Headings

  • H1: ๐Ÿ”ด ๋ชจ๋“  ํŽ˜์ด์ง€์—๋Š” ์›น ์‚ฌ์ดํŠธ ์ œ๋ชฉ์ด ์•„๋‹Œ H1์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Headings: ๐Ÿ”ด Headings์€ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๊ณ  ์˜ฌ๋ฐ”๋ฅธ ์ˆœ์„œ๋กœ (H1์—์„œ H6๊นŒ์ง€) ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋งจํ‹ฑ์Šค

  • Specific HTML5 input types are used: ๐ŸŸ  ๋ชจ๋ฐ”์ผ ๊ธฐ๊ธฐ์—์„œ ๊ฐ ์š”์†Œ์˜ ์œ ํ˜•์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž ์ง€์ •๋œ ํ‚คํŒจ๋“œ์™€ ์œ„์ ฏ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํผ

  • Label: ๐Ÿ”ด ๊ฐ ์ž…๋ ฅ ํผ ์š”์†Œ์—๋Š” ๋ ˆ์ด๋ธ”์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด๋ธ”์„ ํ‘œ์‹œํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋Œ€์‹  aria-label์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

์ ‘๊ทผ์„ฑ ํ…Œ์ŠคํŠธ

  • Accessibility standards testing: ๐Ÿ”ด ํŽ˜์ด์ง€๊ฐ€ ์ ‘๊ทผ์„ฑ ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด WAVE ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • Keyboard navigation: ๐Ÿ”ด ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์›น์‚ฌ์ดํŠธ์˜ ๋ชจ๋“  ์ƒํ˜ธ ์ž‘์šฉ ๊ฐ€๋Šฅํ•œ ์š”์†Œ๊ฐ€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ˆœ์„œ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ณ  ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • Screen-reader: ๐ŸŸ  ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ์Šคํฌ๋ฆฐ ๋ฆฌ๋”(๋ณด์ด์Šค์˜ค๋ฒ„, ChromeVox, NVDA ๋˜๋Š” Lynx)์—์„œ ํ…Œ์ŠคํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Focus style: ๐Ÿ”ด ํฌ์ปค์Šค๊ฐ€ ๋น„ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ, CSS์—์„œ visible ์ƒํƒœ๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค.

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™


SEO

  • Google Analytics: ๐ŸŸข ๊ตฌ๊ธ€ ์• ๋„๋ฆฌํ‹ฑ์Šค๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • Search Console: ๐ŸŸข ์„œ์น˜ ์ฝ˜์†”์ด ์„ค์น˜๋˜์–ด ์žˆ๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Google์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ฌด๋ฃŒ ์„œ๋น„์Šค๋กœ, Google ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์—์„œ ์‚ฌ์ดํŠธ์˜ ์กด์žฌ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋ง, ์œ ์ง€ ๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.
  • Headings logic: ๐ŸŸ  Heading ํ…์ŠคํŠธ๊ฐ€ ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • sitemap.xml: ๐Ÿ”ด sitemap.xml์ด ์žˆ์œผ๋ฉฐ ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ์ฝ˜์†”(์ด์ „์—๋Š” ๊ตฌ๊ธ€ ์›น๋งˆ์Šคํ„ฐ ๋„๊ตฌ)์— ์ œ์ถœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • robots.txt: ๐Ÿ”ด robots.txt๊ฐ€ ์›นํŽ˜์ด์ง€๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Structured Data: ๐Ÿ”ด ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽ˜์ด์ง€๋Š” ํ…Œ์ŠคํŠธ๋˜์—ˆ๊ณ  ์˜ค๋ฅ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ํฌ๋กค๋Ÿฌ๊ฐ€ ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.
  • Sitemap HTML: ๐ŸŸ  HTML ์‚ฌ์ดํŠธ๋งต์ด ์ œ๊ณต๋˜๋ฉฐ ์›น์‚ฌ์ดํŠธ์˜ ํ‘ธํ„ฐ์— ์žˆ๋Š” ๋งํฌ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™


์ฐธ๊ณ 

โฌ† ํŽ˜์ด์ง€ ์ƒ๋‹จ์œผ๋กœ ์ด๋™