SSR (Server-Side Rendering)
๋ช ์ฌ ยท ์น ๊ฐ๋ฐ
๊ฐ ์ฌ์ฉ์ ์์ฒญ๋ง๋ค ์๋ฒ์์ ์น ํ์ด์ง์ HTML์ ๋์ ์ผ๋ก ์์ฑํ ํ ๋ธ๋ผ์ฐ์ ๋ก ์ ์กํ๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ๊ธฐ์ โ ์์ ํ ์ฝํ ์ธ ๋ฅผ ๋ณด์ฅํ๋ฉฐ ๊ฒ์ ์์ง์ด ์ฆ์ ์ฝ์ ์ ์์ต๋๋ค.
๋ค์ดํฐ๋ธ SEO์ ์ฅ์ ๊ณผ React์ ์ธํฐ๋ํฐ๋นํฐ๋ฅผ ๊ฒฐํฉํ๊ธฐ ์ํด Next.js์ ๊ฐ์ ํ๋ ํ๋ ์์ํฌ๊ฐ ์ฑํํ ๋ ๋๋ง ์ํคํ ์ฒ โ ์๋ฒ๊ฐ ํ์ด์ง๋ฅผ ์ฌ์ ์์ฑํ ํ ํ์ด๋๋ ์ด์ ์ ํตํด ํด๋ผ์ด์ธํธ JavaScript๊ฐ ์ธ์ํฉ๋๋ค.
ํ์ ๊ฐ๋ฅํ HTML์ ๋ฐ๋ก ์ ๋ฌํ์ฌ ์ฒด๊ฐ Time to First Byte(TTFB)๋ฅผ ์ค์ด๋ ์น ์ฑ๋ฅ ์ ๋ต์ผ๋ก, ํด๋ผ์ด์ธํธ์์๋ง ๋ ๋๋ง๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํ์ ์ธ ํฐ ํ๋ฉด์ ์ ๊ฑฐํฉ๋๋ค.
Server-Side Rendering(SSR)์ ์๋ฒ๊ฐ ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ด๊ธฐ ์ ์ ํ์ด์ง์ ์์ ํ HTML์ ์์ฑํ๋ ์น ๊ฐ๋ฐ ๊ธฐ์ ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด JavaScript๋ฅผ ์คํํด์ผ ํ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ๋ฌ๋ฆฌ, SSR์ ์ฆ์ ๋ณด์ด๊ณ ์ธ๋ฑ์ฑ ๊ฐ๋ฅํ ์ฝํ ์ธ ๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ต์ ์ ์์ฐ ๊ฒ์ ์์์ ๋น ๋ฅธ ์ด๊ธฐ ํ์ ์๊ฐ์ด ํ์ํ ํ๋ก์ ํธ์ ์ ํฌ ์์ด์ ์๊ฐ ์ ํธํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
SSR(Server-Side Rendering)์ ์ ์๋ ์น ์๋ฒ๊ฐ ์์ ๋ ๊ฐ HTTP ์์ฒญ์ ๋ํด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์คํํ์ฌ ์์ ํ HTML์ ์์ฐํ๋ ํ๋ก์ธ์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ํ๋ฆฌ๋ ๋๋ง๋ HTML ํ์ด์ง๋ ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก๋์ด ๋์ฉ๋ JavaScript ํ์ผ์ ๋ค์ด๋ก๋์ ์คํ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ฆ์ ํ์ํ ์ ์์ต๋๋ค. SSR์ ์ ํฌ ์์ด์ ์๊ฐ Google์์ ์๋ฒฝํ๊ฒ ๊ฒ์๋๋ ๊ณ ์ฑ๋ฅ ์ฌ์ดํธ๋ฅผ ์ค๊ณํ๊ธฐ ์ํด ๋ง์คํฐํ๋ Next.js์ ๊ฐ์ ํ๋ ์์ํฌ์ ๊ธฐ๋ณธ ์ถ์ ๋๋ค.
์์ฐ ๊ฒ์ ์์(SEO), ์ด๊ธฐ ํ์ ์๋ ๋๋ ์ธ๋ฑ์ฑ ๋ก๋ด์ ๋ํ ์ฝํ ์ธ ์ ๊ทผ์ฑ์ด ์ฐ์ ์ฌํญ์ด๋ผ๋ฉด Server-Side Rendering์ ์ฌ์ฉํด์ผ ํฉ๋๋ค. SSR์ ํนํ ๊ธฐ์ ์ฌ์ดํธ, ๋ธ๋ก๊ทธ, ์ด์ปค๋จธ์ค ์ฌ์ดํธ ๋ฐ ๊ณต๊ฐ ์ฝํ ์ธ ๊ฐ Google์์ ํจ์จ์ ์ผ๋ก ์ธ๋ฑ์ฑ๋์ด์ผ ํ๋ ๋ชจ๋ ํ๋ซํผ์ ์ ํฉํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ์ ๊ธฐ์ ๊ฐ์์ฑ์ด ์ ๋ต์ ์ฑ์ฅ ์๋จ์ธ ํ๋ก์ ํธ์ Next.js๋ฅผ ํตํ SSR์ ์ฒด๊ณ์ ์ผ๋ก ๊ถ์ฅํฉ๋๋ค.
React์์์ Server-Side Rendering์ Node.js ์๋ฒ์์ React ์ปดํฌ๋ํธ๋ฅผ ์คํํ์ฌ ๋ธ๋ผ์ฐ์ ๋ก ์ ์ก๋๋ ์ ์ HTML์ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด HTML์ ์ฆ์ ํ์ํ ๋ค์, ํ์ด๋๋ ์ด์ ์ด๋ผ๋ ํ๋ก์ธ์ค๋ฅผ ํตํด React๊ฐ ํด๋ผ์ด์ธํธ ์ธก์์ ์ ์ด๋ฅผ ์ด์ด๋ฐ์ ํ์ด์ง๋ฅผ ์ธํฐ๋ํฐ๋ธํ๊ฒ ๋ง๋ญ๋๋ค. Next.js๋ ์ด ๋ฉ์ปค๋์ฆ์ ์์ ํ ์๋ํํ์ฌ ์ ํฌ ์์ด์ ์๊ฐ SPA์ ํ๋ถํจ๊ณผ ์ ํต์ ์ธ ์ฌ์ดํธ์ SEO ์ฑ๋ฅ์ ๊ฒฐํฉํ๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ ์ ์๊ฒ ํฉ๋๋ค.
React๋ renderToString ๋ฐ renderToPipeableStream๊ณผ ๊ฐ์ ๋ค์ดํฐ๋ธ API๋ฅผ ํตํด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ด ๊ฐ๋ฅํ์ง๋ง, ํ๋ก๋์ ์์ ์ด ํ๋ก์ธ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด Next.js์ ๊ฐ์ ํ๋ ์์ํฌ๊ฐ ํ์ํฉ๋๋ค. Next.js ์์ด React๋ก SSR์ ๊ตฌ์ฑํ๋ ค๋ฉด Node.js ์๋ฒ, ๋ฒ๋ค๋ฌ ๋ฐ ๋ผ์ฐํ ์์คํ ์ ํฌํจํ๋ ๋ณต์กํ ์ธํ๋ผ๊ฐ ํ์ํฉ๋๋ค. ์ ํฌ ์์ด์ ์๊ฐ Next.js๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๊ฐ ๋ฐ๋ก ์ด๊ฒ์ ๋๋ค: React์ ์๋ฒ ๋ ๋๋ง์ ํดํค, ์์ ์ ์ด๊ณ ์ต์ ํ๋ ๊ธฐ๋ฅ์ผ๋ก ๋ณํํฉ๋๋ค.
React๋ ๋ณธ๋ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง(CSR) ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค โ ๋ธ๋ผ์ฐ์ ๊ฐ JavaScript๋ฅผ ๋ค์ด๋ก๋ํ์ฌ DOM์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ๊ทธ๋ฌ๋ Next.js ๋๋ถ์ React๋ ํ์ด๋ธ๋ฆฌ๋๊ฐ ๋์ด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)๊ณผ ์ ์ ์์ฑ(SSG)๋ ์ง์ํฉ๋๋ค. ์ ํฌ ์์ด์ ์๋ ์ด ์ ์ฐ์ฑ์ ํ์ฉํ์ฌ ํ์ด์ง๋ณ๋ก ์ต์ ์ ๋ ๋๋ง ์ ๋ต์ ์ ํํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ ์น์ ์์ ์ฑ๋ฅ๊ณผ ๊ฒ์ ์์๋ฅผ ๊ทน๋ํํฉ๋๋ค.
React ์ํ๊ณ์์ SSR์ Next.js์ ๊ฐ์ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ React ์ปดํฌ๋ํธ๋ฅผ ์๋ฒ์์ ํ๋ฆฌ๋ ๋๋งํ ํ ํด๋ผ์ด์ธํธ๋ก ์ ์กํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด ํ๋ก์ธ์ค๋ ๊ฒ์ ์์ง์ด ์ฆ์ ์ธ๋ฑ์ฑํ ์ ์๋ ์์ ํ HTML์ ์์ฑํ์ฌ ๋จ์ผ ํ์ด์ง React ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ์ฌ์ ์ธ SEO ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. Async Code์์๋ ํ์ด์ง๊ฐ ์ต์์ ์ฑ๋ฅ ๋ฐ ๊ฐ์์ฑ ์ ์๋ฅผ ์ป๋๋ก ๋ณด์ฅํ๊ธฐ ์ํ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก Next.js์ SSR์ ์ฌ์ฉํฉ๋๋ค.
React๋ ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๋ชจ๋ ์ง์ํฉ๋๋ค: CSR(Client-Side Rendering)์ ๋ชจ๋ ๋ ๋๋ง์ด ๋ธ๋ผ์ฐ์ ์์ ์ด๋ฃจ์ด์ง๋ ๊ธฐ๋ณธ ๋ชจ๋์ด๊ณ , SSR(Server-Side Rendering)์ Next.js์ ๊ฐ์ ํ๋ ์์ํฌ์ ์ํด ๊ฐ๋ฅํด์ง๋๋ค. SSR๊ณผ CSR ์ฌ์ด์ ์ ํ์ ํ๋ก์ ํธ์ ํ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค โ SEO์ ๊ณต๊ฐ ์ฝํ ์ธ ์๋ SSR, ์ธ์ฆ ๋ค์ ์ธํฐ๋ํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ธํฐํ์ด์ค์๋ CSR. ์ ํฌ ์์ด์ ์๋ ์ต์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ํด ๋ ์ ๋ต์ ์ง๋ฅ์ ์ผ๋ก ๊ฒฐํฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํฉ๋๋ค.