๐ Next JS
๐ฟMPA(Multi Page Application)
SSR (server-side-rendering)์ ์ฌ์ค CSR(Client Side Rendering) ๋ณด๋ค ํจ์ฌ ์ค๋๋ ๋ ๋๋ง ๋ฐฉ์์ด๋ค.
MPA (Multi Page Application) ์์ ์๋ ์๋ฒ๋ก ์ฐ๋ฆฌ๊ฐ ์ํ๋ url์ ๋ณด๋ด๋ฉด ์๋ฒ๋ ํด๋น url์ ํด๋นํ๋ html์ ๋ณด๋ด์ฃผ๊ณ ๋ธ๋ผ์ฐ์ ๋ ๋ ๋๋ง ํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋์๋ค. Web์ ๋ฐ์ ๊ณผ Javascript์ ๋ฐ์ ์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํด ์ง๋ฉด์, ๊ธฐ์กด์ MPA์์ ๊ฐ์ง, ์ ๋ฐ์ดํธ ๋ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์๋ก์ด HTML ์ ์ฒด๋ฅผ ๋ฐ์ ์์ผ ํ๋ ๋ฌธ์ ์ ์ ํด๊ฒฐํ ์ ์์๋ค. ์ฌ๋ฌ ๊ฐ์ ํ์ด์ง๋ฅผ ๋ค ๋ฐ์์ค์ง ์๊ณ ๋ฐ์ ๋ Javascript๋ฅผ ์ด์ฉํด ๋จ ํ๋์ html๋ง ๋ฐ์ ์์, Javascript๋ก ๋์ ์ผ๋ก Dom ์์๋ค์ ๋ณํํ๋ SPA (Single Page Application)๋ฐฉ์์ด ์์๋์๋ค.
๐CSR๊ณผ SSR
SPA ์ ํฐ ํน์ง์ html์ ํ๋๋ง ๋ฐ์์ค๊ธฐ ๋๋ฌธ์, ์๋ก๊ณ ์นจ์ ํ์ง ์๊ณ ๋ ์๋กญ๊ฒ ๋ฐ์๋ ํ๋ฉด์ ๋ฐ์ ์ ์๋ค๋ ์ ์ผ๋ก, ์ฌ์ฉ์ ๊ฒฝํ์ด ํฅ์๋ ์ ์๊ณ , ์ ์ฒด๋ฅผ ๋ฐ์์ค๋ ๊ฒ ์๋๋ผ ๋ฐ๋ ๋ถ๋ถ๋ง ์์ ํ๋ ํจ์จ์ ์ธ ๋ ๋๋ง ๋ฐฉ์์ด๋ค. ์ด๋ ๊ฒ ์๋ฒ์ ๋ถ๋ฆฌ๋์ด ๋ธ๋ผ์ฐ์ ์์ javascript๋ฅผ ์ด์ฉํด ์ด๋ป๊ฒ ์นํ์ด์ง๋ฅผ ๋ ๋๋ง ํ ์ง ์ ํ๋ ๋ฐฉ์์ CSR (Client Side Rendering)์ด๋ผ๊ณ ํ๊ณ , SPA๋ฅผ ์ด์ฉํ CSR์ ๋ฐฉ๋ฒ์ผ๋ก React๊ฐ ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉ๋๊ณ ์๋ค.
CSR์ ์ด์ฉํ๊ฒ ๋๋ฉด ์๋ฒ๋ ํ๋์ html์ ์๋ต์ผ๋ก ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์๋ฒ ๋ถํ๊ฐ ์ ์ ์ฅ์ ๊ณผ javascript๋ฅผ ๋ค ๋ฐ์๋๊ธฐ ๋๋ฌธ์ ์ดํ ํ์ด์ง ๋ก๋ ์๊ฐ์ด ์งง์ ์ฅ์ ์ ๊ฐ์ง๋ค.
์ด๋ ๊ฒ ์ข์ ๋ณด์ด๋ CSR์ 2๊ฐ์ง ํฐ ๋จ์ ์ ๊ฐ์ง๋๋ฐ, ๋ฐ๋ก SEO (Search Engine Optimization)์ ์ฒซ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๊ธฐ ๊น์ง ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๋ ์ ์ด๋ค.
SEO
SEO๋ ๊ตฌ๊ธ์ด๋ ๋ค์ด๋ฒ์ ๊ฒ์์์ ๊ฒ์์ ํ์ ๋, ๋
ธ์ถ๋๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ฐ๋ฆฌ๋ googling์ด๋ ๋จ์ด๊ฐ ์๊ธธ ์ ๋๋ก ๋ง์ ์ ๋ณด๋ฅผ ๊ฒ์ ์ฌ์ดํธ๋ฅผ ํตํด์ ์ป๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋น์ค๋ฅผ ๊ฒ์์์ง์๊ฒ ์ ๋ณด์ฌ์ฃผ๊ณ ์ฌ์ฉ์์๊ฒ ์์ฃผ ๋ณด์ฌ ์ค ์ ์๋ ๊ฒ ์์ฒด๊ฐ ๋๋ฌด๋ ์ค์ํ๋ค. ๊ฒ์์์ง์ ๋ด์ด ์ฐ๋ฆฌ ์๋น์ค๋ฅผ ์ ํฌ๋กค๋งํ ์ ์๊ฒ ๋ง๋๋ ๊ณผ์ ์ SEO๋ผ๊ณ ํ๊ณ , ์ฌ๊ธฐ์ CSR์ด ํฐ ๋จ์ ์ ๊ฐ์ง๋ค.
์์ ๊ณผ์ ์์ CSR์์ react-helmet๊ณผ react-snap์ ์ด์ฉํด์ CSR์์ route์ ๋ง๋ html์ ๋ง๋ค์ด head๋ถ๋ถ์ ๋ฃ์ ๋ถ๋ถ๋ค์ ๋ฃ์ด์ฃผ์์ง๋ง ์ด๋ ๊ฒ ํด์ผ ํ๋ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ CSR์ด ํ๋ ค ํ๋ ํจ์จ์ ์ธ ์ ๋ต, ๋จ ํ๋์ HTML์ ์ด์ฉํด Javascript๋ก ๋์ ์ผ๋ก ํ์ด์ง๋ฅผ ๋ง๋ค๋ ค ํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋จ ํ๋์ HTML์ ๋น์ด์์ด ์ฐ๋ฆฌ๊ฐ ๋์ ์ผ๋ก Javascript๋ก DOM์์๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฒ์์์ง์ด ํฌ๋กค๋งํ ๋๋ ์๋ฌด๊ฒ๋ ๋ณผ ์ ์๋ ์ํ๊ฐ ๋๋ค. ์๋ฌด ์ ๋ณด๋ฅผ ์ฃผ์ง ์์ผ๋ฉด ๋น์ฐํ ๊ฒ์์์ง์ ์๋ฌด๊ฒ๋ ๊ฐ์ ธ๊ฐ์ง ๋ชปํ๋ค...
CSR์ ๋ ๋๋ง ๊ณผ์ ์ ๋จ์
CSR์ FCP (First Contentful Paint) ์ TTI (Time To Interactive) ์์์์ ํฐ ๋จ์ ์ ๊ฐ์ง๋ค. ์๋ํ๋ฉด ๋ฐ๋ณต์ ์ผ๋ก ์ธ๊ธํ ํ๋์ html์ Javascript๋ก ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ๋ง๋ค๊ธฐ ๋๋ฌธ์ด๋ค. server์ ๋จผ์ Html์ ์์ฒญ ํ ์ฒซ ๋ฒ์งธ contents๋ฅผ ๋ฐ์์ค๋ ์๊ฐ TTFB (Time To First Byte)๋ ๋น์ด์๋ HTML์ด๊ธฐ ๋๋ฌธ์ ๋น ๋ฅด์ง๋ง, ์ดํ Javascript๋ฅผ ๋ฐ์ ์ค๊ณ javascript๋ฅผ ์คํํ๊ณ , react๋ฅผ ์คํํด Rendering์ด ์์๋์ด ๋์ ์ผ๋ก DOM์ ๊ตฌ์ฑํ๋ค.
๊ทธ๋ก ์ธํด FCP, ์ค์ ํ๋ฉด์ ๋ณด์ฌ ์ฃผ๋ ๋ฐ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๊ณ , ๊ทธ๋ก ์ธํด TTI, user์ ์ด๋ฒคํธ์ ๋ฐ์ํ๊ธฐ๊น์ง ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ javascript ๋ฒ๋ค ํฌ๊ธฐ์ ๋ฐ๋ผ ์ฌ์ฉ์๊ฐ ๋น ํ๋ฉด์ ์ค๋ ์๊ฐ ๋ด์ผ ํ ์ ์๋ ํฐ ๋จ์ ์ ์ง๋๋ค.
CSR์ ๋จ์ ์ ํด๊ฒฐํด ์ค ์ ์๋ SSR?
์์ ์ธ๊ธํ ๋จ์ ๋ค SEO์ ๋๋ฆฐ FCP๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด SSR์ ์ฌ์ฉํ ์ ์๋ค. SSR์ SEO๋ฅผ ์ํด ๊ฐ๊ฐ route์ ํด๋นํ๋ html์ ๊ฐ์ง๊ณ ์์ด, ํด๋น html์ ์๋ฒ๊ฐ ์๋ตํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ฒ์์์ง์ด ํฌ๋กค๋งํ ์ ์๋ ์ฅ์ ์ ๊ฐ์ง๋ค. ์๋ฒ๊ฐ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋์ html์ ๋จผ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ ๋น ํ์ด์ง์์ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ ์๋๋ผ, ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด ์คํ ์ ๋จผ์ ๊ทธ๋ ค์ง ํ์ด์ง๋ฅผ ๋ณผ ์ ์์ด ๋น ๋ฅธ FCP๋ฅผ ๊ฐ์ง๋ ์ฅ์ ์ ๊ฐ์ง๋ฉฐ, ์๋ฒ์์ ํ์ด์ง ๋ก์ง๊ณผ ๋ ๋๋ง์ ์คํํด TTI๋ ๋น ๋ฅด๋ค.
ํ์ง๋ง ์ญ์ ๋ฌด์กฐ๊ฑด ์ข์ ์ ๋ง ๊ฐ์ง๋ ๊ฒ์ด ์๋๋ผ SSR๋ ๋จ์ ์ด ์กด์ฌํ๋ค. ๋ด์ฉ์ด ์ฐจ์๋ html ํ์ด์ง๋ฅผ ๋ณด๋ด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ CSR๊ณผ ๋ฌ๋ฆฌ TTFB๊ฐ ๋๋ฆฐ ๋จ์ ์ ๊ฐ์ง๋ฉฐ, ์๋ฒ์์ ์์ฒญ์ ๋ฐ๋ผ ์ฃผ์ด์ผ ํ๋ ๋ด์ฉ์ด ๋ง์์ ธ ๋ถํ๊ฐ ์ฌํด์ง๋ ๋จ์ ๋ ๊ฐ์ง๋ค. ์ด๊ธฐ html์ ๋ด์์ค์ผ ํ ์์ด ๋ง๋ค๋ฉด ์คํ๋ ค ํ์ด์ง ๋ก๋์ ๋จ์ ์ ๊ฐ์ง ์ ์๋ค.
์ญ์ ๋ฌด์กฐ๊ฑด ์ข์ ๊ฒ๊ณผ ๋ฌด์กฐ๊ฑด ์ ์ข์ ๊ฒ์ ์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ๋ ๊ฐ์ง ์ค "์ด๋ค ๊ฑธ ์ด์ฉํด์ผ ํ ๊น?" ๋ผ๋ ๊ณ ๋ฏผ์ด ๋ค ๋, ๊ฐ๊ฐ์ ์ฅ์ ์ ์ด์ฉํ์๋ ๋ฐฉ์์ธ universal Rendering์ด๋ผ๋ ๋ฐฉ์์ด ์๊ณ ์ด ๋ฐฉ๋ฒ์ด ๋ฐ๋ก NEXT js๊ฐ ์ง์ํ๋ ๋ฐฉ์์ด๋ผ๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
๐Universal Rendering
Universal Rendering์ Next JS๊ฐ ์ง์ํ๋ ๋ฐฉ์์ผ๋ก SSR์ ์ด์ฉํด ๋จผ์ ๊ฒฝ๋ก์ ๋ง๋ ํ์ด์ง๋ฅผ ๋ง๋ค์ด ์ ๋ฌํ ํ์ client์์ rehydration์ ํด ๋ค์ ๋ ๋๋งํ๋ CSR์ ๋ฐฉ์์ ์ด์ฉํ๋, SSR๊ณผ CSR์ ๋ชจ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. CSR์ ๋จ์ ์ธ ๋๋ฆฐ FCP๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ฅ์ ์ด ์๋ค.๊ทธ๋ผ ์ด๋ป๊ฒ ๋๊ฐ์ง ๋ฐฉ์์ ์ฌ์ฉํ๋ ๊ฑธ๊น?
๋จผ์ ์๋ฒ์์ ๋ ๋๋งํ ๋ด์ฉ์ ๋ง๋ ํ์ ํด๋น ํ์ด์ง๋ฅผ ๋ฌธ์์ด๋ก ํด๋ผ์ด์ธํธ์ ๋๊ฒจ์ค๋ค. (serialization) ํด๋ผ์ด์ธํธ๋ ๋๊ฒจ๋ฐ์ ํ์ด์ง์ ์๋ฐ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ ์์๋ฅผ ์ฐ๊ฒฐํ๋ ๊ณผ์ ์ ์งํํ๋ค. (hydration)
์ด๋ฌํ ๊ณผ์ ์ ์ฐ๋ฆฌ๊ฐ ์๋ฒ์ ํต์ ํ๋ ๊ณผ์ ๊ณผ ์ ์ฌํ๋ค. JSON์ ์ด์ฉํด ํต์ ํ ๋ JSON.stringfy๋ก ๋ ๋ด์ฉ์ ์ ๋ฌํ ํ์ ์ ๋ฌ ๋ฐ์์ client์์ ์ฌ์ฉํ ๋๋ JSON.parse๋ฅผ ์ด์ฉํด ํ์ฑํด์ค๋ค. ์ด๋ ํจ์๋ ์ ๋ฌํ ์ ์๋ ํน์ง์ ๊ฐ์ง๋ค,
universal rendering์์๋ ์ด์ ๋์ผํ๊ฒ ์๋ฒ์์๋ ํด๋น ํ์ด์ง ๋ด์ฉ์ html ํ์ด์ง๋ฅผ ๋ฌธ์์ด๋ก ์ ๋ฌํด์ฃผ๊ณ , client์์๋ ์ ๋ฌ๋ฐ์ html ๋ฌธ์์ด์ ์ด์ฉํด ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ , ์ ์ ํ ํจ์์ ์ด๋ฒคํธ๋ฅผ ๋ถ์ฌ์ค๋ค. ์ด๋ ๊ฒ ๋๊ฐ์ง ์ผ์ด ๋ถ๋ฆฌ๋์ด ์๊ธฐ ๋๋ฌธ์ javascript๋ฒ๋ค ํฌ๊ธฐ๊ฐ ํด ๊ฒฝ์ฐ์๋ ํ๋ฉด์ SSR์ฒ๋ผ ๋จผ์ ๋ณด์ด์ง๋ง TTI๋ ๋ฆ์ด์ง๋ ๋จ์ ์ ๊ฐ์ง ์ ์๋ค.
๋ง์น๋ฉฐ
์ญ์ ์๋ฒฝํ ๊ธฐ์ ์ ์๋ค. ํญ์ ์ํฉ์ ๋ง๋ ์๋ง์ ๊ธฐ์ ์ด ์กด์ฌํ ๋ฟ์ด๋ค๋ ๊ฑธ ๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์๋ ๊ทธ ์ํฉ์ ๋ง๋ ๊ธฐ์ ์ ์ฌ์ฉํ ์ค ์๋ ๊ฒ ์ค์ํ๋ค๊ณ ์๊ฐ๋๋ค. ์๋ฒ์ ํด๋ผ์ด์ธํธ๋ฅผ ์ด ๊ณผ์ ์ ์ดํดํ๋ ์ค์์ฑ์ ๋๋ฌด ๋๋ ์๊ฐ์ด์๋ค. ์ด์ ์ง์ ๊ณผ์ ์ NEXT js๋ฅผ ์จ๋ณด๋ ค ํ๋ค.