-
CSR vs SSR, Next.jsFrontend 2023. 6. 12. 01:42728x90
CSR(Client Side Rendering)
- ์ฌ์ฉ์๊ฐ ํ์ด์ง ์ ๊ทผ
- ์๋ฒ๊ฐ ์น์ด ํ์๋ก ํ๋ ์คํฌ๋ฆฝํธ์ ์คํ์ผ์ด ํฌํจ๋ ๊ธฐ๋ณธ html ๋งํฌ์ ๋ง ์ ์ก
- ํด๋ผ์ด์ธํธ๊ฐ html๊ณผ js ๋ค์ด ๋ฐ์
- ๋ค์ด ์๋ฃ๋ js๊ฐ ์คํ, ๋ฐ์ดํฐ๋ฅผ ์ํ api ํธ์ถ
- ์๋ฒ๊ฐ api๋ก๋ถํฐ์ ์์ฒญ์ ์๋ต
- api๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํ ํ์ด์ง ์ํธ์์ฉ ๊ฐ๋ฅ
์ฅ์
- ์ด๊ธฐ ๋ก๋ฉ ์ดํ์ ํ์ด์ง ์ผ๋ถ๋ฅผ ๋ณ๊ฒฝํ ๋๋ ๊ตฌ๋ ์๋๊ฐ ๋น ๋ฆ
- ์๋ฒ ๋ถํ ์ ์
๋จ์
- ์ด๊ธฐ ๋ก๋ฉ ์๋ ๋๋ฆผ
- SEO์ ๋ถ๋ฆฌ
SEO(๊ฒ์ ์์ง ์ต์ ํ)
๊ฒ์์์ง์ด ์น์ ํฌ๋กค๋งํ๋ฉด์ ํ์ด์ง์ ์ปจํ ์ธ ์์ธ์ ์์ฑํฉ๋๋ค. ์๋์ ๊ฐ์ด csr์์๋ ๋น html๋ง ์์ด, ๊ฒ์ ๋ด์ด ๋น ํ์ด์ง๋ก ์ฐฉ๊ฐํ๊ฒ ๋ฉ๋๋ค.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <link rel="icon" href="/favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="theme-color" content="#000000" /> <meta name="description" content="Web site created using create-react-app" /> <title>React App</title> <script type="module" crossorigin src="/assets/index-000087cd.js"></script> <link rel="stylesheet" href="/assets/index-9f116458.css"> </head> <body> <noscript>You need to enable JavaScript to run this app.</noscript> <div id="root"></div> </body> </html>
๊ตฌ๊ธ ๊ฒ์ ์์ง์ ๋ค๋ฅธ ๊ฒ์ ์์ง๊ณผ ๋ฌ๋ฆฌ ๊ฒ์์์ง์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ ๊ธฐ๋ฅ์ด ํ์ฌ๋์ด ์์ด์ ํ์ด์ง๋ฅผ ํฌ๋กค๋งํด ๊ฐ ๋๋ ์์ง๋ง ๋ชจ๋ ํ์ด์ง์ ๋ํด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด ์ฃผ์ง๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์น ์๋น์ค์ ๊ฒ์ ์์ง ์ต์ ํ๋ฅผ ์ํด์๋ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ๊ตฌํํด์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
SSR(Server Side Rendering)
- ์ฌ์ฉ์๊ฐ ํ์ด์ง ์ ๊ทผ
- ์๋ฒ๋ ํ์ด์ง๋ฅผ ๋ ๋๋ง ํด์ ๊ฒฐ๊ณผ๋ก ์์ฑํ html ํ์ด์ง๋ฅผ ํด๋ผ์ด์ธํธ๋ก ์ ์ก
- html์ ์ฆ์ ๋ ๋๋ง, ์ฌ์ดํธ ์์ฒด๋ ์กฐ์ ๋ถ๊ฐ๋ฅ
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ค์ด๋ฐ์
- ๋ค์ด ๋ฐ๋ ๋์ ์ฌ์ฉ์๊ฐ ์ปจํ ์ธ ๋ฅผ ๋ณผ ์๋ ์์ง๋ง ์กฐ์ ๋ถ๊ฐ๋ฅ, ์น์ ์ฌ์ฉ์ ์กฐ์์ ๊ธฐ์ตํจ
- ๋ธ๋ผ์ฐ์ ๊ฐ js ํ๋ ์์ํฌ ์คํ
- js๊น์ง ์ปดํ์ผ ๋๊ณ ๊ธฐ์ตํ๊ณ ์๋ ์ฌ์ฉ์ ์กฐ์์ด ์คํ๋๊ณ ์น ํ์ด์ง์ ์ฌ์ฉ์ ๊ฐ์ ์ํธ์์ฉ ๊ฐ๋ฅ
์ฅ์
- ์ด๊ธฐ ๊ตฌ๋ ์๋ ๋น ๋ฆ
- SEO์ ์ ๋ฆฌ
๋จ์
- ์ฌ์ฉ์ ๊ฒฝํ์ด ๋์จ
- ์๋ฒ ๋ถํ ์กด์ฌ
- ํ๋ฉด ๊น๋ฐ์ ์กด์ฌ
๋ ๋๋ง ๋ฐฉ์ ์ ํ ๊ธฐ์ค
SSR
- ์์ ๋ ธ์ถ์ด ํ์
- ๋๊ตฌ์๊ฒ๋ ๋์ผํ ๋ด์ฉ์ ๋ ธ์ถ
- ๋ฐ์ดํฐ๊ฐ ๋ฌ๋ผ์ ธ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ธฐ ์ด๋ ค์ด ํ์ด์ง
CSR
- ๊ฐ์ธ์ ๋ณด ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ตฌ์ฑ
- ๋ณด๋ค ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ๋ฅผ ์ํจ
- ์์๋ ธ์ถ๋ณด๋ค ๊ณ ๊ฐ์ ๋ฐ์ดํฐ ๋ณดํธ๊ฐ ์ค์
SSR์ ์ฝ๊ฒ ๊ตฌํํด์ฃผ๋ ํ๋ ์์ํฌ Next.js
Next.js๋ฅผ ์ฌ์ฉํ์ฌ ์ฒซํ์ด์ง๋ ๋ฐฑ์๋ ์๋ฒ์์ ๋ ๋๋งํ์ฌ ๋น html์ด ์๋ ๋ฐ์ดํฐ๊ฐ ์ฑ์์ง html์ ๋ฐ์ ๊ฒ์์ต์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ๊ทธ ๋ค์ ํ์ด์ง๋ถํฐ๋ CSR๋ฐฉ์์ ์ ์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ ๋ถ๋ถ๋ง ๊ฐฑ์ ํด ์๋ฒ์ ๋ถํ๋ฅผ ์ค์ด๋๋ก ํ ์ ์์ต๋๋ค.
๊ตฌํ
Next.js(version 12)์
getServerSideProps
์์ฝ ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.export async function getServerSideProps() { const userData = await ( await fetch(`http://example.com/api/user`) ).json(); return { props: { user: userData, }, }; } function IndexPage(props) { return <div>Welcome, {props.user.name}</div>; } export default IndexPage;
getServerSideProps
๋น๋๊ธฐ ํจ์๋ฅผ ์ต์คํฌํธgetServerSideProps
ํจ์๋props
๋ผ๋ ์์ฑ๊ฐ์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํIndexPage
ํจ์์์Props
๋ฅผ ์ธ์๋ก ๋ฐ์
next.js 13๋ฒ์ ๋ถํฐ๋
App router
๋ฅผ ์ด์ฉํ๋ฉฐgetServerSideProps
๋ฑ์ ๋ฐฉ์์ ์ ์ฉ๋์ง ์์ต๋๋ค.(https://nextjs.org/docs/app/building-your-application/data-fetching#old-methods).
REF
https://proglish.tistory.com/216
https://www.youtube.com/watch?v=YuqB8D6eCKE
728x90'Frontend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Vite๋ก ๋ฒ๋ค๋ฌ ๋ง์ด๊ทธ๋ ์ด์ ๋ฐ ์๋ฌ ํด๊ฒฐ (0) 2023.05.24 Recoil ์ ์ฉ๊ณผ ์๋ฌ ํด๊ฒฐ (0) 2023.05.14