Performance Observer API๋ฅผ ์ฌ์ธต์ ์ผ๋ก ์ดํด๋ณด๊ณ , ํจ๊ณผ์ ์ธ ๋ณ๋ชฉ ํ์ ๋ถ์ ๋ฐ ์ต์ ํ๋ฅผ ์ํด ์ค์ํ ๋ฐํ์ ์ฑ๋ฅ ์งํ๋ฅผ ์์งํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ง๊ธ ๋ฐ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํค์ธ์!
Performance Observer API: ๋ฐํ์ ์ฑ๋ฅ ์งํ ํ์ธ ๋ฐ ๋ณ๋ชฉ ํ์ ๋ถ์
์ค๋๋ ๊น๋ค๋ก์ด ๋์งํธ ํ๊ฒฝ์์๋ ๋งค๋๋ฝ๊ณ ๋ฐ์์ด ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ด ๋ฌด์๋ณด๋ค ์ค์ํฉ๋๋ค. ๋๋ฆฐ ๋ก๋ฉ ์๊ฐ๊ณผ ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋ ์ํธ์์ฉ์ ์ฌ์ฉ์์ ๋ถ๋ง๊ณผ ์ดํ๋ก ๋น ๋ฅด๊ฒ ์ด์ด์ง ์ ์์ต๋๋ค. Performance Observer API๋ ๋ฐํ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ๊ณ ๋ถ์ํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์์ ์ฑ๋ฅ์ผ๋ก ์ต์ ํํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. ์ด ์ข ํฉ ๊ฐ์ด๋์์๋ Performance Observer API์ ๋ชจ๋ ๊ฒ์ ์ดํด๋ณด๊ณ , ๊ทธ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๋ ๋ฐ ๋์์ด ๋๋ ์ค์ฉ์ ์ธ ์์ ์ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
Performance Observer API๋ ๋ฌด์์ธ๊ฐ?
Performance Observer API๋ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ์ํ๋ ์ฑ๋ฅ ์งํ๋ฅผ ๊ตฌ๋ ํ ์ ์๊ฒ ํด์ฃผ๋ ์๋ฐ์คํฌ๋ฆฝํธ API์ ๋๋ค. ์ฌํ ๋ถ์์ด ํ์ํ ๊ธฐ์กด์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ์ ๋ฌ๋ฆฌ, Performance Observer API๋ ์ฑ๋ฅ ๋ฐ์ดํฐ์ ์ค์๊ฐ์ผ๋ก ์ ๊ทผํ ์ ์๊ฒ ํ์ฌ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ฆ์ ๋์ํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฌํ ์ค์๊ฐ ํผ๋๋ฐฑ ๋ฃจํ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น๊ธฐ ์ ์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํด๊ฒฐํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ ์ฒญ์ทจ ์ฅ์น๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. ํน์ ์ฑ๋ฅ ์ด๋ฒคํธ(์: ๊ธด ์์ , ๋ฆฌ์์ค ๋ก๋ฉ, ๋ ์ด์์ ๋ณ๊ฒฝ)๊ฐ ๋ฐ์ํ๋ฉด ์ต์ ๋ฒ์๊ฒ ์๋ฆผ์ด ๊ฐ๊ณ , ์ด๋ฒคํธ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์์ต๋๋ค.
์ฃผ์ ๊ฐ๋ ๋ฐ ์ฉ์ด
์ค์ฉ์ ์ธ ๊ตฌํ์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ๋ช ๊ฐ์ง ์ฃผ์ ๊ฐ๋ ๊ณผ ์ฉ์ด๋ฅผ ์ ์ํด ๋ณด๊ฒ ์ต๋๋ค:
- PerformanceEntry: ๋จ์ผ ์ฑ๋ฅ ์งํ ๋๋ ์ด๋ฒคํธ๋ฅผ ๋ํ๋ด๋ ๊ธฐ๋ณธ ์ธํฐํ์ด์ค์
๋๋ค.
name,entryType,startTime,duration๊ณผ ๊ฐ์ ๊ณตํต ์์ฑ์ ํฌํจํฉ๋๋ค. - PerformanceObserver: ์ฑ๋ฅ ํญ๋ชฉ์ ๋ํ ์๋ฆผ์ ๊ตฌ๋ ํ๊ณ ์์ ํ๋ ์ญํ ์ ํ๋ ํต์ฌ ์ธํฐํ์ด์ค์ ๋๋ค.
- entryTypes: ์ต์ ๋ฒ๊ฐ ๋ชจ๋ํฐ๋งํด์ผ ํ ์ฑ๋ฅ ํญ๋ชฉ์ ์ ํ์ ์ง์ ํ๋ ๋ฌธ์์ด ๋ฐฐ์ด์
๋๋ค. ์ผ๋ฐ์ ์ธ ํญ๋ชฉ ์ ํ์๋
'longtask','resource','layout-shift','paint','navigation'์ด ํฌํจ๋ฉ๋๋ค. - buffered: ์ต์ ๋ฒ๊ฐ ์์ฑ๋๊ธฐ ์ ์ ๋ฐ์ํ ์ฑ๋ฅ ํญ๋ชฉ์ ๋ํ ์๋ฆผ์ ์์ ํ ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ํ๋๊ทธ์ ๋๋ค.
- observe(): ์ฑ๋ฅ ํญ๋ชฉ ๊ด์ฐฐ์ ์์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฉ์๋์
๋๋ค.
entryTypes์bufferedํ๋๊ทธ๋ฅผ ์ง์ ํ๋ ์ต์ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. - disconnect(): ์ฑ๋ฅ ํญ๋ชฉ ๊ด์ฐฐ์ ์ค์งํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฉ์๋์ ๋๋ค.
Performance Observer ์ค์ ํ๊ธฐ
Performance Observer๋ฅผ ์์ฑํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. ๋ค์์ ๊ธด ์์ ์ ๊ด์ฐฐํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ณธ ์์ ์ ๋๋ค:
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log('Long Task:', entry);
// ๊ธด ์์
ํญ๋ชฉ ์ฒ๋ฆฌ
});
});
observer.observe({ entryTypes: ['longtask'] });
์ด ์์ ์์๋ ์๋ก์ด PerformanceObserver ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ์์ฑ์๋ ์ง์ ๋ ์ ํ์ ์๋ก์ด ์ฑ๋ฅ ํญ๋ชฉ์ด ๊ด์ฐฐ๋ ๋๋ง๋ค ์คํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค. list.getEntries() ๋ฉ์๋๋ ๊ด์ฐฐ๋ ํญ๋ชฉ ์ ํ๊ณผ ์ผ์นํ๋ PerformanceEntry ๊ฐ์ฒด์ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก observe() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๊ธด ์์
๊ด์ฐฐ์ ์์ํฉ๋๋ค.
์ฝ๋ ๋ถ์:
new PerformanceObserver((list) => { ... }): ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด ์ต์ ๋ฒ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ฝ๋ฐฑ์ `list` ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.list.getEntries().forEach((entry) => { ... }): `list`์์ ๋ชจ๋ PerformanceEntry ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ ๋ฐ๋ณตํฉ๋๋ค.console.log('Long Task:', entry);: ๊ธด ์์ ํญ๋ชฉ์ ์ฝ์์ ๊ธฐ๋กํฉ๋๋ค. ์ด ๋ถ๋ถ์ ์์ฒด ์ฒ๋ฆฌ ๋ก์ง์ผ๋ก ๋์ฒดํ๊ฒ ๋ฉ๋๋ค.observer.observe({ entryTypes: ['longtask'] });: 'longtask' ์ ํ์ ์ฑ๋ฅ ํญ๋ชฉ ๊ด์ฐฐ์ ์์ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์ฑ๋ฅ ํญ๋ชฉ ์ ํ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
Performance Observer API๋ ๋ค์ํ ํญ๋ชฉ ์ ํ์ ์ง์ํ๋ฉฐ, ๊ฐ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๋ํ ์๋ก ๋ค๋ฅธ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ๋ค์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ช ๊ฐ์ง ํญ๋ชฉ ์ ํ๊ณผ ๊ทธ ์ ์ฉ ์ฌ๋ก์ ๋๋ค:
1. ๊ธด ์์ (Long Tasks)
ํญ๋ชฉ ์ ํ: 'longtask'
๊ธด ์์ ์ ๋ฉ์ธ ์ค๋ ๋๋ฅผ 50๋ฐ๋ฆฌ์ด ์ด์ ์ฐจ๋จํ๋ ์์ ์ ๋งํฉ๋๋ค. ์ด๋ฌํ ์์ ์ ๋์ ๋๋ ์ง์ฐ๊ณผ ๋ฒ๋ฒ ๊ฑฐ๋ฆผ์ ์ ๋ฐํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๊ธด ์์ ์ ๋ชจ๋ํฐ๋งํ๋ฉด ๋นํจ์จ์ ์ธ ์ฝ๋๋ ๊ณผ๋ํ ์ฒ๋ฆฌ๋ก ์ธํด ๋ฐ์ํ๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ์์:
- ๊ณ์ฐ ๋น์ฉ์ด ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ์๋ณ.
- ๊ธด ์ง์ฐ์ ์ ๋ฐํ๋ ์๋ํํฐ ์คํฌ๋ฆฝํธ ์ต์ ํ.
- ํฐ ์์ ์ ๋ ์์ ๋น๋๊ธฐ ๋จ์๋ก ๋ถํ .
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log('Long Task:', entry.duration);
// ๊ธด ์์
์ ์ง์ ์๊ฐ์ ๋ถ์ํ์ฌ ์ ์ฌ์ ์ธ ๋ณ๋ชฉ ํ์์ ์๋ณํฉ๋๋ค.
});
});
observer.observe({ entryTypes: ['longtask'] });
2. ๋ฆฌ์์ค ํ์ด๋ฐ (Resource Timing)
ํญ๋ชฉ ์ ํ: 'resource'
๋ฆฌ์์ค ํ์ด๋ฐ API๋ ์ด๋ฏธ์ง, ์คํฌ๋ฆฝํธ, ์คํ์ผ์ํธ์ ๊ฐ์ ๊ฐ๋ณ ๋ฆฌ์์ค์ ๋ก๋ฉ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฆฌ์์ค ํ์ด๋ฐ์ ๋ชจ๋ํฐ๋งํ์ฌ ๋๋ฆฌ๊ฒ ๋ก๋๋๋ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๊ณ ์ ๋ฌ์ ์ต์ ํํ์ฌ ํ์ด์ง ๋ก๋ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ์์:
- ํ์ด์ง ๋ก๋๋ฅผ ๋๋ฆฌ๊ฒ ํ๋ ํฐ ์ด๋ฏธ์ง ์๋ณ.
- ์ด๋ฏธ์ง ์์ถ ๋ฐ ํ์ ์ต์ ํ.
- ๋ธ๋ผ์ฐ์ ์บ์ฑ์ ํ์ฉํ์ฌ ๋ฆฌ์์ค ๋ก๋ฉ ์๊ฐ ๋จ์ถ.
- ์๋ํํฐ ์คํฌ๋ฆฝํธ๊ฐ ํ์ด์ง ๋ก๋ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ ๋ถ์.
- DNS ์กฐํ, TCP ์ฐ๊ฒฐ ๋ฐ TLS ํ์ ๋ณ๋ชฉ ํ์ ์๋ณ.
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log('Resource:', entry.name, entry.duration);
// ๋ฆฌ์์ค ๋ก๋ฉ ์๊ฐ์ ๋ถ์ํ๊ณ ๋ฆฌ์์ค ์ ๋ฌ์ ์ต์ ํํฉ๋๋ค.
});
});
observer.observe({ entryTypes: ['resource'] });
3. ๋ ์ด์์ ๋ณ๊ฒฝ (Layout Shifts)
ํญ๋ชฉ ์ ํ: 'layout-shift'
๋ ์ด์์ ๋ณ๊ฒฝ์ ์น ํ์ด์ง์ ์์๊ฐ ์๊ธฐ์น ์๊ฒ ์์น๋ฅผ ๋ณ๊ฒฝํ์ฌ ๊ฑฐ์ฌ๋ฆฌ๊ณ ๋ฐฉํด๊ฐ ๋๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๋ฐํ ๋ ๋ฐ์ํฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ์ ์ข ์ข ํฌ๊ธฐ๊ฐ ์ง์ ๋์ง ์์ ์ด๋ฏธ์ง, ๋์ ์ผ๋ก ์ฃผ์ ๋ ์ฝํ ์ธ ๋๋ ๋ฆ๊ฒ ๋ก๋๋๋ ๊ธ๊ผด๋ก ์ธํด ๋ฐ์ํฉ๋๋ค. ๋ ์ด์์ ๋ณ๊ฒฝ์ ๋ชจ๋ํฐ๋งํ๋ฉด ์ด๋ฌํ ์๊ธฐ์น ์์ ๋ณ๊ฒฝ์ ๊ทผ๋ณธ ์์ธ์ ์๋ณํ๊ณ ํด๊ฒฐํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ฐ์ ์์ ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ์์:
- ๋ ์ด์์ ๋ณ๊ฒฝ์ ์ ๋ฐํ๋ ํฌ๊ธฐ๊ฐ ์ง์ ๋์ง ์์ ์ด๋ฏธ์ง ์๋ณ.
- ๋์ ์ผ๋ก ์ฃผ์ ๋ ์ฝํ ์ธ ์ ๋ก๋ฉ์ ์ต์ ํํ์ฌ ๋ ์ด์์ ๋ณ๊ฒฝ ์ต์ํ.
- ๊ธ๊ผด ํ์ ์ ๋ต์ ์ฌ์ฉํ์ฌ ๊ธ๊ผด ๋ก๋ฉ์ผ๋ก ์ธํ ๋ ์ด์์ ๋ณ๊ฒฝ ๋ฐฉ์ง.
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log('Layout Shift:', entry.value);
// ๋ ์ด์์ ๋ณ๊ฒฝ ์ ์๋ฅผ ๋ถ์ํ๊ณ ๋ณ๊ฒฝ์ ์ ๋ฐํ๋ ์์๋ฅผ ์๋ณํฉ๋๋ค.
});
});
observer.observe({ entryTypes: ['layout-shift'] });
4. ํ์ธํธ ํ์ด๋ฐ (Paint Timing)
ํญ๋ชฉ ์ ํ: 'paint'
ํ์ธํธ ํ์ด๋ฐ API๋ ์ฌ์ฉ์์ ์ฒด๊ฐ ๋ก๋ฉ ์ฑ๋ฅ์ ์ค์ํ ์งํ์ธ ์ต์ด ํ์ธํธ(FP) ๋ฐ ์ต์ด ์ฝํ ์ธ ํ ํ์ธํธ(FCP)์ ๋ํ ๋ฉํธ๋ฆญ์ ์ ๊ณตํฉ๋๋ค. ํ์ธํธ ํ์ด๋ฐ์ ๋ชจ๋ํฐ๋งํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋๋ง์ ์ต์ ํํ์ฌ ๋ ๋น ๋ฅด๊ณ ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ์์:
- ์ค์ ๋ ๋๋ง ๊ฒฝ๋ก๋ฅผ ์ต์ ํํ์ฌ ์ต์ด ํ์ธํธ๊น์ง์ ์๊ฐ ๋จ์ถ.
- ์ค์ํ์ง ์์ ๋ฆฌ์์ค๋ฅผ ์ง์ฐ์์ผ ์ต์ด ์ฝํ ์ธ ํ ํ์ธํธ๊น์ง์ ์๊ฐ ๊ฐ์ .
- ์ฝ๋ ๋ถํ ๋ฐ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ์ฌ ์ด๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค ํฌ๊ธฐ ์ถ์.
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log('Paint:', entry.name, entry.startTime);
// ํ์ธํธ ํ์ด๋ฐ์ ๋ถ์ํ๊ณ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ต์ ํํฉ๋๋ค.
});
});
observer.observe({ entryTypes: ['paint'] });
5. ํ์ ํ์ด๋ฐ (Navigation Timing)
ํญ๋ชฉ ์ ํ: 'navigation'
ํ์ ํ์ด๋ฐ API๋ ์ด๊ธฐ ์์ฒญ๋ถํฐ ํ์ด์ง ๋ก๋ ์๋ฃ๊น์ง ํ์ด์ง ํ์ ๊ณผ์ ์ ์ฌ๋ฌ ๋จ๊ณ์ ๋ํ ์์ธํ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ์ ํ์ด๋ฐ์ ๋ชจ๋ํฐ๋งํ๋ฉด ํ์ ๊ณผ์ ์ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ์ ๋ฐ์ ์ธ ํ์ด์ง ๋ก๋ ๊ฒฝํ์ ์ต์ ํํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ์์:
- DNS ์กฐํ ์๊ฐ, TCP ์ฐ๊ฒฐ ์๊ฐ ๋ฐ TLS ํ์ ์๊ฐ ๋ถ์.
- ์๋ฒ ์ธก ์ฒ๋ฆฌ ๋ณ๋ชฉ ํ์ ์๋ณ.
- HTML ์ฝํ ์ธ ์ ๋ฌ์ ์ต์ ํํ์ฌ TTFB(Time to First Byte) ๋จ์ถ.
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
console.log('Navigation:', entry.duration);
// ํ์ ํ์ด๋ฐ์ ๋ถ์ํ๊ณ ํ์ด์ง ๋ก๋ ํ๋ก์ธ์ค๋ฅผ ์ต์ ํํฉ๋๋ค.
});
});
observer.observe({ entryTypes: ['navigation'] });
์ค์ ์ฌ๋ก ๋ฐ ์ฌ์ฉ ์๋๋ฆฌ์ค
Performance Observer API๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ค์ํ ์๋๋ฆฌ์ค์ ์ ์ฉ๋ ์ ์์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ค์ ์ฌ๋ก ๋ฐ ์ฌ์ฉ ์๋๋ฆฌ์ค์ ๋๋ค:
1. ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ: ์ํ ์ด๋ฏธ์ง ๋ก๋ฉ ์ต์ ํ
์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ๋ ๋ฆฌ์์ค ํ์ด๋ฐ API๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์ด๋ฏธ์ง์ ๋ก๋ฉ ์๊ฐ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ํ์ด์ง ๋ก๋๋ฅผ ๋๋ฆฌ๊ฒ ํ๋ ํฐ ์ด๋ฏธ์ง๋ฅผ ์๋ณํจ์ผ๋ก์จ ์น์ฌ์ดํธ๋ ์ด๋ฏธ์ง ์์ถ์ ์ต์ ํํ๊ณ ๋ฐ์ํ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ธ๋ผ์ฐ์ ์บ์ฑ์ ํ์ฉํ์ฌ ์ผํ ๊ฒฝํ์ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ณธ์ ํ ์จ๋ผ์ธ ์๋งค์ ์ฒด๋ ๊ณ ๊ธ ์ฅ์น์์๋ ์๋ฒฝํ๊ฒ ๋ ๋๋ง๋๋ ๊ณ ํด์๋ ์ด๋ฏธ์ง๊ฐ ์๊ณจ ์ง์ญ์ ๋๋ฆฐ ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋ ์ฌ์ฉ์์๊ฒ๋ ์ฉ๋ฉํ ์ ์๋ ๋ก๋ฉ ์๊ฐ์ ์ ๋ฐํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ๋ฆฌ์์ค ํ์ด๋ฐ API๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ์ํ ์ด๋ฏธ์ง ์ ๋ฌ์ ๊ตฌํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
2. ๋ด์ค ์น์ฌ์ดํธ: ๊ด๊ณ ๋ก๋ฉ์ผ๋ก ์ธํ ๋ ์ด์์ ๋ณ๊ฒฝ ์ค์ด๊ธฐ
๋ด์ค ์น์ฌ์ดํธ๋ ๋ ์ด์์ ๋ณ๊ฒฝ API๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ์ฃผ์ ๋ ๊ด๊ณ ๋ก ์ธํ ๋ ์ด์์ ๋ณ๊ฒฝ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ๊ด๊ณ ๊ณต๊ฐ์ ์์ฝํ๊ณ ๊ด๊ณ ์ฝํ ์ธ ๋ก๋ฉ์ ์ต์ ํํจ์ผ๋ก์จ ์น์ฌ์ดํธ๋ ๋ ์ด์์ ๋ณ๊ฒฝ์ ์ต์ํํ๊ณ ๋ ์์ ์ ์ด๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ์ฝ๊ธฐ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ค์ํ ๊ธฐ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ํ ๋ ์์ธต์ ๋ณด์ ํ ์ธ๋์ ํ ๋ด์ค ๋งค์ฒด๋ ์ด API๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ์์ค์ ๊ด๊ณ ๊ฐ ๋ค๋ฅธ ์๋๋ก ๋ก๋๋ ๋์๋ ์ผ๊ด๋ ์ฝ๊ธฐ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ๊ฐ์์ค๋ฌ์ด ์ฝํ ์ธ ์ด๋์ ํผํ๋ฉด ์ฌ์ฉ์ ์ฐธ์ฌ๋๋ฅผ ๋์ด๊ณ ์ดํ๋ฅ ์ ์ค์ผ ์ ์์ต๋๋ค.
3. ์์ ๋ฏธ๋์ด ํ๋ซํผ: ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ๋ก ์ธํ ๊ธด ์์ ๋ถ์
์์ ๋ฏธ๋์ด ํ๋ซํผ์ ๊ธด ์์ API๋ฅผ ์ฌ์ฉํ์ฌ ์ง์ฐ๊ณผ ๋ฒ๋ฒ ๊ฑฐ๋ฆผ์ ์ ๋ฐํ๋ ๊ณ์ฐ ๋น์ฉ์ด ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ํจ์๋ฅผ ์๋ณํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํจ์๋ฅผ ์ต์ ํํ๊ฑฐ๋ ๋ ์์ ๋น๋๊ธฐ ๋จ์๋ก ๋ถํ ํจ์ผ๋ก์จ ํ๋ซํผ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ๋ฐ์์ฑ์ ๊ฐ์ ํ๊ณ ๋ ๋ถ๋๋ฌ์ด ๋ธ๋ผ์ฐ์ง ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฏธ๊ตญ์ ๋ณธ์ฌ๋ฅผ ๋ ํ ์์ ๋ฏธ๋์ด ํ์ฌ๋ ํน์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์ํฌ์ ํฌ๊ฒ ์์กดํ๋ ์ผ๋ถ ๊ธฐ๋ฅ์ด ๋๋จ์์์ ์ฌ์ฉ์๋ค์ด ์ฌ์ฉํ๋ ๊ตฌํ ๋ชจ๋ฐ์ผ ์ฅ์น์์ ๊ธด ์์ ์ ์ ๋ฐํ๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณ๋ชฉ ํ์์ ์๋ณํจ์ผ๋ก์จ ์ต์ ํ ๋ ธ๋ ฅ์ ์ฐ์ ์์๋ก ์ ํ๊ฑฐ๋ ๋์ฒด ํ๋ ์์ํฌ ๊ตฌํ์ ๋ชจ์ํ ์ ์์ต๋๋ค.
4. ์น ๊ธฐ๋ฐ ๊ฒ์: ํ๋ ์ ๋ ๋๋ง ์๊ฐ ๋ชจ๋ํฐ๋ง
์น ๊ธฐ๋ฐ ๊ฒ์์ ํ์ธํธ ํ์ด๋ฐ API๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ์ ๋ ๋๋ง ์๊ฐ์ ๋ชจ๋ํฐ๋งํ๊ณ ๊ฒ์์ ๋ถ๋๋ฌ์์ ์ํฅ์ ๋ฏธ์น๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ ์ ์์ต๋๋ค. ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ต์ ํํ๊ณ ๊ฐ ํ๋ ์์์ ์ํ๋๋ ์์ ๋์ ์ค์์ผ๋ก์จ ๊ฒ์์ ๋ ์ ๋์ ์ด๊ณ ๋งค๋ ฅ์ ์ธ ๊ฒ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ๊ณ ๊ฐ์ ๋์์ผ๋ก ํ๋ ์ ๋ฝ์ ํ ๊ฒ์ ๊ฐ๋ฐ์๋ ์ด API๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ํ๋์จ์ด ๊ตฌ์ฑ์์ ๊ฒ์์ด ์ํํ๊ฒ ์คํ๋๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ฌ๋ฌ ์ง๋ฆฌ์ ์ง์ญ์ ๊ฑธ์น ๋ ๋๋ง ์ฑ๋ฅ์ ์ฐจ์ด๋ฅผ ์๋ณํ๋ฉด ๋ชจ๋ ๊ณณ์์ ์ต์ ์ ์ฑ๋ฅ์ ์ํด ๊ฒ์์ ์์ฐ๊ณผ ์ฝ๋๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
5. ์จ๋ผ์ธ ํ์ต ํ๋ซํผ: ํ์ ๋ฐ ํ์ด์ง ์ ํ ๊ฐ์
์จ๋ผ์ธ ํ์ต ํ๋ซํผ์ ํ์ ํ์ด๋ฐ API๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง ํ์ ๊ณผ์ ์ ์ฌ๋ฌ ๋จ๊ณ๋ฅผ ๋ถ์ํ๊ณ ์ ๋ฐ์ ์ธ ํ์ด์ง ๋ก๋ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น๋ ๋ณ๋ชฉ ํ์์ ์๋ณํ ์ ์์ต๋๋ค. ์๋ฒ ์ธก ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ๊ณ HTML ์ฝํ ์ธ ์ ๋ฌ์ ๊ฐ์ ํ๋ฉฐ ๋ธ๋ผ์ฐ์ ์บ์ฑ์ ํ์ฉํจ์ผ๋ก์จ ํ๋ซํผ์ ๋ ๋น ๋ฅด๊ณ ์ํํ ํ์ต ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ ์ธ๊ณ ํ์๋ค์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์บ๋๋ค ๊ธฐ๋ฐ์ ๊ต์ก ํ๋ซํผ์ ํ์ ํ์ด๋ฐ์ ๋ถ์ํ์ฌ ์ธํฐ๋ท ์ธํ๋ผ๊ฐ ์ ํ๋ ๊ตญ๊ฐ์ ํ์๋ค์ด ๊ฐ์ ๊ฐ ์ด๋ ์ ์์ฉ ๊ฐ๋ฅํ ๋ก๋ฉ ์๊ฐ์ ๊ฒฝํํ๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. ํน์ ์ง์ญ์์ ๋๋ฆฐ ์๋ฒ ์๋ต์ ์๋ณํ๋ฉด ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ(CDN) ๊ตฌ์ฑ์ ์ต์ ํํ ์ ์์ต๋๋ค.
Performance Observer API ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
Performance Observer API๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ๋ถ์๊ณผ ๊ด๋ จ๋ ํญ๋ชฉ ์ ํ๋ง ๊ด์ฐฐํ์ญ์์ค. ๋๋ฌด ๋ง์ ํญ๋ชฉ ์ ํ์ ๊ด์ฐฐํ๋ฉด ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๊ณ ๊ฐ์ฅ ์ค์ํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ธฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ํญ๋ชฉ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ์ญ์์ค. ์ต์ ๋ฒ ์ฝ๋ฐฑ ํจ์์์ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ์ํํ๋ฉด ์ฑ๋ฅ์ ๋ถ์ ์ ์ธ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฏ๋ก ํผํ์ญ์์ค. ์น ์์ปค๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ๋ฅผ ๋ณ๋์ ์ค๋ ๋๋ก ์คํ๋ก๋ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์์ง๋๋ ๋ฐ์ดํฐ ์์ ์ค์ด๊ธฐ ์ํด ์ํ๋ง ๊ธฐ์ ์ ์ฌ์ฉํ์ญ์์ค. ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์์ง๋๋ ๋ฐ์ดํฐ ์์ ์ค์ด๊ณ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ๊ธฐ ์ํด ์ฑ๋ฅ ํญ๋ชฉ์ ์ํ๋งํด์ผ ํ ์๋ ์์ต๋๋ค.
- ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ์ญ์์ค. Performance Observer API๋ ๋น๊ต์ ์์ ์ ์ด์ง๋ง ์๊ธฐ์น ์์ ์ค๋ฅ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฉํดํ์ง ์๋๋ก ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ฑ๋ฅ ๋ฐ์ดํฐ ์์ง์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ์ํฅ์ ๊ณ ๋ คํ์ญ์์ค. ์์งํ๋ ์ฑ๋ฅ ๋ฐ์ดํฐ์ ๋ํด ์ฌ์ฉ์์๊ฒ ํฌ๋ช ํ๊ฒ ์๋ฆฌ๊ณ ๋ชจ๋ ๊ด๋ จ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๊ท์ ์ ์ค์ํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค. ์ด๋ ์ ๋ฝ ์ฐํฉ์ GDPR๊ณผ ๊ฐ์ด ์๊ฒฉํ ๋ฐ์ดํฐ ๋ณดํธ๋ฒ์ด ์๋ ์ง์ญ์์ ํนํ ์ค์ํฉ๋๋ค.
- `buffered` ์ต์ ์ ํ๋ช ํ๊ฒ ์ฌ์ฉํ์ญ์์ค. ์ด๊ธฐ ์ฑ๋ฅ ์งํ๋ฅผ ์บก์ฒํ๋ ๋ฐ ์ ์ฉํ์ง๋ง, `buffered: true`๋ฅผ ์ฌ์ฉํ๋ฉด ํนํ ๋ง์ ์์ ์ด๋ฒคํธ๋ฅผ ๊ด์ฐฐํ ๋ ์ ์ฌ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์๋ค๋ ์ ์ ์ธ์งํด์ผ ํฉ๋๋ค. ์ ์คํ๊ฒ ์ฌ์ฉํ๊ณ ํนํ ์ ์ฌ์ ์ฅ์น์์ ์ฑ๋ฅ์ ๋ฏธ์น ์ ์๋ ์ ์ฌ์ ์ํฅ์ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋๋ฐ์ด์ค ๋๋ ์ค๋กํ๋งํ์ญ์์ค. ๋ถ์์ ์ํด ์๊ฒฉ ์๋ฒ๋ก ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ฒฝ์ฐ, ํนํ ํ๋์ด ๋ง์ ๊ธฐ๊ฐ ๋์ ๋คํธ์ํฌ์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ก ๋ฐ์ดํฐ ์ ์ก์ ๋๋ฐ์ด์คํ๊ฑฐ๋ ์ค๋กํ๋งํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
๊ณ ๊ธ ๊ธฐ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
1. ์ฑ๋ฅ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ์น ์์ปค ์ฌ์ฉ
์์ ์ธ๊ธํ๋ฏ์ด Performance Observer ์ฝ๋ฐฑ ๋ด์์ ์ง์ ๋ณต์กํ ๊ณ์ฐ์ ์ํํ๋ฉด ๋ฉ์ธ ์ค๋ ๋์ ๋ฐ์์ฑ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ด ์ฒ๋ฆฌ๋ฅผ ์น ์์ปค๋ก ์คํ๋ก๋ํ๋ ๊ฒ์ ๋๋ค. ์น ์์ปค๋ ๋ณ๋์ ์ค๋ ๋์์ ์คํ๋๋ฏ๋ก ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ์งํ ์ ์์ต๋๋ค.
๋ค์์ ๊ฐ๋จํ ์์ ๋๋ค:
- ์น ์์ปค ์คํฌ๋ฆฝํธ ์์ฑ (์: `performance-worker.js`):
// performance-worker.js
self.addEventListener('message', (event) => {
const performanceData = event.data;
// ์ฌ๊ธฐ์์ ๋ณต์กํ ๋ถ์์ ์ํํฉ๋๋ค
const processedData = processPerformanceData(performanceData); // ์ค์ ํจ์๋ก ๋์ฒดํ์ธ์
self.postMessage(processedData);
});
function processPerformanceData(data) {
// ์ฌ๊ธฐ์ ๋ณต์กํ ์ฒ๋ฆฌ ๋ก์ง์ ์์ฑํฉ๋๋ค
return data; // ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ก ๋์ฒดํ์ธ์
}
- ๋ฉ์ธ ์คํฌ๋ฆฝํธ์์:
const worker = new Worker('performance-worker.js');
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
// ์ฒ๋ฆฌ๋ฅผ ์ํด ํญ๋ชฉ์ ์์ปค๋ก ๋ณด๋
๋๋ค
worker.postMessage(entries);
});
worker.addEventListener('message', (event) => {
const processedData = event.data;
// ์์ปค์์ ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค
console.log('Processed Data from Worker:', processedData);
});
observer.observe({ entryTypes: ['longtask'] });
์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ๋ฉ์ธ ์ค๋ ๋์ ๋ฐ์์ฑ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๋ณต์กํ ๋ถ์์ ์ํํ ์ ์์ผ๋ฏ๋ก ๋ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
2. ์ฑ๋ฅ ๋ฐ์ดํฐ์ ์ฌ์ฉ์ ํ๋ ์ฐ๊ด์ํค๊ธฐ
๋ ๊น์ ํต์ฐฐ๋ ฅ์ ์ป์ผ๋ ค๋ฉด ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ ํน์ ์ฌ์ฉ์ ํ๋๊ณผ ์ฐ๊ด์ํค์ญ์์ค. ์๋ฅผ ๋ค์ด, ์ด๋ค ๋ฒํผ ํด๋ฆญ์ด๋ ์ํธ์์ฉ์ด ๊ธด ์์ ์ด๋ ๋ ์ด์์ ๋ณ๊ฒฝ์ ์ ๋ฐํ๋์ง ์ถ์ ํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ผ์ผํค๋ ์ ํํ ์ฝ๋๋ ๊ตฌ์ฑ ์์๋ฅผ ์ฐพ์๋ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ฌ์ฉ์ ์ง์ ์ด๋ฒคํธ์ ํ์์คํฌํ๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ํญ๋ชฉ์ ์ฌ์ฉ์ ์ํธ์์ฉ๊ณผ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
// ์์ : ๋ฒํผ ํด๋ฆญ์ ์ถ์ ํ๊ณ ๊ธด ์์
๊ณผ ์ฐ๊ด์ํค๊ธฐ
document.getElementById('myButton').addEventListener('click', () => {
const clickTimestamp = Date.now();
// ์ฌ๊ธฐ์ ๋ฒํผ ํด๋ฆญ ๋ก์ง์ ์์ฑํฉ๋๋ค
performSomeAction();
// ํด๋ฆญ ํ ๊ธด ์์
์ ๊ด์ฐฐํฉ๋๋ค
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
if (entry.startTime >= clickTimestamp) {
console.log('Long Task after button click:', entry);
// clickTimestamp์ ํจ๊ป ๊ธด ์์
๋ฐ์ดํฐ๋ฅผ ๋ถ์ ์๋น์ค๋ก ๋ณด๋
๋๋ค
}
});
});
observer.observe({ entryTypes: ['longtask'] });
});
์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์ ํ๋๊ณผ ์ฐ๊ด์ํด์ผ๋ก์จ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํ ํจ์ฌ ๋ ์ธ๋ถํ๋ ์ดํด๋ฅผ ์ป๊ณ ๊ทธ์ ๋ฐ๋ผ ์ต์ ํ ๋ ธ๋ ฅ์ ์ฐ์ ์์๋ฅผ ์ ํ ์ ์์ต๋๋ค.
3. Performance Marks ๋ฐ Measures ํ์ฉ
Performance API๋ ๋ํ performance.mark() ๋ฐ performance.measure() ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
๋ด์์ ์ฌ์ฉ์ ์ง์ ์ฑ๋ฅ ์งํ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. ๋งํฌ๋ ์ฝ๋์ ํน์ ์ง์ ์ ์ฝ์
ํ ์ ์๋ ํ์์คํฌํ์ด๊ณ , ์ธก์ ์ ๋ ๋งํฌ ์ฌ์ด์ ์ง์ ์๊ฐ์ ๊ณ์ฐํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์๋ ํน์ ์ฝ๋ ๋ธ๋ก์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
// ์์ : ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์์์ ์ฑ๋ฅ ์ธก์
performance.mark('componentStart');
// ์ฌ๊ธฐ์ ๊ตฌ์ฑ ์์ ๋ ๋๋ง ๋ก์ง์ ์์ฑํฉ๋๋ค
renderMyComponent();
performance.mark('componentEnd');
performance.measure('componentRenderTime', 'componentStart', 'componentEnd');
const measure = performance.getEntriesByName('componentRenderTime')[0];
console.log('Component Render Time:', measure.duration);
๊ทธ๋ฐ ๋ค์ 'measure' ํญ๋ชฉ ์ ํ์ ๊ด์ฐฐํ์ฌ Performance Observer API๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฌํ ์ฌ์ฉ์ ์ง์ ์ธก์ ์ ๊ด์ฐฐํ ์ ์์ต๋๋ค.
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
if (entry.entryType === 'measure') {
console.log('Custom Measure:', entry.name, entry.duration);
}
});
});
observer.observe({ entryTypes: ['measure'] });
Performance Observer API์ ๋์
Performance Observer API๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ์ํ ์ ์ผํ ์ต์ ์ ์๋๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ๋์์ ๋๋ค:
- Google Lighthouse: ์์ธํ ์ฑ๋ฅ ๋ณด๊ณ ์์ ๊ฐ์ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํ๋ ํฌ๊ด์ ์ธ ๊ฐ์ฌ ๋๊ตฌ์ ๋๋ค.
- WebPageTest: ๋ค์ํ ์์น์ ๋ธ๋ผ์ฐ์ ์์ ์น์ฌ์ดํธ ์ฑ๋ฅ์ ํ ์คํธํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ์จ๋ผ์ธ ๋๊ตฌ์ ๋๋ค.
- ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ: Chrome DevTools, Firefox Developer Tools ๋ฐ ๊ธฐํ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ ํ๋กํ์ผ๋ง, ํ์๋ผ์ธ ๊ธฐ๋ก, ๋คํธ์ํฌ ๋ถ์ ๋ฑ ํ๋ถํ ์ฑ๋ฅ ๋ถ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ์ค์ ์ฌ์ฉ์ ๋ชจ๋ํฐ๋ง(RUM) ๋๊ตฌ: RUM ๋๊ตฌ๋ ์ค์ ์ฌ์ฉ์๋ก๋ถํฐ ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ฌ ์ค์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ์๋ก๋ New Relic, Datadog, Sentry๊ฐ ์์ต๋๋ค.
- ํฉ์ฑ ๋ชจ๋ํฐ๋ง ๋๊ตฌ: ํฉ์ฑ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ ์ฌ์ฉ์ ์ํธ์์ฉ์ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์ค์ ์ฌ์ฉ์์๊ฒ ์ํฅ์ ๋ฏธ์น๊ธฐ ์ ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ์๋ณํฉ๋๋ค.
๊ฒฐ๋ก
Performance Observer API๋ ๊ณ ์ฑ๋ฅ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ์ง์งํ ๋ชจ๋ ์น ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค. ์ฑ๋ฅ ์งํ์ ๋ํ ์ค์๊ฐ ์ก์ธ์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ API๋ฅผ ํตํด ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ฌ์ ์ ์๋ณ ๋ฐ ํด๊ฒฐํ๊ณ , ์ต์์ ์ฑ๋ฅ์ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ํํ๊ณ ๋งค๋ ฅ์ ์ธ ๊ฒฝํ์ ํ ์ ์๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค. Performance Observer API๋ฅผ ๋ค๋ฅธ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๋๊ตฌ ๋ฐ ๊ธฐ์ ๊ณผ ๊ฒฐํฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ๋ํ ์ ์ฒด์ ์ธ ์๊ฐ์ ์ป๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ์ง์์ ์ผ๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
์์ ๋๊ฐ๊ณ ๋๊ธ ์ต๊ณ ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋ง, ๋ถ์ ๋ฐ ์ต์ ํํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค. Performance Observer API๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ ์ดํ๊ณ ์ค๋๋ ๋์งํธ ์ธ๊ณ์ ๊ณ์ ์ฆ๊ฐํ๋ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋๋ก ๋ณด์ฅํ๋ ํ์ ์ค์ด์ค๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋๋ Performance Observer API๋ฅผ ์ดํดํ๊ณ ํ์ฉํ๊ธฐ ์ํ ๊ฒฌ๊ณ ํ ๊ธฐ๋ฐ์ ์ ๊ณตํ์ต๋๋ค. ์ด์ ์ง์์ ์ค์ฒ์ ์ฎ๊ธฐ๊ณ ์ด ๊ฐ๋ ฅํ ๋๊ตฌ์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ ๋์ ๋๋ค!