React์ ์ ํ์ ํ์ด๋๋ ์ด์ ๊ณผ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ ํ์ฉํ์ฌ ๋ค์ํ ๊ธฐ๊ธฐ ๋ฐ ๋คํธ์ํฌ ํ๊ฒฝ์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. ์ค์ ์์ ์ ๊ธ๋ก๋ฒ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํด๋ด ๋๋ค.
React ์ ํ์ ํ์ด๋๋ ์ด์ : ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ผ๋ก ์น ์ฑ๋ฅ ์ต์ ํ
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ๋งค๋๋ฝ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ ์ ๋ ๋ณต์กํด์ง์ ๋ฐ๋ผ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ๊ณผ ์ ๋ฐ์ ์ธ ๋ฐ์์ฑ์ด ์ ํ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ํํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ค ํ๋๋ ํนํ React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ํ์ ํ์ด๋๋ ์ด์ (Selective Hydration)๊ณผ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ(Priority-Based Loading)์ ๊ฒฐํฉํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์๋ ์ด๋ฌํ ๊ฐ๋ ์ ๋ณต์ก์ฑ์ ๊น์ด ํ๊ณ ๋ค์ด React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต์ ํํ๋ ๋ฐ ๋์์ด ๋๋ ์ค์ฉ์ ์ธ ํต์ฐฐ๋ ฅ๊ณผ ๊ธ๋ก๋ฒ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ๊ณตํฉ๋๋ค.
React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ ๋ฌธ์ ์ดํดํ๊ธฐ
์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ์ ์ํ ์ธ๊ธฐ ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React๋ ์ข ์ข ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง(SSR) ๋๋ ํด๋ผ์ด์ธํธ์ฌ์ด๋ ๋ ๋๋ง(CSR)์ ์์กดํฉ๋๋ค. ๊ฐ ์ ๊ทผ ๋ฐฉ์์๋ ์ฅ์ ์ด ์์ง๋ง ๊ณ ์ ํ ์ฑ๋ฅ ๋ฌธ์ ๋ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ์ด๊ธฐ ๋์ฉ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค: React ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ณต์กํ ์ปดํฌ๋ํธ๋ฅผ ํตํฉํ ๋ ์๋นํ ํฌ๊ธฐ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ก ์ธํด ํนํ ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋๋ฆฌ๊ฑฐ๋ ๋ชจ๋ฐ์ผ ์ฅ์น๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์ ๋ค์ด๋ก๋ ์๊ฐ์ด ๊ธธ์ด์ง ์ ์์ต๋๋ค.
- ํ์ด๋๋ ์ด์ ์ง์ฐ: SSR ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์๋ฒ๊ฐ ์ด๊ธฐ HTML์ ์์ฑํ์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํธ์์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๋ ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ํด๋ผ์ด์ธํธ ์ธก์์ ๋ค์ด๋ก๋ํ๊ณ ์คํ(ํ์ด๋๋ ์ด์ )ํด์ผ ํฉ๋๋ค. ์ด ํ์ด๋๋ ์ด์ ํ๋ก์ธ์ค๋ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ด ์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ํธ์์ฉํ๊ธฐ ์ ์ ์ง์ฐ์ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ๋ ๋๋ง ์ฐจ๋จ: ์๋ฐ์คํฌ๋ฆฝํธ ์คํ์ ์ข ์ข ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฝํ ์ธ ๋ฅผ ๋ ๋๋งํ๊ณ ์ฌ์ฉ์ ์ ๋ ฅ์ ์๋ตํ๋ ๊ฒ์ ๋ฐฉํดํ์ฌ ๋ฐ์์ฑ์ด ๋ถ์กฑํ๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค.
- ๋นํจ์จ์ ์ธ ๋ฆฌ์์ค ๋ก๋ฉ: ์ ์คํ ์ต์ ํ ์์ด๋ ์ผ๋ถ ๋ฆฌ์์ค๊ฐ ์ฆ์ ํ์ํ์ง ์๋๋ผ๋ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ, CSS ๋ฐ ์ด๋ฏธ์ง ๋ฆฌ์์ค๊ฐ ๋ฏธ๋ฆฌ ๋ก๋๋ ์ ์์ต๋๋ค. ์ด๋ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ณ FCP(First Contentful Paint), LCP(Largest Contentful Paint), TTI(Time to Interactive)์ ๊ฐ์ ์ฃผ์ ์ฑ๋ฅ ์งํ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
์ ํ์ ํ์ด๋๋ ์ด์ ์ด๋?
๋ถ๋ถ์ ํ์ด๋๋ ์ด์ ๋๋ ์ ์ง์ ํ์ด๋๋ ์ด์ ์ผ๋ก๋ ์๋ ค์ง ์ ํ์ ํ์ด๋๋ ์ด์ ์ ์ด๊ธฐ ๋ก๋ ์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์์ ์ธ ๋ถ๋ถ๋ง ํ์ด๋๋ ์ด์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ์ ์ ๋๋ค. ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ๋ฒ์ ํ์ด๋๋ ์ด์ ํ๋ ๋์ ์ฐ์ ์์์ ๊ฐ์์ฑ์ ๋ฐ๋ผ ์ปดํฌ๋ํธ๋ฅผ ํ์ด๋๋ ์ด์ ํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ๋ํญ ์ค์ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ๋ฐ์์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฐ์ ์์ ์ปดํฌ๋ํธ ์๋ณ: ์ด๊ธฐ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ฅ ์ค์ํ ์ปดํฌ๋ํธ(์: ํ์ด์ง ์๋จ ์ฝํ ์ธ , ์ฃผ์ ํ์ ์์, ์ค์ํ ์ํธ์์ฉ ์์)๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ์ค์ํ์ง ์์ ์ปดํฌ๋ํธ์ ์ง์ฐ ๋ก๋ฉ: ์ค์ํ์ง ์์ ์ปดํฌ๋ํธ์ ํ์ด๋๋ ์ด์ ์ ํ๋ฉด์ ํ์๋๊ฑฐ๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ํ์ ์ด๋ฃจ์ด์ง๋๋ก ์ง์ฐ์ํต๋๋ค.
- ํ์ด๋๋ ์ด์ ์ ๋ต ์ฌ์ฉ: React์ `Suspense` ๋ฐ `lazy` ๊ธฐ๋ฅ์ด๋ ์ ํ์ ํ์ด๋๋ ์ด์ ์ ์ํด ์ค๊ณ๋ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ํ์ด๋๋ ์ด์ ํ๋ ์ ๋ต์ ๊ตฌํํฉ๋๋ค.
์ ํ์ ํ์ด๋๋ ์ด์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ค์ํ ๋ถ๋ถ์ ํ์ด๋๋ ์ด์ ์ ํจ๊ณผ์ ์ผ๋ก ์ฐ๊ธฐํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ ๋๋ง์ ์ง์คํ๊ณ ์ค์ํ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋นจ๋ฆฌ ์ํธ์์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ ํนํ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ์ฅ์น์์ ๋ ๋น ๋ฅธ ์ฒด๊ฐ ์ฑ๋ฅ๊ณผ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค.
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ: ์ ํ์ ํ์ด๋๋ ์ด์ ์ ๋๋ฐ์
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ ์ ํ์ ํ์ด๋๋ ์ด์ ๊ณผ ๊ธด๋ฐํ๊ฒ ์๋ํ๋ ๋ณด์์ ์ธ ๊ธฐ์ ์ ๋๋ค. ์ฒด๊ฐ ๋ฐ ์ค์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ์์๋ก ๋ฆฌ์์ค(์๋ฐ์คํฌ๋ฆฝํธ, CSS, ์ด๋ฏธ์ง)๋ฅผ ๋ก๋ฉํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค. ํต์ฌ ์์ด๋์ด๋ ํ์ด์ง ์๋จ ์ฝํ ์ธ ๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ํ์ํ ์ฃผ์ CSS ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ด ์ด๊ธฐ ์ฌ์ฉ์ ๊ฒฝํ์ ํ์์ ์ธ ๋ฆฌ์์ค์ ๋ก๋ฉ์ ์ฐ์ ์ํ๋ ๊ฒ์ ๋๋ค. ๋ ์ค์ํ ๋ฆฌ์์ค๋ ๋ฎ์ ์ฐ์ ์์๋ก ๋ก๋๋๊ฑฐ๋ ๋์ค์ผ๋ก ์ฐ๊ธฐ๋ฉ๋๋ค.
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ ๋ช ๊ฐ์ง ์ฃผ์ ์ธก๋ฉด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฆฌ์์ค ์ฐ์ ์์ ์ง์ : ์ค์๋์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฆฌ์์ค์ ์ฐ์ ์์๋ฅผ ํ ๋นํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ด์ง ์๋จ ์ฝํ ์ธ ๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ํ์ํ CSS๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
- ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค์ ์ง์ฐ ๋ก๋ฉ: ์ง์ฐ ๋ก๋ฉ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง์ ๋น๋์ค๊ฐ ๋ทฐํฌํธ ๋ด์ ๋ค์ด์ฌ ๋๊น์ง ๋ก๋ฉ์ ์ฐ๊ธฐํฉ๋๋ค.
- ์ฝ๋ ์คํ๋ฆฌํ : ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ๋ ์์ ์ฒญํฌ๋ก ๋ถํ ํ๊ณ ๊ฐ ๋ผ์ฐํธ ๋๋ ์ปดํฌ๋ํธ์ ํ์ํ ์ฝ๋๋ง ๋ก๋ํฉ๋๋ค.
- ์ฃผ์ ๋ฆฌ์์ค ์ฌ์ ๋ก๋ฉ: ``๋ฅผ ์ฌ์ฉํ์ฌ ๋ ๋๋ง ํ๋ก์ธ์ค ์ด๊ธฐ์ ํ์ํ ๊ธ๊ผด ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๊ณผ ๊ฐ์ ์ฃผ์ ๋ฆฌ์์ค๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ต๋๋ค.
์ ํ์ ํ์ด๋๋ ์ด์ ๊ณผ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ ๊ฒฐํฉํ๋ฉด ๋๋ฆฐ ์ฅ์น์ ๋คํธ์ํฌ์์๋ ๋น ๋ฅด๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ธํฐ๋ท ์๋์ ์ฅ์น ๊ธฐ๋ฅ์ด ๋ค์ํ ์ง์ญ์์ ํนํ ์ค์ํฉ๋๋ค.
React์์ ์ ํ์ ํ์ด๋๋ ์ด์ ๋ฐ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ ๊ตฌํํ๊ธฐ
React ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ํ์ ํ์ด๋๋ ์ด์ ๊ณผ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ ๊ตฌํํ๋ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ์ฉํ ์ ์๋ ์ฃผ์ ๊ธฐ์ ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฃฐ ๊ฒ์ ๋๋ค.
1. React.lazy ๋ฐ Suspense
React์ ๋ด์ฅ `lazy` ๋ฐ `Suspense` ์ปดํฌ๋ํธ๋ ์ฝ๋ ์คํ๋ฆฌํ ๊ณผ ์ง์ฐ ๋ก๋ฉ์ ๊ตฌํํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๊ฒ์ ์ ํ์ ํ์ด๋๋ ์ด์ ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์์ ๋๋ค. `lazy` ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ ๋ก๋ํ ์ ์์ผ๋ฉฐ, `Suspense`๋ ์ปดํฌ๋ํธ๊ฐ ๋ก๋๋๋ ๋์ ๋์ฒด UI(์: ๋ก๋ฉ ์คํผ๋)๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์ ์์ ๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์:
import React, { Suspense, lazy } from 'react';
const MyLazyComponent = lazy(() => import('./MyLazyComponent'));
function App() {
return (
<div>
<!-- Critical content -->
<Suspense fallback={<div>Loading...</div>}>
<MyLazyComponent />
</Suspense>
</div>
);
}
์ด ์์ ์์ `MyLazyComponent`๋ ํ์ํ ๋๋ง ๋ก๋๋๋ฉฐ, ๊ฐ์ ธ์ค๋ ๋์ "Loading..." ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์ด๊ฒ์ ์ง์ฐ ๋ก๋๋๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ ํ์ ์ผ๋ก ํ์ด๋๋ ์ด์ ๋๋ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ์ข์ ์ถ๋ฐ์ ์ ๋๋ค. ์ด๋ ์ด๊ธฐ ๋ ๋๋ง ์ ์ฆ์ ๋ณด์ด์ง ์๋ ์ปดํฌ๋ํธ์ ํนํ ํจ๊ณผ์ ์ ๋๋ค.
2. ์ง์ฐ ํ์ด๋๋ ์ด์ ์ ์ํ Intersection Observer API
Intersection Observer API๋ ์์๊ฐ ๋ทฐํฌํธ์ ๋ค์ด์ค๋ ์์ ์ ๊ฐ์งํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด API๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๊ฐ ํ๋ฉด์ ๋ณด์ผ ๋ ํ์ด๋๋ ์ด์ ์ ํธ๋ฆฌ๊ฑฐํ ์ ์์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ๋ฅผ ํ์ํ ๋๋ง ํ์ด๋๋ ์ด์ ํจ์ผ๋ก์จ ์ ํ์ ํ์ด๋๋ ์ด์ ์ ๋์ฑ ๊ตฌ์ฒดํํฉ๋๋ค.
import React, { useState, useEffect } from 'react';
function HydratableComponent() {
const [isHydrated, setIsHydrated] = useState(false);
const [ref, setRef] = useState(null);
useEffect(() => {
const observer = new IntersectionObserver(
(entries) => {
entries.forEach((entry) => {
if (entry.isIntersecting) {
setIsHydrated(true);
observer.unobserve(entry.target);
}
});
},
{ threshold: 0 }
);
if (ref) {
observer.observe(ref);
}
return () => {
if (ref) {
observer.unobserve(ref);
}
};
}, [ref]);
if (!isHydrated) {
return <div ref={setRef}>Loading Hydratable Component...</div>;
}
return (
<div ref={setRef}>
<!-- Hydrated content -->
<p>This component is now hydrated!</p>
</div>
);
}
์ด ์์ ์์ `HydratableComponent`๋ Intersection Observer๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐํฌํธ์์ ๋ณด์ด๋ ์์ ์ ๊ฒฐ์ ํฉ๋๋ค. ์ปดํฌ๋ํธ๊ฐ ๋ทฐํฌํธ์ ๊ต์ฐจํ ๋๋ง `isHydrated` ์ํ๊ฐ `true`๋ก ์ค์ ๋์ด ํ์ด๋๋ ์ด์ ๋ ์ฝํ ์ธ ์ ๋ ๋๋ง์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ด๋ ํน์ ์ปดํฌ๋ํธ์ ๋ ๋๋ง์ ๊ฐ์์ฑ์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ๋ก ๋ง๋๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ฉฐ ์ฒด๊ฐ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ์๋นํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
3. ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ฌ๋ฌ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ ํ์ ํ์ด๋๋ ์ด์ ๋ฐ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ ๊ตฌํ์ ๋จ์ํํ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ธ๊ธฐ ์๋ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- react-lazy-hydration: ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ทฐํฌํธ ๊ฐ์์ฑ ๋๋ ์ฌ์ฉ์ ์ํธ์์ฉ๊ณผ ๊ฐ์ ๋ค์ํ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ ํ์ ์ผ๋ก ํ์ด๋๋ ์ด์ ํ๋ ์ ์ธ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- @loadable/component: ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ด๋๋ ์ด์ ์ ํน๋ณํ ์ด์ ์ ๋ง์ถ์ง๋ ์์์ง๋ง, ์ ํ์ ํ์ด๋๋ ์ด์ ์ ๊ธฐ๋ฐ์ ๊ตฌ์ถํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ ฅํ ์ฝ๋ ์คํ๋ฆฌํ ๋ฐ ์ง์ฐ ๋ก๋ฉ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ข ์ข ๊ตฌํ์ ๋จ์ํํ๊ณ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๋ ์ถ์ํ๋ฅผ ์ ๊ณตํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ฌํ ๊ธฐ์ ์ ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ์ ์ฉํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
4. ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ฆฌ์์ค ๋ก๋ฉ ์์
์ฐ์ ์์ ๊ธฐ๋ฐ ๋ฆฌ์์ค ๋ก๋ฉ์ ๊ตฌํํ๋ ๊ฒ์ ์ฃผ์ ์์์ ๋ก๋ฉ์ ์ต์ ํํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๋ช ๊ฐ์ง ๊ธฐ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- CSS ์ฐ์ ์์ ์ง์ : HTML ๋ฌธ์์ <head> ๋ด์ ์ฃผ์ CSS๋ฅผ ์ธ๋ผ์ธ์ผ๋ก ์ฝ์ ํ๊ฑฐ๋, ๋ฉ์ธ ์คํ์ผ์ํธ๋ฅผ ๋ก๋ํ๊ธฐ ์ ์ ํ์ CSS์ ๋ํด ``๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ์ฐ์ ์์ ์ง์ : <script> ํ๊ทธ์ `defer` ๋๋ `async` ์์ฑ์ ์ฌ์ฉํ์ฌ ์คํฌ๋ฆฝํธ๊ฐ ๋ก๋๋๊ณ ์คํ๋๋ ์์๋ฅผ ์ ์ดํฉ๋๋ค. `defer`๋ HTML์ด ํ์ฑ๋ ํ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋๋ก ๋ณด์ฅํ๊ณ , `async`๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋ํฉ๋๋ค. ์ข ์์ฑ์ ๋ฐ๋ผ ๊ฐ ์คํฌ๋ฆฝํธ์ ์ ์ ํ ์์ฑ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ์ญ์์ค.
- ์ด๋ฏธ์ง ์ง์ฐ ๋ก๋ฉ: <img> ํ๊ทธ์ `loading="lazy"` ์์ฑ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๊ฐ ๋ทฐํฌํธ ๊ทผ์ฒ์ ์ฌ ๋๊น์ง ์ด๋ฏธ์ง ๋ก๋ฉ์ ์ฐ๊ธฐํฉ๋๋ค. ๋๋ถ๋ถ์ ์ต์ ๋ธ๋ผ์ฐ์ ๋ ์ด๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํฉ๋๋ค.
- ๊ธ๊ผด ์ต์ ํ: ``์ผ๋ก ๊ธ๊ผด์ ๋ฏธ๋ฆฌ ๋ก๋ํ๊ณ , ์ด๊ธฐ ๋ ๋๋ง์ ํ์ํ ๋ฌธ์๋ง ํฌํจํ๋๋ก ๊ธ๊ผด์ ์๋ธ์ ํ ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
๋ฆฌ์์ค์ ๋ก๋ฉ ๋ฐ ์คํ ์์๋ฅผ ์ ์คํ๊ฒ ๊ด๋ฆฌํจ์ผ๋ก์จ ์ฃผ์ ์ปดํฌ๋ํธ๊ฐ ์ ์ํ๊ฒ ๋ ๋๋ง๋์ด ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ธฐ์ ์ ๊ธ๋ก๋ฒ ์ ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ ํ์ ํ์ด๋๋ ์ด์ ๊ณผ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๋ ค๋ฉด ์ ์คํ ๊ณํ๊ณผ ์คํ์ด ํ์ํฉ๋๋ค. ๋ ธ๋ ฅ์ ์๋ดํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฑ๋ฅ ๊ฐ์ฌ ๋ฐ ๋ชจ๋ํฐ๋ง: Google PageSpeed Insights, WebPageTest ๋๋ Lighthouse์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ ๊ธฐ์ ์ผ๋ก ๊ฐ์ฌํฉ๋๋ค. FCP, LCP, TTI์ ๊ฐ์ ์ฃผ์ ์ฑ๋ฅ ์งํ(KPI)๋ฅผ ๋ชจ๋ํฐ๋งํ์ฌ ์ต์ ํ์ ์ํฅ์ ์ถ์ ํฉ๋๋ค.
- ํ์ด์ง ์๋จ ์ฝํ ์ธ ์ฐ์ ์์ ์ง์ : ์ด๊ธฐ ์ฌ์ฉ์ ๊ฒฝํ์ ํ์์ ์ธ ์ปดํฌ๋ํธ๋ฅผ ์๋ณํ๊ณ ์ฐ์ ์์๋ฅผ ์ง์ ํฉ๋๋ค. ํ์ด์ง ์๋จ์ ์ฝํ ์ธ ๊ฐ ๊ฐ๋ฅํ ํ ๋นจ๋ฆฌ ๋ก๋๋๋๋ก ํฉ๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์์ ์ฃผ์๋ฅผ ๋๊ณ ๊ธ์ ์ ์ธ ์ฒซ์ธ์์ ๋ง๋๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ์ด๋ฏธ์ง ์ต์ ํ: ์ด๋ฏธ์ง๋ฅผ ์์ถํ๊ณ ์ ์ ํ ์ด๋ฏธ์ง ํ์(์: WebP)์ ์ฌ์ฉํ๋ฉฐ, ์ฆ์ ๋ณด์ด์ง ์๋ ์ด๋ฏธ์ง์ ๋ํด ์ง์ฐ ๋ก๋ฉ์ ๊ตฌํํฉ๋๋ค. ์ด๋ ์ ์ก๋๋ ๋ฐ์ดํฐ ์์ ์ค์ฌ ๋ก๋ฉ ์๊ฐ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ฝ๋ ์คํ๋ฆฌํ ๋ฐ ๋ฒ๋ค ํฌ๊ธฐ ์ถ์: ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค์ ๋ ์์ ์ฒญํฌ๋ก ๋ถํ ํ๊ณ ์ค์ํ์ง ์์ ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ ๋ก๋ํ์ฌ ์ด๊ธฐ ๋ค์ด๋ก๋ ํฌ๊ธฐ๋ฅผ ์ค์ ๋๋ค. ์ ๊ธฐ์ ์ผ๋ก ์ข ์์ฑ์ ๊ฒํ ํ๊ณ ์ต์ ํํ์ฌ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ต์ํํฉ๋๋ค.
- ๋คํธ์ํฌ ์กฐ๊ฑด ๊ณ ๋ ค: ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด(์: 3G, 4G, Wi-Fi)์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํ์ฌ ์ฌ๋ฌ ์ฅ์น์ ์ธํฐ๋ท ์ฐ๊ฒฐ ์ ๋ฐ์ ๊ฑธ์ณ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค. ๋ ๋น ๋ฅธ ์ด๊ธฐ ๋ก๋ฉ์ ์ํด ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ด๋ ์ ์ ์ฌ์ดํธ ์์ฑ๊ณผ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ค์ ์ฅ์น์์ ํ ์คํธ: ์๋ฎฌ๋ ์ดํฐ์ ์๋ฎฌ๋ ์ดํฐ๊ฐ ๋์์ด ๋ ์ ์์ง๋ง, ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ, ์ด์ ์ฒด์ ๋ฐ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ฐ์ง ์ค์ ์ฅ์น์์ ํ ์คํธํ๋ ๊ฒ์ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ด๋ ๋ค์ํ ํ๋์จ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ธ๋ก๋ฒ ๊ณ ๊ฐ์๊ฒ ํนํ ์ค์ํฉ๋๋ค.
- ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง(SSR) ๋ฐ ์ ์ ์ฌ์ดํธ ์์ฑ(SSG): ๊ฐ๋ฅํ๋ค๋ฉด SSR ๋๋ SSG๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ ์ธก์์ ์ด๊ธฐ HTML์ ๋ฏธ๋ฆฌ ๋ ๋๋งํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ ํนํ ์ฝํ ์ธ ๊ฐ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ ๊ธฐ์ ์ธ ์ ๋ฐ์ดํธ ๋ฐ ์ ์ง ๊ด๋ฆฌ: ์ข ์์ฑ์ ์ต์ ์ํ๋ก ์ ์งํ๊ณ ์ต์ ํ ์ ๋ต์ ์ ๊ธฐ์ ์ผ๋ก ๊ฒํ ํฉ๋๋ค. ์น ์ฑ๋ฅ์ ์ง์์ ์ธ ํ๋ก์ธ์ค์ด๋ฉฐ ์ง์์ ์ธ ๊ฐ์ ์ด ํ์์ ์ ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ชจ๋ฒ ์ฌ๋ก๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์งํํฉ๋๋ค.
- ๊ตญ์ ํ(i18n) ๊ณ ๋ ค ์ฌํญ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ๋ฌ ์ธ์ด๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ ํ์ด๋๋ ์ด์ ๋ฐ ๋ก๋ฉ ์ ๋ต์ด ํ์งํ๋ ์ฝํ ์ธ ์ ๋ฒ์ญ์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์๋์ง ํ์ธํฉ๋๋ค. ์ ์ ํ ๊ฒฝ์ฐ ์ธ์ด๋ณ ๋ฆฌ์์ค๋ฅผ ์ง์ฐ ๋ก๋ํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ ๋ฐ ์์
์ ํ์ ํ์ด๋๋ ์ด์ ๊ณผ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ ์ด์ ์ ํฅ์๋ ์ฑ๋ฅ ์งํ๋ฅผ ๋์ด์ญ๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ถ๋ถ์ ์๋นํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค:
- ์ฌ์ฉ์ ๊ฒฝํ: ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ๊ณผ ํฅ์๋ ๋ฐ์์ฑ์ ๋ ๋งค๋ ฅ์ ์ด๊ณ ๋ง์กฑ์ค๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค. ์ด๋ ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋๋ฆฐ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ํนํ ์ค์ํฉ๋๋ค.
- SEO: ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ์น์ฌ์ดํธ์ ๊ฒ์ ์์ง ์์๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค. ๊ฒ์ ์์ง์ ์ข์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ์น์ฌ์ดํธ๋ฅผ ์ฐ์ ์ํฉ๋๋ค.
- ์ ๊ทผ์ฑ: ์น์ฌ์ดํธ ์ฑ๋ฅ์ ์ต์ ํํ๋ฉด ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ฌ์ฉํ๋ ์ฌ์ฉ์์ ๊ฐ์ ์ฅ์ ๊ฐ ์๋ ์ฌ์ฉ์๊ฐ ๋ ์ฝ๊ฒ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ์ ํ์จ: ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ๊ณผ ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ํนํ ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ์ ๊ฒฝ์ฐ ๋ ๋์ ์ ํ์จ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ ์ฉ ์์:
- ์ ์์๊ฑฐ๋: ์๋ฅผ ๋ค์ด ์ธ๋์ ํ ์ ์์๊ฑฐ๋ ์ฌ์ดํธ๋ ์ ํ์ ํ์ด๋๋ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ ํ ์ด๋ฏธ์ง์ '์ฅ๋ฐ๊ตฌ๋์ ๋ด๊ธฐ' ๋ฒํผ ๋ก๋ฉ์ ์ฐ์ ์ํ๊ณ , ์ ํ ๋ฆฌ๋ทฐ์ ํ์ด๋๋ ์ด์ ์ ์ฐ๊ธฐํ ์ ์์ต๋๋ค.
- ๋ด์ค ์น์ฌ์ดํธ: ๋ธ๋ผ์ง์ ํ ๋ด์ค ์น์ฌ์ดํธ๋ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ ์ฌ์ฉํ์ฌ ๋์ญํญ์ด ์ ํ๋ ๋ชจ๋ฐ์ผ ์ฅ์น์์๋ ์ฃผ์ ๊ธฐ์ฌ์ ํค๋๋ผ์ธ์ด ์ ์ํ๊ฒ ๋ก๋๋๋๋ก ํ ์ ์์ต๋๋ค.
- ์ฌํ ์น์ฌ์ดํธ: ๊ธ๋ก๋ฒ ์ฌํ ์น์ฌ์ดํธ๋ ์ ํ์ ํ์ด๋๋ ์ด์ ์ ์ฌ์ฉํ์ฌ ์ด๊ธฐ ์ฝํ ์ธ ๊ฐ ํ์๋ ํ ๋ํํ ์ง๋์ ๊ฐ์ ํฌ์ด๋ฅผ ๋ก๋ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ธฐ์ ์ ์ ๋ต์ ์ผ๋ก ๊ตฌํํจ์ผ๋ก์จ ์ ์ธ๊ณ ๊ธฐ์ ๋ค์ ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ, ์ฆ๊ฐ๋ ์ฐธ์ฌ๋ ๋ฐ ๋ ๋์ ๋น์ฆ๋์ค ๊ฒฐ๊ณผ๋ฅผ ์ํด ์น์ฌ์ดํธ๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์ ํ์ ํ์ด๋๋ ์ด์ ๊ณผ ์ฐ์ ์์ ๊ธฐ๋ฐ ๋ก๋ฉ์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ์ต์ ํํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋๋ค. ์ปดํฌ๋ํธ๋ฅผ ์ง๋ฅ์ ์ผ๋ก ํ์ด๋๋ ์ด์ ํ๊ณ ๋ฆฌ์์ค ๋ก๋ฉ์ ์ฐ์ ์์๋ฅผ ์ง์ ํจ์ผ๋ก์จ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ, ์ ๋ฐ์ ์ธ ๋ฐ์์ฑ ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ทน์ ์ผ๋ก ํฅ์์ํฌ ์ ์์ต๋๋ค. ๋์ ๊ณ ๊ฐ์ ์๊ตฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์๊ตฌ ์ฌํญ์ ์ด์ ์ ๋ง์ถฐ ์ด๋ฌํ ๊ธฐ์ ์ ์ ๋ต์ ์ผ๋ก ๊ตฌํํ๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค.
์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ค๋ช ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ํํ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ ๋น ๋ฅด๊ณ , ๋ ๋งค๋ ฅ์ ์ด๋ฉฐ, ๋ ์ ๊ทผํ๊ธฐ ์ฌ์ด React ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์์ ๋๊ฐ๊ณ ์ต์์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฑ๋ฅ ์ต์ ํ ๋ ธ๋ ฅ์ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๊ฐ์ ํ์ญ์์ค.