2024-04-20.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 7์ฃผ์ฐจ-5
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week7-5_2024-04-20
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ---------- | --------------------------------------------------------------------------------------- | ----------- | | 7์ฃผ์ฐจ | 12์ฅ, 13์ฅ | ๋ชจ๋ ์น ๊ฐ๋ฐ์๊ฐ ๊ด์ฌ์ ๊ฐ์ ธ์ผ ํ ํต์ฌ ์น ์งํ, ์น ํ์ด์ง์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ๋ค์ํ ๋ฐฉ๋ฒ | 816~873p |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
์น ํ์ด์ง์ ์ฑ๋ฅ์ ์ธก์ ํ๋ ๋ค์ํ ๋ฐฉ๋ฒ
create-next-app
- NextWebVitalsMetric
| ์งํ | ๋ด์ฉ | ์๊ฐ | | ------------------------------ | ------------------------------------------------------------ | ------------------ | | Next.js-hydration | ์๋ฒ์ฌ์ด๋์์ ๋๋๋ง๋์ด ํ์ด๋๋ ์ด์ ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ | ํ์ด๋๋ ์ด์ | | Next.js-route-change-to-render | ํ์ด์ง๊ฐ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ ํ ํ์ด์ง๋ฅผ ๋๋๋งํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ | ํ์ด์ง ์ ํ | | Next.js-render | ๊ฒฝ๋ก ๋ณ๊ฒฝ์ด ์๋ฃ๋ ํ ํ์ด์ง๋ฅผ ๋๋๋งํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ | ์ ํ์ ๋ฐ๋ฅธ ๋๋๋ง |
Google Lighthouse
- ๊ตฌ๊ธ์์ ์ ๊ณตํ๋ ์น ์๋น์ค ์ธก์ ๋๊ตฌ, ์คํ ์์ค๋ก ์ด์ ์ค
- ํต์ฌ ์น ์งํ ๋ฟ๋ง ์๋๋ผ ์ ๊ทผ์ฑ, PWA, SEO ๋ฑ ์ธก์ ๋ฐ ์ ๊ฒ
- ๋ฐฉ๋ฒ
- ํฌ๋กฌ ์ต์คํ ์ : ํฌ๋กฌ, ํํญ
- ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ: ๋ด์ฅ
- CLI: lighthouse ํจํค์ง
Lighthouse - Navigation, ํ์๋ชจ๋
- ํ์ด์ง์ ์ ์ํ์ ๋๋ถํฐ ํ์ด์ง ๋ก๋ฉ์ด ์๋ฃ๋ ๋๊น์ง์ ์ฑ๋ฅ
| ๊ตฌ๋ถ | ํ๊ธ | ๋ด์ฉ | | ------------------- | ---------------- | ----------------------------------------------------------------------------- | | Performance | ์ฑ๋ฅ | ํต์ฌ ์น ์งํ: FCP, LCP, CLS ๊ทธ ์ธ: TTI, Speed Index, Total Blocking Time | | Accessibility | ์ ๊ทผ์ฑ | ๋์ฒด ๋ฌธ์, HTML + CSS ๋์ ์ฝ์ | | Best Practice | ๊ถ์ฅ์ฌํญ | ๋ณด์, ํ์ค ๋ชจ๋, ์ต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์์ค ๋งต | | SEO | ๊ฒ์ ์์ง ์ต์ ํ | ๋ฌธ์ ํฌ๋กค๋ง, robots.txt ์ ํจ, meta ๋ฐ์ดํฐ | | Progressive Web App | PWA | |
- TTI, Time to Interactive
- ํ์ด์ง์์ ์ฌ์ฉ์๊ฐ ์ํธ์์ฉํ ์ ์์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ ์ธก์ | TTI | ๊ธฐ์ค ๊ฒฐ๊ณผ | | ------- | --------- | | >3800ms | ์ข์ | | >7300ms | ๋ณดํต | | โค7300ms | ๋์จ |
- Speed Index
- ํ์ด์ง๊ฐ ๋ก๋๋๋ ๋์ ์ฝํ
์ธ ๊ฐ ์ผ๋ง๋ ๋นจ๋ฆฌ ์๊ฐ์ ์ผ๋ก ํ์๋๋์ง ๊ณ์ฐ
- ์ด๋ป๊ฒ? - ๋ธ๋ผ์ฐ์ ๊ฐ ๋ก๋๋๋ ํ์ด์ง ์ค์๊ฐ ์บก์ณ - Speedline ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ์บก์ณ๋ ์ด๋ฏธ์ง ๋ถ์ | Speed Index | ๊ธฐ์ค ๊ฒฐ๊ณผ | | ----------- | --------- | | >3400ms | ์ข์ | | >5800ms | ๋ณดํต | | โค5800ms | ๋์จ |
- ํ์ด์ง๊ฐ ๋ก๋๋๋ ๋์ ์ฝํ
์ธ ๊ฐ ์ผ๋ง๋ ๋นจ๋ฆฌ ์๊ฐ์ ์ผ๋ก ํ์๋๋์ง ๊ณ์ฐ
- Total Blocking Time
- ๊ธด ์์ โ ๋ฉ์ธ ์ค๋ ๋์์ ํน์ ์๊ฐ(50ms) ์ด์ ์คํ๋๋ ์์ โ ๋ฉ์ธ ์ค๋ ๋๊ฐ ์ฐจ๋จ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ
- ์ด ์ฐจ๋จ ์๊ฐ์?
- ๊ธด ์์ ์ ์ ๋ถ ๋ชจ์์ ๊ฐ๊ฐ์ ์์ ์์ 50ms๋ฅผ ๋บ ํ ํฉํจ
- ๋์์?
- FCP๋ถํฐ TTI ์ฌ์ด์ ์์
- ์ฆ, ์ต์ด ์ฌ์ฉ์์๊ฒ ์ฝํ
์ธ ๋ฅผ ๋ณด์ฌ์คฌ์ ๋๋ถํฐ, ์ํธ ์์ฉ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ ์ฌ์ด์ ์์
- ์ฌ์ฉ์ ์ ์ฅ โ ํ๋ฉด์ ๋ญ๊ฐ ์๋๋ฐ? ํ์ด์ง๊ฐ ์ ์์ง์ธ๋ค (์ฌ์ฉ์๊ฐ ๋ฌด์ธ๊ฐ ์์ ์ด ์งํ๋๊ณ ์์ง ์๋ค๋ ๊ฒ์ ๋์น์ฑ ์ ์๋ ์๊ฐ)
์ ๊ทผ์ฑ
- ์น ์ ๊ทผ์ฑ์, ์ ์ฒด์ ์ผ๋ก ๋ถํธํ ์ฌ๋๋ค์ด ์ผ๋ฐ์ ์ธ ์ฌ์ฉ์์ ๋๋ฑํ๊ฒ ์นํ์ด์ง๋ฅผ ์ด์ฉํ ์ ์๋๋ก ๋ณด์ฅํ๋ ๊ฒ
- ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ง์
- ๋์ฒด ๋ฌธ์, HTML + CSS ๋์ ์ฝ์
- ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ง์
๊ถ์ฅ์ฌํญ
- CSP, Content Security Policy๊ฐ XSS, Cross-Site Scripting์ ํจ๊ณผ์ ์ธ๊ฐ
- ์ 3์ ์ฝ์
์คํฌ๋ฆฝํธ ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์์ ex) eval, dangerouslySetInnerHTML ๋ฑ
- unsafe-inline, unsafe-eval
- CSP๊ฐ ์๊ฒฉํ์ง ์์ผ๋ฉด ๋น์ทํ ๋๋ฉ์ธ์ผ๋ก ๊ณต๊ฒฉํ ์ ์๋ค
- ์ 3์ ์ฝ์
์คํฌ๋ฆฝํธ ๊ณต๊ฒฉ์ ์ทจ์ฝํ ์์ ex) eval, dangerouslySetInnerHTML ๋ฑ
- ํ์ด์ง์์ ๊ฐ์ง๋๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์๋ ค์ง ๋ณด์ ์ทจ์ฝ์ ์ด ์๋ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ธ
- HTTPS ํ์ธ
- ํ์ด์ง ๋ก๋ ์, ๊ถํ ์์ฒญ ๋ฐฉ์ง โ ๋ค์ง๊ณ ์ง x, ์ฌ์ฉ์ ์ก์
์์ ๊ถํ์์ฒญ&์คํ
- ์์น์ ๋ณด: window.navigator.geolocation.getCurrentPosition(), watchPosition()
- ์๋ฆผ: Notification.requestPermission()
- ๋น๋ฐ๋ฒํธ input ๋ณต๋ถ ํ์ฉ
- ์ด๋ฏธ์ง
- ๊ฐ๋ก์ธ๋ก๋น์จ ์ผ์น ํ์ธ
- ์ด๋ฏธ์ง ํด์๋
- ํ์ด์ง HTML Doctype
๊ณผ๊ฑฐ์๋ ์น ํ์ค์ด ์์ง ์์ ํ ์ ์ฐฉ๋์ง ์์๊ณ , ๋ค์ํ ์น ๋ธ๋ผ์ฐ์ ๋ค์ด ๋ ์์ ์ผ๋ก ๋ ๋๋ง ์์ง์ ๊ฐ๋ฐํ์ฌ ํธํ์ฑ ๋ฌธ์ ๊ฐ ๋น๋ฒํ ๋ฐ์ํ์ต๋๋ค. ์ด๋ฌํ ์ํฉ์์๋ DOCTYPE ์ ์ธ์ด ๋งค์ฐ ์ค์ํ๋๋ฐ, ์ด์ ์ HTML ๋ฒ์ ๋ค๊ณผ ๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง์ ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ๋ํ๊ธฐ ์ํด DOCTYPE ์ ์ธ์ด ํ์ํ์ต๋๋ค. ex) ๋ท์ค์ผ์ดํ(Netscape)์ ์ต์คํ๋ก๋ฌ(Internet Explorer)๊ฐ ์ฃผ์ ์น ๋ธ๋ผ์ฐ์ ๋ก ์ฌ์ฉ๋์์ต๋๋ค. HTML5๊ฐ ๋ฑ์ฅํ๊ธฐ ์ ๊น์ง๋ ๋ค์ํ HTML ๋ฒ์ ๋ค์ด ์กด์ฌํ๊ณ , ๊ฐ๊ฐ์ DOCTYPE ์ ์ธ์ด ์ฌ์ฉ๋์์ต๋๋ค. ์๋ฅผ ๋ค์ด, HTML 4.01 Transitional, HTML 4.01 Strict, XHTML 1.0 Transitional, XHTML 1.0 Strict ๋ฑ์ด ์์์ต๋๋ค. ์ด๋ฌํ DOCTYPE ์ ์ธ๋ค์ ํด๋นํ๋ ๋ฒ์ ์ ๊ท๊ฒฉ์ ๋ฐ๋ผ ๋ฌธ์๊ฐ ์์ฑ๋์์์ ๋ธ๋ผ์ฐ์ ์๊ฒ ์๋ ค์ฃผ์์ต๋๋ค. ๊ทธ๋ฌ๋ HTML5์ ๋ฑ์ฅ์ผ๋ก DOCTYPE ์ ์ธ์ด ํจ์ฌ ๊ฐ์ํ๋์๊ณ , ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ๋จ์ํ **
<!DOCTYPE html>
**๋ง ์ฌ์ฉํ๋ฉด ๋๊ฒ ๋์์ต๋๋ค{/* HTML5 ์ด์ doctype ์์ */} <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> {/* HTML5 ์ดํ ๊ฐ์ํ */} **<!DOCTYPE html>**
- charset, ๋ฌธ์ ์งํฉ ์ ์
- ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฐ ๋ฐ์ดํธ๊ฐ ๋ํ๋ด๋ ๋ฌธ์๋ฅผ ์ ์ ์๊ฒ ํ๊ธฐ ์ํด ์ง์
<head> <meta charset="utf-8" /> {/* UTF-8๋ก ์ธ์ฝ๋ฉ */} </head>
- ์ง์ ์ค๋จ API๊ฐ ์๋
- ๋ธ๋ผ์ฐ์ ์ฝ์์ ์๋ฌ ๋ก๊ทธ๊ฐ ์ฐํ๋
- ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ์ Issue ์ฌํญ์ด ์๋
- ์ ํจํ ์์ค๋งต
- ์์ถ๋ ์์ค์ฝ๋๋ฅผ ์๋ณธ ์์ค์ฝ๋๋ก ๋ณํํ๊ธฐ ์ํด ์ฌ์ฉํ ํ์ผ
- font-display: optional ํฐํธ๊ฐ ๋ฏธ๋ฆฌ ๋ก๋๋จ(๊ฐ๋ฐ์๊ฐ ์ํ๋ ์์ ํฐํธ โ ๋ฒ๋ฒ ๊ฑฐ๋ฆผ ์๋ ๋๋๋ง)
๊ฒ์์์ง ์ต์ ํ
- ์นํ์ด์ง๊ฐ ๊ตฌ๊ธ๊ณผ ๊ฐ์ ๊ฒ์์์ง์ด ์นํ์ด์ง ์ ๋ณด๋ฅผ ๊ฐ์ ธ๊ฐ์ ๊ณต๊ฐํ ์ ์๋๋ก ์ต์ ํ
- ๋ฌธ์ ํฌ๋กค๋ง, robots.txt ์ ํจ, meta ๋ฐ์ดํฐ
Lighthouse - Timespan
- ์ค์ ์น ํ์ด์ง๋ฅผ ํ์ํ๋ ๋์์ ์งํ ์ธก์
| ๊ตฌ๋ถ | ํ๊ธ | ๋ด์ฉ | | -------------------------------------------- | -------- | --------------------------------------------------------------------------- | | Performance | ์ฑ๋ฅ | ํต์ฌ ์น ์งํ: FCP, LCP, CLS | | ๊ทธ ์ธ: TTI, Speed Index, Total Blocking Time | | Best Practice | ๊ถ์ฅ์ฌํญ | ๋ณด์, ํ์ค ๋ชจ๋, ์ต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์์ค ๋งต | | View Trace | ํ์ | ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ฅธ ์น ํ์ด์ง ๋ก๋ฉ ์์ธ | | Tree Map | ํธ๋ฆฌ๋งต | ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ฌ ๋ ๋ก๋ฉํ ๋ฆฌ์์ค๋ฅผ ๋ชจ์๋ณผ ์ ์์, ๋ฐ์ดํฐ ํฌ๊ธฐ, ๋ฆฌ์์ค ๋น์จ |
- Tree Map
- ๊ฐ ๋ฆฌ์์ค์ ํฌ๊ธฐ
- ๊ฐ ๋ฆฌ์์ค์์ ์ฌ์ฉํ์ง ์์ ๋ฐ์ดํธ ํฌ๊ธฐ
Lighthouse - Snapshot
- ํ์ฌ ํ์ด์ง ์ํ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ถ์
WebPageTest
- ์น์ฌ์ดํธ ์ฑ๋ฅ ๋ถ์ ๋๊ตฌ - ํ ์คํธํ๋ ์๋ฒ๊ฐ ๋จธ๋ฏ๋ก ์ฐธ๊ณ (๋ฏธ๊ตญ/์ธ๋/์บ๋๋ค/๋ ์ผ)
| ๋ถ์ ๋๊ตฌ | ๊ธฐ๋ฅ | | ----------------- | -------------------------------------------------------------- | | Site Performance | ์น ์ฌ์ดํธ ์ฑ๋ฅ ๋ถ์ | | Core Web Vitals | ์น ์ฌ์ดํธ ํต์ฌ ์น ์งํ ํ์ธ | | Lighthouse | ๊ตฌ๊ธ ๋ผ์ดํธํ์ฐ์ค | | Visual Comparison | 2๊ฐ ์ด์์ ์ฌ์ดํธ ๋์์ ์คํ, ์๊ฐ ํ๋ฆ์ ๋ฐ๋ฅธ ๋ก๋ฉ ๊ณผ์ ๋น๊ต | | Traceroute | ๋คํธ์ํฌ ๊ฒฝ๋ก ํ์ธ |
-
Performance Summary
- Opportunities & Experiments - Is It Quick: TTFB, ์ฝํ ์ธ ๋๋๋ง, LCP - Is It Usable - Is It Resilient
-
run 3 times: Individual Runs
-
๊ธฐ๋ฅ
- TTFB ์ ๊ฒ
- TBT, Total Blocking Time, ๋๋๋ง ๋ธ๋กํน ํ์ธ: CSS, ์๋ฐ์คํฌ๋ฆฝํธ
- FCP๊ฐ 2.5์ด ์ด๋ด์ธ์ง ํ์ธ
-
๊ฐ์ ๋ฐฉ์ ์ ๊ณต
- ์ฃผ์ ์์ญ ๊ธฐ์ค, lazy-loading ์ฌ๋ถ ํ์ธ
- ํฐํธ ๋ก๋ฉ์ผ๋ก ์ธํ ๋ฌธ์ ๋
ธ์ถ ์ง์ฐ ํ์ธ
- ํฐํธ ์บ์ฑ๊ณผ 3์ ํธ์คํธ / https://wicki.io/posts/2020-11-goodbye-google-fonts/
- CDN์ ์บ์๋์ด ์๋ ์ง ์ฌ๋ถ์ ๊ด๊ณ ์์ด, ๋ชจ๋ ์น ์ฌ์ดํธ์ ๋ํด ๋ค์ ๋ค์ด๋ก๋
- rel=preload, rel=preconnect๋ก ๋ฏธ๋ฆฌ ์ค๋ฆฌ์ง์ ์ฐ๊ฒฐ
- ํฐํธ ์บ์ฑ๊ณผ 3์ ํธ์คํธ / https://wicki.io/posts/2020-11-goodbye-google-fonts/
- ๋ฆฌ์์ค preload ํ์ธ
- HTTP ๋ฆฌ๋ค์ด๋ ํธ ๋ฆฌ์์ค ์ฌ๋ถ
- ์ถ๊ฐ์ ์ธ ๋คํธ์ํฌ ์์ฒญ์ ์ ๋ฐํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ข์ง ์์. โ ๊ฐ๋ฅํํ ๋ชจ๋ ๋ฆฌ์์ค๋ ๋ฆฌ๋ค์ด๋ ํธ ๋์ง ์๊ณ ๋ฐ๋ก ๋ฐํํด์ผํจ
- ์ต์ด ๋ค์ด๋ก๋ HTML์ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ HTML ์ฌ์ด์ ํฌ๊ธฐ ๋น๊ต
- Snyk ๊ฒ์ถ ๋ณด์ ์ํ ํ์ธ
-
Filmstrip
-
Optimizations
- Keep-Alive: ์๋ฒ์ ์ฐ๊ฒฐ ์ ์ง
- Gzip ๋ฆฌ์์ค ์์ถ
- ์ด๋ฏธ์ง ์์ถ
- Progressive JPEG ๋๋๋ง (๋ธ๋ฌ ๋๋๋ง)
- ๋ฆฌ์์ค ์บ์ ์ ์ฑ , CDN
ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ
- performance insights์ throttling ์ค์ ์์
- forced style recalculation: ๋ง์ ๋ฆฌ์์ค ์์, ์ต์ด ๋ก๋ฉ ์์ ์ผ์ด๋์ง ์๋ ๊ฒ์ด ์ข๋ค
์ ๋ฆฌ
- npm ๋ผ์ด๋ธ๋ฌ๋ฆฌ~ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ๊น์ง ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์ฑ๋ฅ์ ์ธก์ ํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
- ์ธก์ ๋๊ตฌ๋ ๋ฌ๋ผ๋, ์ด๋ค ์ ์ ๊ณ ์ณ์ผํ๋ ์ง ํ์ํ๋ ๋ชฉ์
- HTML, ์๋ฐ์คํฌ๋ฆฝํธ, CSS ๊ธฐ๋ณธ โ ์ฑ๋ฅ ๊ฐ์ ๊ณผ ๊ด๋ จํ์ฌ ์ง์ผ์ผ ํ ์ฒ ์น ์ค์
- ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ณ๋ชฉ ์ง์ ์ ์ฐพ๊ธฐ
- ์ธก์ ๋๊ตฌ๋ ๋ฌ๋ผ๋, ์ด๋ค ์ ์ ๊ณ ์ณ์ผํ๋ ์ง ํ์ํ๋ ๋ชฉ์
- ์ฐธ๊ณ ์๋ฃ
- https://blog.webpagetest.org/
- https://web.dev/
- https://developer.chrome.com/docs/devtools/overview?hl=ko
- https://developer.chrome.com/docs/lighthouse/overview?hl=ko