TTV (Time to Viewport) ํบ์๋ณด๊ธฐ! ๐
TTV๋ Time to Viewport์ ์ฝ์๋ก, ์ฌ์ฉ์๊ฐ ์น ํ์ด์ง๋ฅผ ์ด์์ ๋, ์ฒซ ํ๋ฉด(๋ทฐํฌํธ)์ด ๋ ๋๋ง๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ฏธํฉ๋๋ค. ์น ์ฑ๋ฅ ์งํ ์ค ํ๋๋ก, ์ฒซ ์ธ์์ ์ข์ฐํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ TTV๊ฐ ๋ฌด์์ธ์ง, ์ ์ค์ํ์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ต์ ํํ๋ ๋ฐฉ๋ฒ๊น์ง ๊น์ด ํํค์ณ ๋ณด๊ฒ ์ต๋๋ค.
๐ฏ TTV๋ ๋ฌด์์ธ๊ฐ์?
TTV๋ ์น์ฌ์ดํธ๊ฐ ์ฌ์ฉ์ ํ๋ฉด์ ์ฒซ ๋ฒ์งธ ์ ์๋ฏธํ ์ฝํ ์ธ ๋ฅผ ํ์ํ๊ธฐ๊น์ง์ ์๊ฐ์ ์ธก์ ํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์ด์์ ๋ ์๋ฌด๊ฒ๋ ๋ณด์ด์ง ์๋ ์ํ์์ ์ฒซ ์ฝํ ์ธ ๊ฐ ๋ํ๋๋ ์๊ฐ๊น์ง์ ์๊ฐ์ธ First Paint์ ์ ์ฌํ์ง๋ง, TTV๋ ์ ์ ๊ฐ ์ค์ ๋ก ๋ณด๋ ํ๋ฉด์ ์ด์ ์ ๋ง์ถ๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด:
- ์ฌ์ฉ์๊ฐ ์น์ฌ์ดํธ๋ฅผ ๋ฐฉ๋ฌธํฉ๋๋ค.
- ๋ก๊ณ ๋ ํค๋ ์ด๋ฏธ์ง๊ฐ ํ๋ฉด์ ๋ ๋๋ง๋ฉ๋๋ค.
- ์ฌ์ฉ์๋ “์! ์ด์ ๋ฌด์ธ๊ฐ ๋ก๋๋๊ธฐ ์์ํ๊ตฌ๋!“๋ผ๊ณ ๋๋ผ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ก ์ด ์๊ฐ์ด TTV ์ ๋๋ค.
๐ค TTV๊ฐ ์ค์ํ ์ด์ ๋?
1๏ธโฃ ์ฌ์ฉ์ ์ฒซ์ธ์์ ์ง๊ฒฐ
์ฌ์ฉ์๋ ํ๋ฉด์ด ์๋ฌด๊ฒ๋ ๋ก๋๋์ง ์๋ ์ํ์์ ์ค๋ ๊ธฐ๋ค๋ฆฌ๋ฉด “์ด ์ฌ์ดํธ๋ ๋๋ฆฌ๋ค”๊ณ ๋๋ผ๊ณ ๋ ๋ ํ๋ฅ ์ด ๋์์ง๋๋ค.
2๏ธโฃ ์น ์ฑ๋ฅ๊ณผ ์ง๊ฒฐ
Google์ ์ฐ๊ตฌ์ ๋ฐ๋ฅด๋ฉด, ํ์ด์ง ๋ก๋ ์๊ฐ์ด 1์ด์์ 3์ด๋ก ๋์ด๋๋ฉด ์ดํ๋ฅ ์ด 32% ์ฆ๊ฐํ๋ค๊ณ ํฉ๋๋ค.
TTV๊ฐ ์งง์์๋ก ์ฌ์ฉ์ ๋ง์กฑ๋์ ์ ํ์จ์ด ๋์์ง๋๋ค.
3๏ธโฃ SEO ์ต์ ํ
TTV๋ ํ์ด์ง ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋ฉฐ, Google๊ณผ ๊ฐ์ ๊ฒ์ ์์ง์ ๋ญํน ์๊ณ ๋ฆฌ์ฆ์๋ ๋ฐ์๋ฉ๋๋ค.
๐ TTV ์ต์ ํ ๋ฐฉ๋ฒ
1๏ธโฃ Critical Rendering Path ์ต์ ํ
TTV๋ฅผ ๊ฐ์ ํ๋ ค๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉ์์๊ฒ ์ค์ํ ์ฝํ ์ธ ๋ฅผ ๋น ๋ฅด๊ฒ ๋ ๋๋งํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ํฌ๋ฆฌํฐ์ปฌ ๋ ๋๋ง ๊ฒฝ๋ก๋ฅผ ์ต์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
1. Render Blocking ๋ฆฌ์์ค ์ ๊ฑฐ
CSS, JavaScript ๋ฑ ์ค์ํ ๋ฆฌ์์ค๊ฐ ๋ก๋๋๊ธฐ ์ ๊น์ง ํ๋ฉด์ด ๋น ์ํ๋ก ๋ณด์ผ ์ ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ค๋ฉด ๋ฆฌ์์ค๋ฅผ ๋น๋๊ธฐ๋ก ๋ก๋ํ๊ฑฐ๋, ํ์ํ ๋ฆฌ์์ค๋ง ์ฐ์ ์ ์ผ๋ก ๋ก๋ํด์ผ ํฉ๋๋ค.
<link rel="stylesheet" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
2. ํฐํธ ๋์คํ๋ ์ด ์ต์ ํ
์นํฐํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ, ํ ์คํธ๊ฐ ๋ ๋๋ง๋์ง ์๊ณ ๋น์นธ์ผ๋ก ๋จ์ ์์ ์ ์์ต๋๋ค. font-display: swap์ ์ฌ์ฉํ๋ฉด ํฐํธ ๋ก๋ ์ ์ ๊ธฐ๋ณธ ํฐํธ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
@font-face {
font-family: 'CustomFont';
src: url('custom-font.woff2') format('woff2');
font-display: swap;
}
2๏ธโฃ Lazy Loading ์ ์ฉ
Lazy Loading์ ํตํด ์ฌ์ฉ์ ํ๋ฉด์ ํ์ํ ์ด๋ฏธ์ง๋ ์ฝํ ์ธ ๋ง ์ฐ์ ์ ์ผ๋ก ๋ก๋ํฉ๋๋ค.
<img src="placeholder.jpg" data-src="real-image.jpg" loading="lazy" />
3๏ธโฃ Server-Side Rendering (SSR) ํ์ฉ
React, Vue ๋ฑ SPA ํ๋ ์์ํฌ์์ SSR์ ์ฌ์ฉํ๋ฉด ์ด๊ธฐ HTML์ ์๋ฒ์์ ๋ ๋๋งํ์ฌ ์ฌ์ฉ์์๊ฒ ๋น ๋ฅด๊ฒ ์ ๋ฌํ ์ ์์ต๋๋ค.
// React ์์
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import App from './App';
const serverRender = () => {
const content = ReactDOMServer.renderToString(<App />);
return `
<html>
<body>
<div id="root">${content}</div>
<script src="bundle.js"></script>
</body>
</html>
`;
};
4๏ธโฃ CDN(Content Delivery Network) ํ์ฉ
CDN์ ํตํด ์ฌ์ฉ์์ ์ง๋ฆฌ์ ์์น์ ๊ฐ๊น์ด ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ์ฌ ๋ฆฌ์์ค ๋ก๋ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
5๏ธโฃ ์ด๋ฏธ์ง ์ต์ ํ
์ด๋ฏธ์ง๋ TTV์ ๊ฐ์ฅ ํฐ ์ํฅ์ ๋ฏธ์น๋ ์์ ์ค ํ๋์ ๋๋ค.
- WebP์ ๊ฐ์ ์ต์ ์ด๋ฏธ์ง ํฌ๋งท ์ฌ์ฉ
- ํฌ๊ธฐ๊ฐ ํฐ ์ด๋ฏธ์ง์ ํด์๋๋ฅผ ์ค์ด๊ณ , ์์ถ๋ฅ ์ ๋์ด๊ธฐ
๐ TTV ๊ด๋ จ ์ฃผ์ ๋๊ตฌ
TTV๋ฅผ ์ธก์ ํ๊ฑฐ๋ ์ต์ ํ ์ํ๋ฅผ ์ ๊ฒํ๊ธฐ ์ํด ๋ค์ ๋๊ตฌ๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
- Google Lighthouse: TTV๋ฅผ ๋น๋กฏํ ๋ค์ํ ์ฑ๋ฅ ์งํ๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค.
- PageSpeed Insights: Google์์ ์ ๊ณตํ๋ ์น ์ฑ๋ฅ ์ ๊ฒ ๋๊ตฌ๋ก, TTV ๊ด๋ จ ๊ฐ์ ์ ์ ์ ๊ณตํฉ๋๋ค.
- WebPageTest: ์ค์ ๋คํธ์ํฌ ํ๊ฒฝ์์ ํ์ด์ง ๋ก๋ ์๊ฐ์ ์๋ฎฌ๋ ์ด์
- Chrome DevTools: ๋คํธ์ํฌ ํญ์์ ๋ฆฌ์์ค ๋ก๋ ์๊ฐ์ ๋ถ์
๐งช TTV ์ค์ ์ต์ ํ: ์์
React์ Lazy Loading์ ํ์ฉํ TTV ๊ฐ์ ์์
import React, { Suspense, lazy } from "react";
const HeavyComponent = lazy(() => import("./HeavyComponent"));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<HeavyComponent />
</Suspense>
);
}
export default App;
Express.js์ SSR๋ก TTV ์ต์ ํ
import express from "express";
import React from "react";
import ReactDOMServer from "react-dom/server";
import App from "./App";
const server = express();
server.get("/", (req, res) => {
const content = ReactDOMServer.renderToString(<App />);
res.send(`
<html>
<body>
<div id="root">${content}</div>
<script src="bundle.js"></script>
</body>
</html>
`);
});
server.listen(3000, () => {
console.log("Server is running on http://localhost:3000");
});
๐ก ๊ฒฐ๋ก
TTV๋ ๋จ์ํ “ํ๋ฉด์ ๋ญ๊ฐ ๋ณด์ธ๋ค”์์ ๊ทธ์น์ง ์์ต๋๋ค. ์ฌ์ฉ์ ๊ฒฝํ๊ณผ SEO, ์น์ฌ์ดํธ ์ฑ๋ฅ ๋ชจ๋์ ์ฐ๊ฒฐ๋ ์ค์ํ ์งํ์ฃ . ์์ ์ต์ ํ ๋ฐฉ๋ฒ๋ค์ ์ค์ฒํ๋ฉด TTV๋ฅผ ์ค์ด๊ณ , ์ฌ์ฉ์์๊ฒ ์ต๊ณ ์ ์ฒซ์ธ์์ ์ ์ฌํ ์ ์์ต๋๋ค.
๐ท ์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น! ๐ท