TTI(Time to Interactive) ํบ์๋ณด๊ธฐ! ๐งพ
์น ํ์ด์ง๋ฅผ ๋ก๋ํ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ํ๊ฐํ ์ ์๋ ์ค์ํ ์ฑ๋ฅ ์งํ ์ค ํ๋๊ฐ ๋ฐ๋ก TTI(Time to Interactive)์ ๋๋ค. TTI๋ ๋จ์ํ ํ์ด์ง๊ฐ ๋ณด์ด๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ผ๋ฉฐ, ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ค์ ๋ก ์ํธ์์ฉํ ์ ์๋ ์์ ์ ์ธก์ ํฉ๋๋ค. ์ด ๊ธ์์๋ TTI๊ฐ ๋ฌด์์ธ์ง, ์ ์ค์ํ์ง, ์ด๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํ ์ ๋ต๊น์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐ TTI๋ ๋ฌด์์ธ๊ฐ์?
TTI๋ ์ฌ์ฉ์๊ฐ ์น ํ์ด์ง์ ์ํธ์์ฉํ ์ ์๋ ์ค๋น๊ฐ ๋๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ฏธํฉ๋๋ค. ์ฌ๊ธฐ์ ์ํธ์์ฉ์ด๋, ํด๋ฆญ ๋๋ ํค๋ณด๋ ๋๋ฆ๊ณผ ๊ฐ์ ์ฌ์ฉ์ ์ ๋ ฅ์ ์๋ฏธํฉ๋๋ค.
์๋ฅผ ๋ค์ด:
- ํ์ด์ง๊ฐ ์์ ํ ๋ก๋๋์ด ๋ณด์ด์ง๋ง,
- ๋ฒํผ์ ํด๋ฆญํด๋ ๋ฐ์์ด ์๋ค๋ฉด,
- ์ฌ์ฉ์๋ ํด๋น ํ์ด์ง๊ฐ ์์ง ์ค๋น๋์ง ์์๋ค๊ณ ๋๋๋๋ค.
TTI๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ์น ํ์ด์ง๊ฐ ์ค์ ๋ก ๋ฐ์ ๊ฐ๋ฅํ ์ํ๋ก ์ ํ๋๋ ์์ ์ ์ธก์ ํฉ๋๋ค.
๐ฏ TTI๋ ์ด๋ป๊ฒ ์ธก์ ๋๋์?
TTI๋ ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ํธ์์ฉ์ ์๋ํ ๋, ๋ธ๋ผ์ฐ์ ๊ฐ ํด๋น ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์๋ฉ๋๋ค. Google์ Lighthouse์์ ์ฌ์ฉํ๋ ๊ณต์ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ์ด์ง์ ์ฃผ์ ์ฝํ ์ธ ๊ฐ ๋ ๋๋ง๋๊ณ ,
- ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋ฑ๋ก๋์์ผ๋ฉฐ,
- ๋ฉ์ธ ์ค๋ ๋๊ฐ 50ms ์ด์ ์ฐจ๋จ๋์ง ์๋ ์ํ
์ธก์ ๊ธฐ์ค
- First Contentful Paint (FCP): ์ฒ์์ผ๋ก ์ฝํ ์ธ ๊ฐ ํ๋ฉด์ ํ์๋ ์์
- First CPU Idle: ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ฃผ์ ์์ ์ ์๋ฃํ๊ณ , ์ผ์์ ์ผ๋ก ์ ํด ์ํ์ธ ์์
- TTI: ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฒ๋ฆฌํ ์ค๋น๊ฐ ๋ ์ํ
๐ค ์ TTI๊ฐ ์ค์ํ๊ฐ์?
TTI๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํ์ง์ ์ง์ ์ ์ผ๋ก ๋ฐ์ํฉ๋๋ค. ๋ํ TTI๋ ์ฑ๋ฅ ์ด์ ๊ณ์ฐ์์ 10%์ ๊ฐ์ค์น๋ฅผ ๊ฐ๋๋ค๊ณ ํฉ๋๋ค.
- ์ฌ์ฉ์ ๋ง์กฑ๋: TTI๊ฐ ์งง์์๋ก ์ฌ์ฉ์๋ ํ์ด์ง๊ฐ ๋ฐ์์ด ๋น ๋ฅด๊ณ ์ง๊ด์ ์ด๋ผ๊ณ ๋๋๋๋ค.
- SEO์ ๋ญํน: Google์ TTI์ ๊ฐ์ ์ฑ๋ฅ ์งํ๋ฅผ ๊ฒ์ ๋ญํน์ ๋ฐ์ํฉ๋๋ค.
- ์ดํ๋ฅ ๊ฐ์: ๋๋ฆฐ ํ์ด์ง๋ ์ฌ์ฉ์๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ฒ ๋ง๋ค๊ณ , ์ด๋ ๋์ ์ดํ๋ฅ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ์ค์ ์ฌ์ฉ ๊ฐ๋ฅ์ฑ: ํ์ด์ง๊ฐ ์์ ํ ๋ ๋๋ง๋์๋๋ผ๋ ๋ฐ์ํ์ง ์๋๋ค๋ฉด, ์ฌ์ฉ์ ๊ฒฝํ์ ๋งค์ฐ ๋์ฉ๋๋ค.
๐ TTI๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ
TTI๋ฅผ ์ต์ ํํ๋ ค๋ฉด ํ์ด์ง๊ฐ ๋น ๋ฅด๊ฒ ์ํธ์์ฉ ๊ฐ๋ฅํ ์ํ๋ก ์ ํ๋๋๋ก ํด์ผ ํฉ๋๋ค. ์๋๋ ์ฃผ์ ์ ๋ต๋ค์ ๋๋ค.
1๏ธโฃ ๋ฉ์ธ ์ค๋ ๋ ์์ ์ค์ด๊ธฐ
TTI๋ฅผ ๋ฐฉํดํ๋ ๊ฐ์ฅ ํฐ ์์๋ ๋ฉ์ธ ์ค๋ ๋์ ๊ณผ๋ถํ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๋ฉ์ธ ์ค๋ ๋์์ ๋ ๋๋ง, ์๋ฐ์คํฌ๋ฆฝํธ ์คํ, ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ๋ฅผ ๋ชจ๋ ์ํํ๊ธฐ ๋๋ฌธ์ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ฐจ๋จ๋๋ฉด ๋ฐ์ ์๋๊ฐ ๋๋ ค์ง๋๋ค.
- ํฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ ๋ถํ : Webpack์ด๋ Rollup ๊ฐ์ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํด ์ฝ๋๋ฅผ ๋๋๋๋ค.
- ํฌ๋ฆฌํฐ์ปฌ ๋ ๋๋ง ๊ฒฝ๋ก ์ต์ ํ: ํ์ํ ์ฝ๋๋ง ๋ก๋ํ๊ณ ๋๋จธ์ง๋ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํฉ๋๋ค.
- ์ค๋ณต๋ ์์ ์ ๊ฑฐ: ๋ถํ์ํ ๊ณ์ฐ๊ณผ ๋ฐ๋ณต ์์ ์ ์ค์ ๋๋ค.
2๏ธโฃ Lazy Loading
ํ์ด์ง ๋ก๋ ์ด๊ธฐ์๋ ์ฌ์ฉ์์ ์ํธ์์ฉ์ ํ์ํ ํ์ ์์๋ง ๋ก๋ํ๊ณ , ๋๋จธ์ง๋ ์ฌ์ฉ์๊ฐ ํ์ํ ๋ ๋ก๋ํฉ๋๋ค.
<img src="placeholder.jpg" data-src="actual-image.jpg" loading="lazy" />
3๏ธโฃ Third-Party ์คํฌ๋ฆฝํธ ์ต์ ํ
- ๊ด๊ณ , ์์ ๋ฏธ๋์ด ์์ ฏ, ๋ถ์ ๋๊ตฌ ๋ฑ ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ ์ข ์ข TTI๋ฅผ ์ ํ์ํต๋๋ค.
- ์ค์ํ์ง ์์ ์คํฌ๋ฆฝํธ๋ async๋ defer ์์ฑ์ ์ฌ์ฉํด ๋น๋๊ธฐ๋ก ๋ก๋ํ์ธ์.
<script src="analytics.js" async></script>
4๏ธโฃ ์๋น์ค ์์ปค(Service Worker) ์ฌ์ฉ
- ๋คํธ์ํฌ ์์ฒญ์ ํจ์จ์ ์ผ๋ก ์บ์ฑํ๊ณ , ํ์ด์ง ๋ก๋ ์๊ฐ์ ์ค์ ๋๋ค.
- React, Vue ๋ฑ์ PWA(Progressive Web App) ์ค์ ์ ํตํด ์ฝ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
5๏ธโฃ ๋น๋๊ธฐ ๋ฐ ์ง์ฐ ์คํ
ํ์ํ์ง ์์ ์์ ์ ์ง์ฐ์์ผ ๋ฉ์ธ ์ค๋ ๋์ ๋ถ๋ด์ ์ค์ ๋๋ค.
// ์์ฒญ์ ์ง์ฐ ์คํ
setTimeout(() => {
console.log("์ง์ฐ ์คํ!");
}, 1000);
๐ ์ค์ TTI ์ต์ ํ ์ฌ๋ก
React์ Lazy Loading ์์
React์์ React.lazy๋ฅผ ์ฌ์ฉํด ์ปดํฌ๋ํธ๋ฅผ ๋์ ์ผ๋ก ๋ก๋ํ๋ฉด ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค.
import React, { Suspense } from "react";
const HeavyComponent = React.lazy(() => import("./HeavyComponent"));
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<HeavyComponent />
</Suspense>
);
}
๐งช TTI์ ๊ด๋ จ๋ ์ผ๋ฐ์ ์ธ ๋ฌธ์
TTI ์ต์ ํ๋ฅผ ์๋ํ๋ฉด์ ๋ง์ฃผํ ์ ์๋ ๋ฌธ์ ๋ค:
- ํฐ ๋ฒ๋ค ํฌ๊ธฐ: ์ด๊ธฐ ๋ก๋์ ๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ํฌํจ๋๋ฉด TTI๊ฐ ๊ธธ์ด์ง ์ ์์ต๋๋ค.
- ๋ธ๋กํน ๋ฆฌ์์ค: CSS์ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ด ๋ก๋๋๊ธฐ ์ ๊น์ง ํ์ด์ง๊ฐ ๋ ๋๋ง๋์ง ์์ ์ ์์ต๋๋ค.
- ๋ฎ์ ๋คํธ์ํฌ ์๋: ์ ์ฌ์ ๊ธฐ๊ธฐ๋ ๋๋ฆฐ ๋คํธ์ํฌ ํ๊ฒฝ์์ ๋ฌธ์ ๊ฐ ๋ ์ฌ๊ฐํ๊ฒ ๋ํ๋ฉ๋๋ค.
๐ TTI ์ธก์ ๋๊ตฌ
TTI๋ฅผ ์ธก์ ํ๊ณ ๋ชจ๋ํฐ๋งํ๊ธฐ ์ํ ์ฃผ์ ๋๊ตฌ:
- Lighthouse: TTI๋ฅผ ๋น๋กฏํ ๋ค์ํ ์ฑ๋ฅ ์งํ๋ฅผ ํ๊ฐ
- WebPageTest: ํ์ด์ง ๋ก๋ฉ ๊ณผ์ ์ ์์ธํ ๋ถ์
- Chrome DevTools: ๋ฉ์ธ ์ค๋ ๋ ์์ ์ ์ถ์ ํ์ฌ ๋ณ๋ชฉ ํ์ ํ์
- PageSpeed Insights: Google์์ ์ ๊ณตํ๋ ์น ์ฑ๋ฅ ๋ถ์ ๋๊ตฌ
๐ ๋ง๋ฌด๋ฆฌ: TTI๋ฅผ ์ก์๋ผ!
TTI๋ ๋จ์ํ ํ์ด์ง๊ฐ “๋ณด์ด๋” ๊ฒ์ ๋์ด, ์ฌ์ฉ์์ “์ํต”ํ ์ค๋น๊ฐ ๋์๋์ง ์ธก์ ํ๋ ์ค์ํ ์งํ์ ๋๋ค. React, ์๋น์ค ์์ปค, Lazy Loading ๋ฑ ๋ค์ํ ๊ธฐ์ ์ ํ์ฉํด TTI๋ฅผ ์ต์ ํํ๋ฉด, ์ฑ๋ฅ์ ๋ฌผ๋ก ์ฌ์ฉ์ ๋ง์กฑ๋๊น์ง ๋์ผ ์ ์๋ต๋๋ค.
๐ท์ ์ค์ ๊ฐ๋ฐ์๊ฐ ๋์ด๋ด ์๋น!๐ท