๐Ÿ“Œ 1๏ธโƒฃ ์ฃผ์š” ํƒœ๊ทธ + ์‹ค๋ฌด ํฌ์ธํŠธ ์ด์ •๋ฆฌ

ํƒœ๊ทธ ์„ค๋ช… ์œ„์น˜ ์‹ค๋ฌด Best Practice ๐Ÿšฉ
<meta> ๋ฌธ์„œ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„ค์ • (SEO, ์ธ์ฝ”๋”ฉ, ๋ทฐํฌํŠธ ๋“ฑ) <head> SEO, ๋ฐ˜์‘ํ˜•, SNS ๊ณต์œ , ๋ณด์•ˆ ์„ค์ • ๋ชจ๋‘ ํฌํ•จ
<link> ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค ์—ฐ๊ฒฐ (CSS, ํŒŒ๋น„์ฝ˜, ํฐํŠธ, preload ๋“ฑ) <head> CSS, ํฐํŠธ, favicon, preload, preconnect ๋“ฑ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉ
<script> JavaScript ์—ฐ๊ฒฐ or ์‚ฝ์ž… <head> or <body> defer ๊ถŒ์žฅ โ†’ ๋ Œ๋”๋ง ์ฐจ๋‹จ ๋ฐฉ์ง€
<style> ๋‚ด๋ถ€ CSS ์ง์ ‘ ์ž‘์„ฑ <head> ํ…Œ์ŠคํŠธ์šฉ or ๊ธด๊ธ‰ ์ˆ˜์ •. ์‹ค๋ฌด์—์„  ์ตœ์†Œํ™”
<title> ๋ฌธ์„œ ์ œ๋ชฉ <head> SEO์— ์˜ํ–ฅ๋ ฅ ํผ. ๋ธŒ๋žœ๋“œ๋ช… ํฌํ•จ ๊ถŒ์žฅ

๐Ÿงฉ 2๏ธโƒฃ ๋น„์œ ๋กœ ๋” ์‰ฝ๊ฒŒ!

ํƒœ๊ทธ ๋น„์œ  ๐ŸŒŸ
<meta> ๐Ÿ“„ ์ฑ… ๋’ค์ชฝ์— ๋ถ™์€ ์ฑ… ์†Œ๊ฐœ, ์ €์ž ์ •๋ณด, ISBN, ํ‚ค์›Œ๋“œ
<link> ๐Ÿ”— ์™ธ๋ถ€ ๋ถ€๋ก, ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ถ ์—ฐ๊ฒฐ (CSS, ํŒŒ๋น„์ฝ˜, ํฐํŠธ)
<script> ๐ŸŽฎ ์ฑ… ์† ์ˆจ๊ฒจ์ง„ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๋ฒ„ํŠผ (JS ๊ธฐ๋Šฅ ์ถ”๊ฐ€)
<style> ๐ŸŽจ ์ฑ… ํŽ˜์ด์ง€์— ์ง์ ‘ ๊ทธ๋ ค๋†“์€ ์‚ฝํ™” (๋‚ด๋ถ€ ์Šคํƒ€์ผ)
<title> ๐Ÿท๏ธ ์ฑ… ์ œ๋ชฉ (๋ธŒ๋ผ์šฐ์ € ํƒญ, ์ฆ๊ฒจ์ฐพ๊ธฐ์— ํ‘œ์‹œ๋จ)

๐Ÿ—๏ธ 3๏ธโƒฃ ํƒœ๊ทธ๋ณ„ ์‹ฌํ™” ์˜ˆ์ œ + ์‹ค๋ฌด ๊ฟ€ํŒ


๐ŸŒŸ 1) <meta> ์‹ฌํ™” & ํ™•์žฅ

<head>
  <!-- ๊ธฐ๋ณธ ๋ฉ”ํƒ€ -->
  <meta charset="UTF-8"> <!-- ๋ฌธ์ž ์ธ์ฝ”๋”ฉ -->
  <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- ๋ฐ˜์‘ํ˜• ํ•„์ˆ˜ -->
  <meta name="description" content="๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ตœ๊ณ ์˜ ๋ธ”๋กœ๊ทธ"> <!-- SEO -->
  <meta name="keywords" content="HTML, CSS, JavaScript, React"> <!-- ํ‚ค์›Œ๋“œ (๊ฒ€์ƒ‰์—”์ง„ ์ฐธ๊ณ ) -->
  <meta name="author" content="ํ™๊ธธ๋™">

  <!-- SEO ๊ณ ๊ธ‰ -->
  <meta property="og:title" content="ํ™๊ธธ๋™์˜ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ"> <!-- Open Graph: SNS ๊ณต์œ  ์ œ๋ชฉ -->
  <meta property="og:description" content="ํ”„๋ก ํŠธ์—”๋“œ ์ตœ์‹  ์ •๋ณด ์ œ๊ณต"> <!-- SNS ๊ณต์œ  ์„ค๋ช… -->
  <meta property="og:image" content="thumbnail.jpg"> <!-- SNS ์ธ๋„ค์ผ -->
  <meta name="robots" content="index, follow"> <!-- ๊ฒ€์ƒ‰์—”์ง„ ํฌ๋กค๋ง ์ œ์–ด -->

  <!-- ๋ณด์•ˆ -->
  <meta http-equiv="Content-Security-Policy" content="default-src 'self'"> <!-- XSS, ์ฝ”๋“œ ์ธ์ ์…˜ ๋ฐฉ์ง€ -->
</head>

โœ… ์‹ฌํ™” ํฌ์ธํŠธ:


<head>
  <!-- ์™ธ๋ถ€ CSS -->
  <link rel="stylesheet" href="styles.css">
  <!-- ํŒŒ๋น„์ฝ˜ -->
  <link rel="icon" href="favicon.ico" type="image/x-icon">
  <!-- ์›นํฐํŠธ & ์„ฑ๋Šฅ ์ตœ์ ํ™” -->
  <link rel="preconnect" href="https://fonts.googleapis.com"> <!-- ์ดˆ๊ธฐ ์—ฐ๊ฒฐ ์ตœ์ ํ™” -->
  <link rel="preload" href="fonts/Roboto.woff2" as="font" type="font/woff2" crossorigin> <!-- ํฐํŠธ ๋น ๋ฅด๊ฒŒ -->
  <!-- canonical (SEO ์ค‘๋ณต ๋ฐฉ์ง€) -->
  <link rel="canonical" href="https://myblog.com/post/123">
</head>

โœ… ์‹ค๋ฌด ๊ณ ๊ธ‰ ํŒ:


๐ŸŒŸ 3) <script> ์‹ฌํ™” & ์ตœ์ ํ™”

<head>
  <script src="main.js" defer></script> <!-- defer โ†’ HTML ํŒŒ์‹ฑ ํ›„ ์‹คํ–‰, ๋ Œ๋”๋ง ์•ˆ ๋ง‰์Œ -->
  <script src="analytics.js" async></script> <!-- async โ†’ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ (๊ด‘๊ณ , ํŠธ๋ž˜ํ‚น) -->
</head>
์†์„ฑ ์„ค๋ช… ์‹ค๋ฌด ํŒ
defer HTML ํŒŒ์‹ฑ ๋๋‚˜๊ณ  ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ ๋ฉ”์ธ JS ํŒŒ์ผ์— ๊ถŒ์žฅ (๋ Œ๋”๋ง ์ง€์—ฐ X)
async ๋‹ค์šด๋กœ๋“œ ์™„๋ฃŒ๋˜์ž๋งˆ์ž ์‹คํ–‰ (์ˆœ์„œ ๋ณด์žฅ X) ๊ด‘๊ณ , ํŠธ๋ž˜ํ‚น์šฉ ์Šคํฌ๋ฆฝํŠธ์— ์‚ฌ์šฉ

๐ŸŒŸ 4) <style> ์‹ฌํ™”

<head>
  <style>
    body { background-color: #f0f0f0; }
    h1 { color: darkblue; }
  </style>
</head>

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


๐ŸŒŸ 5) <title> ์‹ฌํ™”

<head>
  <title>ํ™๊ธธ๋™์˜ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ | Frontend & Dev Tips</title>
</head>

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



๐ŸŽฏ 4๏ธโƒฃ SEO & ์„ฑ๋Šฅ ์ตœ์ ํ™” ์‹ค์ „ ํŒจํ„ด (์™„์„ฑํ˜•)

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="description" content="ํ”„๋ก ํŠธ์—”๋“œ ์ตœ์‹  ํŠธ๋ Œ๋“œ, ์‹ค๋ฌด ํŒ ์ œ๊ณต">
  <meta name="robots" content="index, follow">
  <meta property="og:title" content="ํ™๊ธธ๋™์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋ธ”๋กœ๊ทธ">
  <meta property="og:description" content="๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ตœ๊ณ ์˜ ์ •๋ณด">
  <meta property="og:image" content="thumbnail.png">

  <link rel="canonical" href="https://myblog.com/post/123">
  <link rel="stylesheet" href="style.css">
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="icon" href="favicon.ico">

  <title>ํ™๊ธธ๋™์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋ธ”๋กœ๊ทธ | ์ตœ์‹  ํŠธ๋ Œ๋“œ</title>

  <script src="main.js" defer></script>
  <script src="ads.js" async></script>
</head>

โœ… SEO, ์„ฑ๋Šฅ, ๋ณด์•ˆ, ์ ‘๊ทผ์„ฑ, SNS ๊ณต์œ ๊นŒ์ง€ ํ•œ ๋ฒˆ์— ์ตœ์ ํ™”!


๐Ÿง  5๏ธโƒฃ ๊ธฐ์ˆ  ๋ฉด์ ‘ ๊ณ ๊ธ‰ ์งˆ๋ฌธ ํฌ์ธํŠธ

์งˆ๋ฌธ ์‹ฌํ™” ํฌ์ธํŠธ
<meta name="viewport">์˜ ์—ญํ• ? ๋ฐ˜์‘ํ˜• ํ•„์ˆ˜. width=device-width ์„ค์ •
<link rel="preload">์˜ ํšจ๊ณผ๋Š”? ์ดˆ๊ธฐ ๋ฆฌ์†Œ์Šค ๋น ๋ฅธ ๋กœ๋”ฉ โ†’ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ํ–ฅ์ƒ
<script>์—์„œ defer์™€ async ์ฐจ์ด? defer: ํŒŒ์‹ฑ ํ›„ ์ˆœ์„œ๋Œ€๋กœ, async: ๋ณ‘๋ ฌ ์‹คํ–‰ (์ˆœ์„œ ๋ณด์žฅ X)
canonical ํƒœ๊ทธ์˜ ์—ญํ• ์€? ์ค‘๋ณต ์ฝ˜ํ…์ธ  ๋ฌธ์ œ ํ•ด๊ฒฐ โ†’ SEO ์ตœ์ ํ™”
Content-Security-Policy ๋ฉ”ํƒ€ ํƒœ๊ทธ์˜ ๊ธฐ๋Šฅ์€? XSS, ์ธ์ ์…˜ ๊ณต๊ฒฉ ๋ฐฉ์–ด (๋ณด์•ˆ ๊ฐ•ํ™”)

๐Ÿ’ผ 6๏ธโƒฃ ์‹ค๋ฌด Best Practice ์‹ฌํ™”

ํฌ์ธํŠธ ์„ค๋ช…
viewport, description, title ์ฒ ์ €ํžˆ ์„ค์ • ๋ฐ˜์‘ํ˜• & SEO ํ•„์ˆ˜
Open Graph, Twitter Card โ†’ SNS ๊ณต์œ  ์ตœ์ ํ™” og:title, og:image ์ ๊ทน ํ™œ์šฉ
์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค โ†’ preconnect, preload๋กœ ์ตœ์ ํ™” ํฐํŠธ, ์ด๋ฏธ์ง€, JS ๋น ๋ฅด๊ฒŒ ๋กœ๋”ฉ
script๋Š” defer ๊ธฐ๋ณธ, async๋Š” ๊ด‘๊ณ /ํŠธ๋ž˜ํ‚น์šฉ๋งŒ ๋ Œ๋”๋ง ์†๋„ โ†‘, UX โ†‘
canonical & robots โ†’ SEO ์™„๋ฒฝ ์„ธํŒ… ์ค‘๋ณต ๋ฐฉ์ง€ & ํฌ๋กค๋ง ์ œ์–ด
Content-Security-Policy โ†’ ๋ณด์•ˆ ๊ฐ•๋ ฅ ๊ฐ•ํ™” ์‹ค๋ฌด ํ”„๋กœ์ ํŠธ ํ•„์ˆ˜ ์ ์šฉ