ํฐ์คํ ๋ฆฌ ๋ทฐ
์ฐ๋ฆฌ๊ฐ ํ์์ ์ฐ๋ ๊ฐ๋ฐ ๋ชจ๋๋ yarn dev๋ฅผ ํ์ ๋, ๋ธ๋ผ์ฐ์ ์ ‘๊ฐ๋ฐ์๋๊ตฌ’์์ ์ฝ์์ ํ์ธํ ์ ์์๋ค.
yarn build๋ฅผ ํ๊ฒ ๋๋ฉด ์ค์ ๋ฐฐํฌ์์ ์ฌ์ฉ๋๋ ํ๋ก๋์ ๋ชจ๋๋ก ๋ฐ๊พธ๋ ๊ฒ์ด๋ค
๋ฐ๋ผ์ (ํนํ react)๋ ๊ฐ๋ฐ์๋๊ตฌ์์ ๋ณด๋ ํ๊ทธ๋ ๋ค๋ฅธ ํํ๊ฐ ์๋ ์ผ๊ทธ๋ฌ์ง ํํ๊ฐ ๋๋ ๊ฒ์ด๋ค.
react๋ html์์๊ฐ ๊ฑฐ์ ์์ผ๋ฉฐ JS๋ฅผ ํตํด ํ๋ฉด์ ๊ทธ๋ ค๋ด๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
build๋ฅผ ํ๊ฒ ๋๋ฉด ๋น๋ ์์ ์์์ ๋ก์ง์ด ํ๋ก๋์ ๋ชจ๋๋ก ์์ฑ๋๋ค.
SSG (Static Site Generation)
SSG๋ ์ต์ด ๋น๋ ์์ ์ํ๋ฅผ ์บ์ฑํด๋์๋ค๊ฐ ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ผ ๊ณ ์ ๋ HTML์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๊ณ ํ๋ฉด์ ๋ฟ๋ ค์ค๋ค.
์ด๋ฏธ ์๋ฒ ์ธก์์ HTML์ ๋น๋ํด๋์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์์๊ฒ ์ ๋ง ๋น ๋ฅด๊ฒ ๋ณด์ฌ์ค ์ ์๋ ๊ฒ์ด๋ค.
- ์ฅ์
- TTV*๊ฐ ๋งค์ฐ ์งง๋ค.
- SEO*์ ์ ๋ฆฌํ๋ค.
- CDN* ์บ์ฑ ๊ฐ๋ฅํ๋ค.
- ๋จ์
- ์ ์ ์ธ ๋ฐ์ดํฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ผ ์๋ฒ์ ํต์ ํ๋ฏ๋ก ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง๋ณด๋ค ์ํธ์์ฉ์ด ๋๋ฆด ์ ์๋ค.
- html ์์๊ฐ ๋ง๋ค๋ฉด ์๋ฒ ๋ถํ๊ฐ ํด ์๋ ์๋ค.
- ์ฝ๋
import React from 'react';
function HomePage({ data }) {
return <div>{data}</div>;
}
export async function getStaticProps() {
const res = await fetch('https://...'); // ์ธ๋ถ API ํธ์ถ
const data = await res.json();
return { props: { data } };
}
export default HomePage;
* TTV : ํ๋ฉด์ html ์์๊ฐ ๋ํ๋ ๋๊น์ง์ ์๊ฐ(๋ฒํผ์ ๋ํ๋์ง๋ง ๋์ X)
* SEO : ๊ฒ์ ์์ง ์ต์ ํ, ์น ํ์ด์ง ๊ฒ์์์ง์ด ์๋ฃ๋ฅผ ์์งํ์ฌ ์์ ๋ ธ์ถ์ด ๋๊ฒ ํ๋ค.
SSG์ ๊ฒฝ์ฐ์๋ html ์์๋ฅผ ๊ทธ๋๋ก ์ธ์ํ ์ ์์ด ์ ๋ฆฌํ๋ค.
* CDN : Content Delivery Network, ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ ๋๋ ์ฝํ ์ธ ๋ฐฐํฌ ๋คํธ์ํฌ๋ก ์ ์ธ๊ณ์ ๋ถ์ฐ๋ ์๋ฒ๋ฅผ ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐํ ๊ธฐ์
ISR (Incremental Static Regeneration)
SSG์ฒ๋ผ ์ด๊ธฐ์ ๋น๋ ๋ ์ ์ ์ธ ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ค. ๋ค๋ง ๊ฐ๋ฐ์๊ฐ ์ค์ ํ ์๊ฐ์ด ์ง๋ ๋๋ง๋ค ์๋ก์ด HTML์ ๋ฐ์ํ๋ค.
์ ํด์ง ์๊ฐ๊ณผ ์๊ฐ ์ฌ์ด์ ์ฌ์ฉ์์ ์์ฒญ์ด ์์ ๋์๋ ์ด์ revalidate์์ ์์ฑํ ํ์ด์ง๋ฅผ ๋ฐ์
=> revalidate ์๊ฐ์๋ง ์๋กญ๊ฒ ์์ฑ
์ต์ด ์ ์ฒด ์ฌ์ดํธ ๋น๋๐๐ป์บ์ฑ๐๐ป์ ํด์ง ์๊ฐ ๋ง๋ค ์บ์ฑ ๋ฐ์ดํฐ์ ๋น๊ตํด์ ๋ณ๊ฒฝ๋ ํ์ด์ง ์ ์ฒด๋ฅผ ๋น๋๐๐ป์บ์ฑ๐๐ปํด๋ผ์ด์ธํธ ์ ๋ฌ ๐๐ปํ์ด์ง ๋ฐ์
Next๋ revalidate Time์ ์ฌ๊ณ ์์ง ์๊ณ , ์ฌ์ฉ์ ์์ฒญ ์ ์ฒ์ ์์ฑ ์๊ฐ๊ณผ ๋น๊ตํ๋ค.
๋ง์ฝ, 1์๊ฐ์ด ์ง๋๋ ์์ฒญ์ด ์์ผ๋ฉด ์๋ก์ด ๋ฐ์ดํฐ ์ ๊ฐ์ ธ์ด => ํจ์จ์
์์ฒญ ์์๋ ๋ฌด์กฐ๊ฑด data sourse๊น์ง ๊ฐ์ ๊ฐ์ ธ์ด(์๋ฒ์ ๋๋ ์ด๊ฐ ์๋ค๋ฉด ๋ฌด์กฐ๊ฑด ์ ์ฉ๋จ)
์์
10๋ถ ๋จ์,
11์ 9๋ถ -> ๊ธฐ์กด HTML
11tl 11๋ถ -> ๊ธฐ์กด HTML / ๋ค์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๋ ์ค / ์๋ก์ด ๋ฐ์ดํฐ ๊ฐ์๋ผ์ ์ค
- ์ฅ์
- ์ ์ ์ธ ํ์ด์ง๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ด ์ข๋ค.
- ์ฝํ ์ธ ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ์๋ฒ์์ ํ์ด์ง๋ฅผ ์ฌ์์ฑํ๋ฏ๋ก ์ต์ ์ํ๋ฅผ (๊ทธ๋๋ง) ์ ์งํ ์ ์๋ค.
- CDN ์บ์ฑ ๊ฐ๋ฅํ๋ค.
- ๋จ์
- ๋์ ์ธ ์ฝํ ์ธ ๋ฅผ ๋ค๋ฃจ๊ธฐ์ ํ๊ณ๊ฐ ์์ ์ ์๋ค.
- ๋ง์ดํ์ด์ง ์ฒ๋ผ ๋ฐ์ดํฐ์ ์์กดํ์ฌ ํ๋ฉด์ ๊ทธ๋ ค์ฃผ๋ ๊ฒฝ์ฐ ์ฌ์ฉ ๋ถ๊ฐ
- ์ฝ๋
import React from 'react';
function HomePage({ data }) {
return <div>{data}</div>;
}
export async function getStaticProps() {
const res = await fetch('https://...'); // ์ธ๋ถ API ํธ์ถ
const data = await res.json();
return {
props: { data },
revalidate: 60, // 1์ด ํ์ ํ์ด์ง ์ฌ์์ฑ
};
}
export default HomePage;
SSR (Server Side Rendering)
์ด๋ฆ์์๋ ์ ์ ์๋ฏ์ด ๋ ๋๋ง ์ฃผ์ฒด๋ ์๋ฒ์ด๋ค. ์ต์ด ๋น๋ ์ ํ๋ก๋ํธ ๋ชจ๋๊ฐ ์์ฑ๋์ง๋ง ๊ทธ ์ํ๋ฅผ ์บ์ฑํด๋์ง ์๋๋ค.
์ฌ์ฉ์์ ์์ฒญ์ ๋ฐ๋ผ ๊ทธ ์ฆ์ ์๋ฒ ์ธก์์ ๋ ๋๋งํ์ฌ DB์๊ฒ API ์์ฒญ ๋ฑ์ ๋ง์น๊ณ html ํ์ผ์ ์ ๋ฌํ๋ค.
์์ฒญ๋ง๋ค ํด๋น ๋ถ๋ถ๋ง ๋ ๋๋ง ํ html์ ํด๋ผ์ด์ธํธ์ ์ ๋ฌ -> ํ๋ฉด์ ๋ฟ๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์๋ค.
ํ์ง๋ง ์์ฒญ๋ง๋ค ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ผ ํ๊ธฐ ๋๋ฌธ์ TTI(์์ฒญ ์ ์๋ต ์๊ฐ)์ด ๋๋ฆฌ๋ค.
์ฆ, HTML ์์๋ ๋น ๋ฅด๊ฒ ๋ณด์ฌ์ฃผ์ง๋ง ๋ฐ์ดํฐ ์์ฒญ์ ๋ํ ์๋ต์ ๋๋ฆฌ๋ค.
- ์ฅ์
- TTV๊ฐ ๋น ๋ฆ
- SEO ์ต์ ํ ์ข์
- ์ค์๊ฐ ๋ฐ์ดํฐ ์ฌ์ฉ
- ๋ง์ดํ์ด์ง์ฒ๋ผ ๋ฐ์ดํฐ์ ์์กดํ ํ์ด์ง ๊ตฌ์ฑ ๊ฐ๋ฅ
- ๋จ์
- CDN ์บ์ฑ ๋ถ๊ฐ -> ๋ฐ๋ก ์ฒ๋ฆฌํ๋ฉด ์บ์ฑ ๊ฐ๋ฅ
- ๋์ ์์ฒญ์ด ๋ง์์ง๋ฉด ์๋ฒ์ ๋ถํ๊ฐ ๊ฑธ๋ฆด ์ ์์
- ์์ฒญํ ๋๋ง๋ค ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ผ ํจ
- ์ฝ๋
import React from 'react';
function HomePage({ data }) {
return <div>{data}</div>;
}
export async function getServerSideProps() {
const res = await fetch('https://...', { cache: 'no-store' }); // ์ธ๋ถ API ํธ์ถ
const data = await res.json();
return { props: { data } };
}
export default HomePage;
CSR (Client Side Rendering)
๋ค ๊ฐ์ง์ ๋ ๋๋ง ๋ฐฉ์ ์ค ์ ์ผํ๊ฒ ๋ ๋๋ง ์ฃผ์ฒด๊ฐ ํด๋ผ์ด์ธํธ์ด๋ค. ์ฝ๊ฒ React๋ผ๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
์๋ฒ์์๋ ์ด๊ธฐ HTML(index.html)๊ณผ JS(bundle.js) ํ์ผ๋ง ์ ๊ณตํ๋ค.
ํด๋ผ์ด์ธํธ๊ฐ API ์์ฒญ์ ์ง์ ๋ณด๋ด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , JS๊ฐ ํ๋ฉด์ ๋์ ์ผ๋ก ์์ฑํ๋ค.
์๋ฒ์์ ์ง์ ๋ ๋๋ง๋ HTML์ ์ ๊ณตํ์ง ์์ผ๋ฏ๋ก, ์ด๊ธฐ ํ๋ฉด์ ๋น ์ํ์ด๋ค.
html์ด ์์ผ๋ฏ๋ก API ์์ฒญ์ ํตํด ๋ฐ์ ๋ฐ์ดํฐ๋ก ํ๋ฉด์ ๊ทธ๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ TTV๊ฐ ๊ธธ ์๋ ์๋ค.
๋์ ์ดํ์ ํ์ด์ง ์ ํ๊ณผ ๋ฐ์ดํฐ ์์ฒญ์ด ๋น ๋ฅด๋ค.
๋ค๋ง React ์ปดํฌ๋ํธ๋ ๋๊ธฐ์ ์ผ๋ก ๋ ๋๋ง๋๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ ์ฝ๋(async-await)๋ useEffect ๋๋ tanstack query์์ ๊ด๋ฆฌํด์ผ ํ๋ค.
- ์ฅ์
- (์ต์ด ํ๋ฒ ๋ก๋๊ฐ ๋๋๋ฉด) ์ฌ์ฉ์์์ ์ํธ์์ฉ์ด ๋น ๋ฅด๊ณ ๋ถ๋๋ฝ๋ค.
- ์๋ฒ์๊ฒ ์ถ๊ฐ์ ์ธ ์์ฒญ์ ๋ณด๋ผ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์ ๊ฒฝํ์ด ์ข๋ค.
- ์๋ฒ ๋ถํ๊ฐ ์ ๋ค.
- ๋จ์
- ์ฒซ ํ์ด์ง ๋ก๋ฉ ์๊ฐ(Time To View)์ด ๊ธธ ์๋ ์๋ค.
- JavaScript๊ฐ ๋ก๋ฉ ๋๊ณ ์คํ๋ ๋๊น์ง ํ์ด์ง๊ฐ ๋น์ด์์ด ๊ฒ์ ์์ง ์ต์ ํ(SEO)์ ๋ถ๋ฆฌํ๋ค
- ์ฝ๋
import React from 'react';
import ReactDOM from 'react-dom';
function App() {
return <h1>Hello, Client Side Rendering!</h1>;
}
// index.js
ReactDOM.render(<App />, document.getElementById('root'));

SSG, SSR, ISR, CRS ์ด๋จ ๋ ์ฌ์ฉ?
SSG - ๋ณ๋์ด ์๊ณ ๊ณ ์ ๋ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง
ISR - ์ผ์ ์๊ฐ๋ง๋ค ๋ณ๋๋๋ ๋ด์ฉ์ ํฌํจํ๋ ํ์ด์ง
SSR - ์์ฃผ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ํ์ด์ง/SEO ์ต์ ํ
CRS - ์์ฃผ ๋ณ๊ฒฝ๋์ด์ผ ํ๊ณ ๋น ๋ฅธ ๋ฐ์์ด ํ์ํ ํ์ด์ง/TTV ๊ธธ ์ ์์
'Language > Next' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [/\/] Tanstack Query + Zustand ์ ์ญ ์ํ ๊ด๋ฆฌํ๊ธฐ (0) | 2025.03.21 |
|---|---|
| [/\/] Next.js์์ ๋งํ๋ '์๋ฒ'๋? (0) | 2025.03.19 |
| [/\/] Error Handling (0) | 2025.03.19 |
| [/\/] Next์ Tanstack Query (0) | 2025.03.19 |
| [/\/] Loading UI - Suspense ์ Streaming SSR (0) | 2025.03.11 |