์ค๋ ์ฝ์ ๋งํฌ
์ ๋ชฉ์ ๋์๊ณ DRT ์๊ฐํ๋ ๊ธ์
DRT๋ผ ํจ์ ์๊ฐ์ ์ฐฐ๋์ ์ง๊ด๊ณผ ํต์ฐฐ์ ๋ฐํํ๋ ์ ๋ฌธ๊ฐ๋ค์ ์ง๊ด์ ์ญ์ผ๋ก ๋ถ์ํด ๋ง๋ ๋ฐฉ๋ฒ๋ก
์ ๋ฌธ๊ฐ๋ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ์ค์ํ ์ค๋ง๋ฆฌ๋ฅผ ํฌ์ฐฉํด ํน๋ณํ ์ ๋ต์ ํตํด ๋ฌธ์ ์ ์ ๊ทผํ๋ค
์ ๋ฌธ๊ฐ๋ ์ค๋ ๊ฒฝํ๊ณผ ์๋ จ์ผ๋ก ์ธํด, ์ด์ฌ์๋ ํฌ์ฐฉํ์ง ๋ชปํ๋ ์ค์ํ ๋จ์๋ ์ค๋ง๋ฆฌ๋ฅผ ํฌ์ฐฉํ ์ ์๋ ๋ฅ๋ ฅ์ด ์๊ณ , ์ด์ฌ์์๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ๋ฒ๊ณผ ์ ๋ต์ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ๋ฐํ์ก์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐฐ๊ฒฝ์๋, ์ด์ฌ์์ ๋ค๋ฅธ ์ฌ๊ณ ๋ฐฉ์(๋ฉํ ๋ชจ๋ธ)์ด ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๋ฌํ ์ ๋ต๊ณผ ์ ๊ทผ ๋ฐฉ์์ ์ด๋ฏธ ๊ทธ๋ค์๊ฒ๋ ์ผ์์ ์ธ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ์ค์ค๋ก๋ ์์์ฑ์ง ๋ชปํจ
์ ๋ฌธ๊ฐ๋ ์ด๋ฏธ ์์ ์ด ํ๋ ํจ๊ณผ์ ์ธ ํ๋์ด๋ ๋ฉํ ๋ชจ๋ธ๋ค์ด ๋ชธ๊ณผ ๋ง์์ ์ต์ด ์๊ธฐ ๋๋ฌธ์, ์ค์ค๋ก์ ํจ๊ณผ์ ์ธ ์ ๋ต์ ์์์ฑ์ง ๋ชปํ๊ณค ํฉ๋๋ค.
์ฌ์ฉ์ด๋ก ๊ณผ ์ ๋ด์ด๋ก ์ ์ฐจ์ด
Private Access Tokens: eliminating CAPTCHAs on iPhones and Macs with open standards Apple Cloudflare Privacy Pass CAPTCHA
Cloudflare๋ ๊ฝค ์์ ๋ถํฐ CAPTCHA๋ฅผ ์ ๊ฑฐํ๋ Privacy Pass ํ์ค์ ๋ฐ๊ณ ์์์
์๋๋ ๋ธ๋ผ์ฐ์ ํ์ฅ์ผ๋ก๋ง ์ธ ์ ์์๋๋ฐ ์ด๋ฒ์ Apple ์ iOS์ macOS์์ ๊ณต์ ์ง์์ ๋ฐํ
Cloudflare ๋ณดํธ๋ฅผ ์ฌ์ฉํ๋ ์น์ฌ์ดํธ๋ ๋ณ๋์ ์์ ์์ด๋ ํด๋น ๊ธฐ๊ธฐ ์ฌ์ฉ์๋ค์๊ฒ CAPTCHA ์์ด ์ฌ์ฉ์๋ฅผ ๊ฒ์ฆํ ์ ์๊ฒ ๋จ
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ผ๋ก ์น ์ฌ์ดํธ๋ฅผ ๋ง๋๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ๋ํด ๋ถ์
ํ์๋ ํ์กดํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ๋ก ์ ํฌ๊ฒ 3๊ฐ์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํจ
Where do you navigate?
When do you render?
How do you hydrate?
๊ฐ์ฅ ์ ํ์ ์ธ ํํ์ ์ฌ๋ฌ ์ ๋ช ์ฌ์ดํธ๋ฅผ ์์๋ก ์ ํจํ ์ ๋ต์ ์ ๋ฆฌ
๋ผ์ฐํ
์๋ฒ ๋ผ์ฐํ ์ ํตํ MPA์ธ์ง, ํด๋ผ์ด์ธํธ ๋ผ์ฐํ ์ ํตํ SPA์ธ์ง๊ฐ ๊ฐ์ฅ ์ฒซ๋ฒ์ฌ๋ก ๊ฐ๋ฅด๋ ๊ธฐ์ค
But the nuance is that all sites are first served from a server. A server rendered SPA becomes an MPA simply by removing the <script> tag.
์๋ก์ด ๊ธฐ์ (RSC, TurboLinks) ๋ฑ์ด ๋ฑ์ฅํ๋ฉด์๋ถํฐ ๊ตฌ๋ถ์ด ๋ค์ ๋ชจํธํด์ง๊ณ ์๋ ์ถ์ธ
Hybrid ๊ธฐ์ ์ ํน์ง์ ์๋ฒ ๊ธฐ๋ฐ ๋ผ์ฐํ ์ ์ค์ฌ์ผ๋ก ํ๋ฉด์๋ ํด๋ผ์ด์ธํธ ๊ธฐ์ ์ ํตํด ์ฌ์ดํธ ์ ์ฒด reload๋ฅผ ์ต์ํํ๊ณ ์ ํ๋ค๋ ๊ฒ
๋ ๋๋ง
๋ ๋๋ง์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ค์ง์ ์ผ๋ก ํ๋๋ฐ์ ์์ผ๋ฏ๋ก ์ค์ํ ๊ฒ์ ๋ ๋๋ง์ด ์ธ์ ์ผ์ด๋๋๊ฐ ๋ฐ์ ์์
Flutter Web ๊ฐ์ ์ฌ๋๋ ์๋ ๊ฑด ์๋๋ฐ ๊ตณ์ด ํํด ๊ฑธ์ง ์๊ธฐ๋ก...
TTFB๋ Async SSR์ ์ฑํํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๊ฑฐ์ ํญ์ ๋ฎ์ Web Vitals
SSR์ด๋ผ๊ณ ํด๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ฃผ์ฒด์ ๋ฐ๋ผ ํต๊ณ๊ฐ ํฌ๊ฒ ๋ฌ๋ผ์ง Web Vitals
๋ฐ์ดํฐ๋ฅผ ์๋ฒ์์ ๊ฐ์ ธ์ค๊ฒ ๋๋ฉด TTFB๋ ๋์์ง๋ LCP=FCP
ํด๋ผ์ด์ธํธ์์ ๊ฐ์ ธ์ค๊ฒ ๋๋ฉด TTFB๋ ๋ฎ์์ง๋ LCP>FCP
ํ์ด๋๋ ์ด์
์ ์๊ฐ ์ ์ผ ๊ธ์ ๋ง์ด ๋จ๊ธด ์ฃผ์ ์ด๊ธฐ๋ ํจ... ๋ณธ์ธ ์ JavaScript Frameworks' Greatest Challenge
ํจ๊ณผ์ ์ผ๋ก ํด๋ด๊ธฐ ๋งค์ฐ ์ด๋ ค์ด ๋ฌธ์ ์ ์ํจ https://dev.to/this-is-learning/why-efficient-hydration-in-javascript-frameworks-is-so-challenging-1ca3
Hydration์ ๋ฐฉ๋ฒ๋ก ์ ํฌ๊ฒ 3๊ฐ์ง ์ธก๋ฉด์์ ๋ณผ ์ ์์
When do you load?
What do you bundle/serialize?
What do execute on load?
๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ก๋ ํ ํ์ด๋๋ ์ด์ ๋ฐฉ์์ ๋์ TTI๊ฐ ๋จ์ ์ด๊ณ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ ์ฌ๋ฌ ๋ฐฉ๋ฒ๋ค์ด ์กด์ฌ
๋น ํ ํฌ์์ ํ๋ก์ ํธ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌ ๋ฐ ์ด์ํ๋๊ฐ

๋ฆด๋ฆฌ์ฆ ๋ ธํธ ์ค ์ ์ผ ํต์ฌ์ธ ๋ฏ
์ผ๋ถ ์ปค๋งจ๋๋ ์ฌ์ ํ ํ์
๊ฒ์ฌ๋ฅผ ์ํํ์ง๋ง run, eval, cache๊ฐ ๋ ์ด์ ํ์
์ฒดํน์ ํ์ง ์์
// Polyfill
function sleepSync(timeout) {
const sab = new SharedArrayBuffer(1024);
const int32 = new Int32Array(sab);
Atomics.wait(int32, 0, 0, timeout);
}
์น API๋ก๋ ๊ตฌํ์ ๋ฌธ์ ๊ฐ ์๊ณ ์ธ ๋ฐ๋ ์์ด ๋ณด์ฌ์ ์ง์ ๋ค ํจ...
๊ทธ ์ธ์๋ ์ด๊ฒ์ ๊ฒ ์๋๋ฐ ๋ ์ ๋ฆฌํ๋ ๊ฑฐ์ง ๋ฒ์ญํ๋ ๊ฑฐ ์๋๋๊น ๊ฐ์ ์ฝ์ด๋ณด๋ฉด ๋๊ฒ ๋ค
์๋ง๋ ์ธํฐํ์ด์ค๋ unaliasํ์ง ์๊ณ named type์ฒ๋ผ ์ทจ๊ธํด์ ๊ทธ๋ฐ ๋ฏ
Telescope ๊ณ ์ฅ๋์ ๊ณ ์ณ๋