๐ 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>
โ ์ฌํ ํฌ์ธํธ:
- viewport: ๋ฐ์ํ ๋ชจ๋ฐ์ผ ํ์
- description, og:title ๋ฑ: SEO & SNS ๊ณต์ ์ต์ ํ
- robots: ๊ฒ์ ์์ง ํฌ๋กค๋ฌ ์ ์ฑ ์ ์ด ๊ฐ๋ฅ
- CSP(Content-Security-Policy): XSS ๋ณด์ ํ์ ์์ฑ
๐ 2) <link>
์ฌํ & ํ์ฅ
<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>
โ ์ค๋ฌด ๊ณ ๊ธ ํ:
- preconnect, preload โ ์น ์ฑ๋ฅ ์ต์ ํ ํ์
- canonical โ SEO์์ ์ค๋ณต ์ฝํ ์ธ ๋ฐฉ์ง
- CORS ํ์ํ ์ธ๋ถ ํฐํธ/๋ฆฌ์์ค โ crossorigin ์์ฑ ์ถ๊ฐ
๐ 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>
โ ํฌ์ธํธ:
- ๊ธด๊ธ ์์ , ์์ ์คํ์ผ ํ ์คํธ์ฉ์ผ๋ก ์ฌ์ฉ
- ์ค๋ฌด์์๋ ์ธ๋ถ CSS ํ์ผ๋ก ๊ด๋ฆฌ (์ ์ง๋ณด์ ์ฉ์ด)
๐ 5) <title>
์ฌํ
<head>
<title>ํ๊ธธ๋์ ๊ฐ๋ฐ ๋ธ๋ก๊ทธ | Frontend & Dev Tips</title>
</head>
โ ํฌ์ธํธ:
- ๋ธ๋๋๋ช + ํค์๋ ํฌํจ โ SEO ์ํฅ๋ ฅ ํผ
- ๊ฒ์ ๊ฒฐ๊ณผ, ๋ถ๋งํฌ, ํญ ์ ๋ชฉ ๋ชจ๋์ ๋ ธ์ถ
๐ฏ 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 โ ๋ณด์ ๊ฐ๋ ฅ ๊ฐํ | ์ค๋ฌด ํ๋ก์ ํธ ํ์ ์ ์ฉ |