PRR (Partial / Progressive Rendering)
๋ช ์ฌ ยท ์น ์ฑ๋ฅ
ํ์ด์ง์ ํต์ฌ ์์๊ฐ ์ฐ์ ์ ์ผ๋ก ์ ์ก๋๊ณ ํ์๋๋ฉฐ, ๋ณด์กฐ ์ปดํฌ๋ํธ๊ฐ ์ ์ง์ ์ผ๋ก ๋ก๋๋๋ ์น ๋ ๋๋ง ๊ธฐ์ โ ์ฒด๊ฐ ๋ก๋ฉ ์๊ฐ์ ์ค์ด๊ณ Core Web Vitals๋ฅผ ๊ฐ์ ํฉ๋๋ค.
Next.js์ React์ ๊ฐ์ ํ๋ ํ๋ ์์ํฌ๊ฐ ์ฑํํ ์ฑ๋ฅ ์ํคํ ์ฒ๋ก, Suspense์ ์คํธ๋ฆฌ๋ฐ SSR๊ณผ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ ํตํด HTML์ ์กฐ๊ฐ ๋จ์๋ก ์คํธ๋ฆฌ๋ฐํ์ฌ ์์ ํ ํ์ด์ง์ ๋ชจ๋๋ฆฌ์ ๋๊ธฐ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
๋ฌด๊ฑฐ์ด ์ปดํฌ๋ํธ(๊ทธ๋ํฝ, ๋์ฉ๋ ๋ชฉ๋ก, ์๋ํํฐ ์์ ฏ)์ ๋ ๋๋ง์ ๋ฉ์ธ ์ฝํ ์ธ ๋ ๋๋ง๊ณผ ๋ถ๋ฆฌํ์ฌ ๋ชจ๋ ๊ธฐ๊ธฐ์์ ํต์ฌ ์ ๋ณด์ ์ฆ๊ฐ์ ํ์๋ฅผ ๋ณด์ฅํ๋ ์ต์ ํ ์ ๋ต์ ๋๋ค.
PRR(Partial / Progressive Rendering)์ ํ์ด์ง์ ํต์ฌ ์์๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ ์กํ๊ณ ํ์ํ ํ, ๋๋จธ์ง ์ฝํ ์ธ ๋ฅผ ์ ์ง์ ์ผ๋ก ๋ก๋ํ๋ ์น ๋ ๋๋ง ๊ธฐ์ ์ ๋๋ค. ํ์ด์ง ์ ์ฒด๊ฐ ์๋ฒ ์ธก์์ ์์ฑ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋์ , ๋ธ๋ผ์ฐ์ ๋ ์ฐ์์ ์ธ HTML ์คํธ๋ฆผ์ ๋ฐ์ ๊ฐ ์น์ ์ด ์ค๋น๋๋ ๋๋ก ํ์ํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ React Suspense์ Next.js์ ์คํธ๋ฆฌ๋ฐ SSR๊ณผ ํจ๊ป ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๊ฑฐ์ ์ฆ๊ฐ์ ์ธ ์ฒด๊ฐ ํ์ ์๊ฐ์ ์ ๊ณตํฉ๋๋ค.
Progressive Rendering์ ํฐ ํ๋ฉด ๋๊ธฐ๋ฅผ ์ ๊ฑฐํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํ๊ธฐ์ ์ผ๋ก ๊ฐ์ ํฉ๋๋ค: ์ฌ์ฉ์๋ ๋ณด์กฐ ์์๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ก๋๋๋ ๋์ ๋ฉ์ธ ์ฝํ ์ธ ๊ฐ ์ฆ์ ํ์๋๋ ๊ฒ์ ๋ด ๋๋ค. ์ด๋ฌํ ๋น ๋ฅธ ์ฒด๊ฐ์ ์ดํ๋ฅ ์ ์ค์ด๊ณ ์ฐธ์ฌ๋ฅผ ๋์ ๋๋ค. ์ ํฌ ์์ด์ ์๋ ๋ ๋๋ง ์ค์ธ ์์ญ์ ์ฐ์ํ ๋ก๋ฉ ์ธ๋์ผ์ดํฐ(์ค์ผ๋ ํค)๋ฅผ ๊ตฌํํ์ฌ ๋๊ธฐ๋ฅผ ์ ๋ขฐ๋ฅผ ์ฃผ๋ ์ ๋ คํ๊ณ ์ ๋ฌธ์ ์ธ ๊ฒฝํ์ผ๋ก ๋ณํํฉ๋๋ค.
PRR์ Core Web Vitals, ํนํ Largest Contentful Paint(LCP)์ First Input Delay(FID)์ ์ง์ ์ ์ด๊ณ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ํต์ฌ ์ฝํ ์ธ ๋ฅผ ๋จผ์ ๋ณด๋์ผ๋ก์จ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฌด๊ฑฐ์ด ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์์ LCP๊ฐ ํจ์ฌ ๋นจ๋ฆฌ ๋ฌ์ฑ๋ฉ๋๋ค. ๋ฉ์ธ ์ค๋ ๋๊ฐ ๋ ๋นจ๋ฆฌ ํด์ ๋์ด FID์ Interaction to Next Paint(INP)๊ฐ ๊ฐ์ ๋ฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ๋ชจ๋ ํ์ด์ง์์ Core Web Vitals ์ ์๋ฅผ ๋ น์์ผ๋ก ๋ฌ์ฑํ๊ธฐ ์ํ ์ฃผ์ ๊ธฐ์ ์๋จ์ผ๋ก PRR์ ์ฌ์ฉํฉ๋๋ค.
๊ธฐ์กด ํ์ด๋๋ ์ด์ ์ ๋ชจ๋ HTML์ด ์๋ฒ ์ธก์์ ๋ ๋๋ง๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ, ํด๋ผ์ด์ธํธ JavaScript๊ฐ ๋จ์ผ ์์ ์ผ๋ก ์ ์ฒด ํ์ด์ง์ ์ ์ด๋ฅผ ๊ฐ์ ธ๊ฐ๋๋ค. Partial Rendering์ ๋ฐ๋ฉด์ ์ปดํฌ๋ํธ๋ฅผ ์ ํ์ ์ด๊ณ ์ ์ง์ ์ผ๋ก ํ์ด๋๋ ์ด์ ํฉ๋๋ค: ๊ฐ ์น์ ์ JavaScript๊ฐ ๋ก๋๋๋ ์ฆ์ ๋ ๋ฆฝ์ ์ผ๋ก ์ธํฐ๋ํฐ๋ธํด์ง๋๋ค. ์ ํฌ ์์ด์ ์๋ ์ด ์ธ๋ฐํจ์ ํ์ฉํ์ฌ ํต์ฌ ์ธํฐ๋ํฐ๋ธ ์์(๋ด๋น๊ฒ์ด์ , CTA)๊ฐ ๋ ์ฐ์ ์์๊ฐ ๋์ ์น์ ์ ํ์ด๋๋ ์ด์ ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฆ์ ์๋ํ๋๋ก ํฉ๋๋ค.
๋์ญํญ์ด ์ ํ๋ ๋ชจ๋ฐ์ผ ์ฐ๊ฒฐ์์ Progressive Rendering์ ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์์ ํ ๋ค์ด๋ก๋๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฝํ ์ธ ๋ฅผ ์๋นํ๊ธฐ ์์ํ ์ ์์ผ๋ฏ๋ก ๋งค์ฐ ์ค์ํฉ๋๋ค. HTML ์คํธ๋ฆฌ๋ฐ์ ๋ฐ์ดํธ๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋ ๋๋ก ์ ์กํ๊ณ , ๋ธ๋ผ์ฐ์ ๋ ์์ ๋ ์ฝํ ์ธ ๋ฅผ ์ ์ง์ ์ผ๋ก ํ์ํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ํต์ฌ ํ ์คํธ ์ฝํ ์ธ ๋ฅผ ์ฐ์ ํ๊ณ ์ด๋ฏธ์ง์ ๋ฌด๊ฑฐ์ด ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ์์ผ ๋ณดํธ์ ์ ๊ทผ์ฑ์ ๋ณด์ฅํ๋ฉฐ ๋ชจ๋ฐ์ผ ์ค๋์ธ์ค๋ฅผ ์ํด ์ด ์ ๊ทผ ๋ฐฉ์์ ์ต์ ํํฉ๋๋ค.
PRR์ ๋ฌด๊ฑฐ์ด ์ปดํฌ๋ํธ(๋ณต์กํ ๊ทธ๋ํฝ, ์ด๋ฏธ์ง ์บ๋ฌ์ , ์๋ํํฐ ์์ ฏ)๋ฅผ ๋ฉ์ธ ์ฝํ ์ธ ๋ ๋๋ง์ ์ํฅ์ ์ฃผ์ง ์๋ Suspense ๊ฒฝ๊ณ ์์ ๊ฒฉ๋ฆฌํฉ๋๋ค. ์๋ฒ๋ ์ด๋ฌํ ์ปดํฌ๋ํธ์ ๋ํ ํ๋ ์ด์คํ๋๋ฅผ ๋ณด๋ด๊ณ ๋๋จธ์ง ํ์ด์ง๋ฅผ ๊ณ์ ์คํธ๋ฆฌ๋ฐํฉ๋๋ค. ๋ฌด๊ฑฐ์ด ์ปดํฌ๋ํธ๊ฐ ์ค๋น๋๋ฉด ์ธํฐํ์ด์ค๋ฅผ ์ฐจ๋จํ์ง ์๊ณ ๋์ ์ผ๋ก ์ฃผ์ ๋ฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ์ฌ์ฉ์๊ฐ ๋๋ผ๋ ๋น ๋ฅธ ์๋๋ฅผ ์ ๋ ํํํ์ง ์์ผ๋ฉด์ ํ๋ถํ ๊ธฐ๋ฅ์ ํตํฉํ๊ธฐ ์ํด ์ด ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
Progressive Rendering์ ๋ชจ๋ ํ๋ ๋ธ๋ผ์ฐ์ (Chrome, Firefox, Safari, Edge)์์ ๋ค์ดํฐ๋ธ๋ก ์ง์๋๋ HTTP ์คํธ๋ฆฌ๋ฐ์ ๊ธฐ๋ฐํฉ๋๋ค. HTML์ HTTP/1.1 ํ๋กํ ์ฝ์ ํ์ค ๊ธฐ๋ฅ์ธ Transfer-Encoding chunked๋ฅผ ํตํด ์กฐ๊ฐ ๋จ์๋ก ์ ์ก๋ฉ๋๋ค. ๋ ์ค๋๋ ๋ธ๋ผ์ฐ์ ์์๋ ๊ธฐ๋ฅ์ ์ ํ ์์ด ๊ธฐ์กด ๋ฐฉ์์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ์ด ์ต์ ํ ๊ธฐ์ ์ด ์ ์ง์ ์ผ๋ก ๊ตฌํ๋์ด ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์ต์์ ๊ฒฝํ์ ์ ๊ณตํ๋๋ก ํฉ๋๋ค.
Partial Rendering์ ํต์ฌ ์ฝํ ์ธ โ ์ ๋ชฉ, ๋จ๋ฝ, ๋ฉํ๋ฐ์ดํฐ โ ๊ฐ ์ธ๋ฑ์ฑ ๋ก๋ด์ด ์ํ๋ ๋๋ก HTML ์คํธ๋ฆผ์์ ๋จผ์ ์ ์ก๋๋ฏ๋ก ๊ธฐ์ ์ SEO์ ๊ธ์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. Googlebot์ ๋ณด์กฐ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฉ์ธ ์ฝํ ์ธ ๋ฅผ ์์ ํ์ฌ ์ธ๋ฑ์ฑ์ ๊ฐ์ํํ๊ณ ํ์ด์ง ํ์ง ์ธ์์ ๊ฐ์ ํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ SEO์ ์ค์ํ ์ ๋ณด๊ฐ ํญ์ ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก๋๋ ์ฒซ ๋ฒ์งธ ์ฒญํฌ์ ํฌํจ๋๋๋ก ์คํธ๋ฆฌ๋ฐ์ ๊ตฌ์กฐํํฉ๋๋ค.
PRR ๊ตฌํ์๋ React Suspense์ ํจ๊ป Next.js์ ๊ฐ์ ์คํธ๋ฆฌ๋ฐ SSR์ ์ง์ํ๋ ํ๋ ์์ํฌ, ์ฒญํฌ๋ ์๋ต์ ์ฒ๋ฆฌํ ์ ์๋ Node.js ์๋ฒ, ์คํธ๋ฆฌ๋ฐ๋ ์๋ต์ ๋ฒํผ๋งํ์ง ์๋๋ก ๊ตฌ์ฑ๋ CDN์ด ํ์ํฉ๋๋ค. ์ํคํ ์ฒ๋ ์ฐ์ ์ ์ผ๋ก ๋ ๋๋งํ ํต์ฌ ์ปดํฌ๋ํธ๋ฅผ ์๋ณํ๊ณ ๋ณด์กฐ ์น์ ์ Suspense ๊ฒฝ๊ณ๋ก ์บก์ํํด์ผ ํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ์๋ฒ ๊ตฌ์ฑ๋ถํฐ ์ปดํฌ๋ํธ ์ต์ ํ๊น์ง ์ด ์ธํ๋ผ๋ฅผ ํดํค๋ก ๋ฐฐํฌํ์ฌ ์ ์ง์ ๋ ๋๋ง์ ์ด์ ์ ๊ทน๋ํํฉ๋๋ค.