[NextJS] SSR ์ปดํฌ๋ํธ vs CSR ์ปดํฌ๋ํธ (Server Component์ Client Component), ํ์ด์ง ๋ก๋ฉ ์ฌ์ฉ์ ๊ฒฝํ ๋ฌธ์ ํด๊ฒฐ
Next.js - Server Component์ Client Component
Next.js 13๋ถํฐ app ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๋์
๋๋ฉด์, ์ปดํฌ๋ํธ๊ฐ ์๋ฒ(Server) ์ปดํฌ๋ํธ์ธ์ง, ํด๋ผ์ด์ธํธ(Client) ์ปดํฌ๋ํธ์ธ์ง ๊ตฌ๋ถํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํด์ก์ต๋๋ค.
์ด ๊ธ์์๋ Server Component์ Client Component๊ฐ ๋ฌด์์ธ์ง, ๊ฐ๊ฐ ์ด๋ค ํน์ง๊ณผ ์ฅ๋จ์ ์ ๊ฐ์ง๋์ง, ๊ทธ๋ฆฌ๊ณ ์ธ์ ์ด๋ค ๊ฑธ ์ ํํด์ผ ํ๋์ง ์ฝ๊ฒ ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค.
Server Component๋?
Next.js์์ page.tsx๋ layout.tsx ์ปดํฌ๋ํธ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก Server Component์
๋๋ค.
Server Component๋ ์๋ฒ์์ ๋ ๋๋ง๋๊ณ , ์ต์ข
๊ฒฐ๊ณผ๋ง HTML๋ก ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌ๋ฉ๋๋ค.
โ Server Component์ ์ฅ์
- ํ์ด์ง๋ฅผ ๋ ๋๋งํ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค๋ง์ด ๊ฑฐ์ ํ์ ์๋ค.
- ๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ด์ง ๋ก๋ฉ ์๋๊ฐ ๋น ๋ฅด๋ค.
- SEO์ ์ ๋ฆฌํ๋ค (์๋ฒ์์ ์์ฑ๋ HTML ์ ๊ณต).
โ Server Component์ ๋จ์
- ๋ธ๋ผ์ฐ์ ์ ์ฉ ๊ธฐ๋ฅ์ ์ธ ์ ์๋ค.
- useState, useEffect ๊ฐ์ React Hook ์ฌ์ฉ ๋ถ๊ฐ
- onClick, onChange ๊ฐ์ ์ด๋ฒคํธ ํธ๋ค๋ง ๋ถ๊ฐ
- ๋น๋๊ธฐ ์คํธ๋ฆฌ๋ฐ์ด ์๋ค๋ฉด ์ฌ์ฉ์๋ ํญ์ ์ ์ฒด ํ์ด์ง๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ค.
- HTML ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ง์ ๋ฃ์ ์ ์๋ค.
Client Component๋?
์ปดํฌ๋ํธ ํ์ผ์ ๋งจ ์์ 'use client'; ๋ฅผ ์ ์ธํ๋ฉด, ๊ทธ ์๋์ ์์ฑํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ Client Component๊ฐ ๋ฉ๋๋ค.
Client Component๋ ๋ธ๋ผ์ฐ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ง์ ์คํ๋๋ฉฐ, ์ฐ๋ฆฌ๊ฐ ์ต์ํ React ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
โ Client Component์ ์ฅ์
- ์์ ๋กญ๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ ๋ฃ์ ์ ์๋ค.
- useState, useEffect ์ฌ์ฉ ๊ฐ๋ฅ
- ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ(onClick) ๋ฑ ์ฌ์ฉ์ ์ธํฐ๋์ ๊ฐ๋ฅ
- ๋ณต์กํ UI ์ํ ๊ด๋ฆฌ๋ ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ์ ์ ๋ฆฌํ๋ค.
โ Client Component์ ๋จ์
- ํ์ด์ง ์ฉ๋์ด ์ปค์ง๊ณ ๋ก๋ฉ ์๋๊ฐ ๋๋ ค์ง ์ ์๋ค.
- Hydration ๊ณผ์ ์ด ํ์ํ๋ค.
- ์๋ฒ๊ฐ HTML์ ๋จผ์ ๋ณด๋ด๊ณ ,
- ๋ธ๋ผ์ฐ์ ๊ฐ HTML์ ์ฝ์ ๋ค ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ์ ์ฉํ๋ ๋ณต์กํ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- ์ด ๋๋ฌธ์ ๋ก๋ฉ์ด ๋๋ ค์ง๊ฑฐ๋ ์ด๊ธฐ ๋ ๋๋ง์ด ๋๋ ์ด๋ ์ ์๋ค.
Server์ Client Component๋ฅผ ์ด๋ป๊ฒ ๋๋ ์ผ ํ ๊น?
- ํฐ ๋จ์์ ํ์ด์ง๋ ์ ์ ์ธ ํ์ด์ง๋ Server Component๋ก ๋ง๋ ๋ค.
(๋ ๋๋ง์ ์๋ฒ์์ ํ๊ณ , ๊ฐ๋ณ๊ฒ ๋ณด๋ด์.) - ํด๋ฆญ ์ด๋ฒคํธ, ๋์ ์ธ UI ์ฒ๋ฆฌ ๋ฑ ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ์ด ํ์ํ ๋ถ๋ถ๋ง Client Component๋ก ๋ง๋ ๋ค.
- ์ด๊ธฐ ๋ก๋ฉ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด, ์ ์ ์ฝํ
์ธ ๋ ์๋ฒ์์ ๋จผ์ ๋ ๋๋งํ๊ณ
๋ฐ์ดํฐ๋ ํด๋ผ์ด์ธํธ์์ ๋น๋๊ธฐ๋ก ๋ถ๋ฌ์ค๋ ์ ๋ต์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๋ฆฌํจโผ๏ธ (์ปดํฌ๋ํธ ์ธ๋ถํ)
- ์ด๊ธฐ ๋ก๋ฉ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด, ์ ์ ์ฝํ
์ธ ๋ ์๋ฒ์์ ๋จผ์ ๋ ๋๋งํ๊ณ
โจ ์ ๋ฆฌ
์๋ฒ ์ปดํฌ๋ํธ | ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ | |
๊ธฐ๋ณธ ์ฌ์ฉ ์์น | page.tsx, layout.tsx | 'use client' ์ ์ธํ ์ปดํฌ๋ํธ |
์ฅ์ | ๋น ๋ฅธ ๋ก๋ฉ, ์ ์ JS ๋ฒ๋ค ํฌ๊ธฐ | ์์ ๋ก์ด ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ ๊ตฌํ |
๋จ์ | ์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ ์ฌ์ฉ ๋ถ๊ฐ | ํ์ด์ง ์ฉ๋ ์ฆ๊ฐ, Hydration ๋น์ฉ ๋ฐ์ |
์ถ์ฒ ์ฌ์ฉ์ฒ | ์ ์ ํ์ด์ง, SEO ํ์ํ ๊ณณ | ๋์ ์ธํฐ๋์ , ์ฌ์ฉ์ ์ ๋ ฅ ์ฒ๋ฆฌ |