[Next.js] App Router / ์๋ฒ ์ปดํฌ๋ํธ ์ฃผ์ ๋ด์ฉ ์ ๋ฆฌ
App Router vs Page Router
๊ธฐ๋ฅ | ์ฑ ๋ผ์ฐํฐ | ํ์ด์ง ๋ผ์ฐํฐ |
๋ผ์ฐํ ํ์ | ์๋ฒ ์ค์ฌ | ํด๋ผ์ด์ธํธ ์ฌ์ด๋ |
์๋ฒ ์ปดํฌ๋ํธ ์ง์ | O | X |
๋ณต์ก๋ | ๋ ๋ณต์กํจ | ๋ ๊ฐ๋จํจ |
์ฑ๋ฅ | ๋ ์ข์ | ๋ ๋์จ |
์ ์ฐ์ฑ | ๋ ์ ์ฐํจ | ๋ ์ ์ฐํจ |
ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ | ์ค์ฒฉ ํด๋๋ฅผ ์ฌ์ฉํด ๋ผ์ฐํธ ์ ์ | ํ์ผ์ด ์ง์ ๋ผ์ฐํธ๋ฅผ ๋ํ๋ |
์ปดํฌ๋ํธ | ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ ์ปดํฌ๋ํธ | ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ |
๋ฐ์ดํฐ ํ์นญ | fetch ํจ์ ์ฌ์ฉ | getServerSideProps, getStaticProps, getInitialProps ์ฌ์ฉ |
๋ ์ด์์ | ๋ ์ด์์ ์ค์ฒฉ / ๋์ ๋ ์ด์์ | ์ ์ ๋ ์ด์์ |
๋์ ๋ผ์ฐํธ | ์ง์ํ์ง๋ง ๋ฌธ๋ฒ ๋ค๋ฆ | Link ์ปดํฌ๋ํธ๋ก ์ง์ |
์ฐ์ ์์ | ํ์ด์ง ๋ผ์ฐํฐ๋ณด๋ค ์ฐ์ | ์ฑ ๋ผ์ฐํธ๊ฐ ์์ ๊ฒฝ์ฐ ๋์ฒด |
์๋ฒ ์ปดํฌ๋ํธ
- Next.js ๋ฒ์ 13~๋ถํฐ ์ ๊ณตํ๋ App Router๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ๊ธฐ๋ณธ๊ฐ
- ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋งํ์ง ์์ → ํ์ด๋๋ ์ด์
/๋ฆฌ๋ ๋๋ง ๋ชจ๋ ์์
- ์๋ฒ ์ปดํฌ๋ํธ๋ UI๋ฅผ ์์ฑํ๊ธฐ ์ํด ์๋ฒ์์ ๋ฑ ํ ๋ฒ๋ง ์คํ๋จ
- ์๋ฒ ์ปดํฌ๋ํธ๋ ์๋ฒ์์๋ง ๋ ๋๋ง๋๋ฏ๋ก JS ๋ฒ๋ค์ ํฌํจ ์๋จ → ์๋ฒ ์ปดํฌ๋ํธ์ ์ฅ์
- ๋๋ฌธ์
useEffect
,useState
๋ฑ React API๋ ์๋ฒ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ ๋ถ๊ฐ - ์๋ฒ ์ปดํฌ๋ํธ๋ ๋ค์ ๋ ๋๋งํ ์ ์๊ธฐ ๋๋ฌธ์ state๋ ์ฌ์ฉ ๋ถ๊ฐ
- ๋ฐ๋ฉด ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ์๋ฒ/ํด๋ผ์ด์ธํธ ์์ชฝ์์ ๋ชจ๋ ๋ ๋๋ง๋จ
- ํ์ผ ์ต์๋จ์
use client
์ง์๋ฌธ(Directive)์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ์ตํธ์ธ- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ JS ๋ฒ๋ค์ ํฌํจ๋จ
- ์๋ฐํ๊ฒ ๋งํ๋ฉด
use client
์ง์๋ฌธ์ ํ์ผ/๋ชจ๋ ์์ค์์ ์๋
- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ง ์ํฌํธ ๊ฐ๋ฅ
- ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ์์ ์๋ฒ ์ปดํฌ๋ํธ ๋ ๋๋ง ๋ถ๊ฐ
- ์๋ฒ ์ปดํฌ๋ํธ์์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ ๋๋ง ๊ฐ๋ฅ
ํด๋ผ์ด์ธํธ ๊ฒฝ๊ณ โญ
์๋ ๊ฐ์ ๊ตฌ์กฐ์์ <Article />
์ปดํฌ๋ํธ์ use client
์ง์๋ฌธ์ ์ฌ์ฉํ๋ฉด ํ์ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ์๋ฌต์ ์ผ๋ก ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๋ณํ๋๋ค. ์ฆ, use client
์ง์๋ฌธ์ ํด๋ผ์ด์ธํธ ๊ฒฝ๊ณ๋ฅผ ์์ฑํ๋ค๊ณ ๋ณผ ์ ์๋ค.
๋ง์ฝ ์ดํ๋ฆฌ์ผ์ด์
์ ๋์ ์์ค์์(์์) use client
์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๋ณ๊ฒฝํ๋ฉด, ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ(Header, MainContent)๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ๋๋ค.
'use client';
import { DARK_COLORS, LIGHT_COLORS } from '@/constants.js';
import Header from './Header';
import MainContent from './MainContent';
function Homepage() {
const [colorTheme, setColorTheme] = React.useState('light');
const colorVariables = colorTheme === 'light' ? LIGHT_COLORS : DARK_COLORS;
return (
<body style={colorVariables}>
<Header /> {/* ์๋ฌต์ ์ผ๋ก ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๋ณํ */}
<MainContent /> {/* ์๋ฌต์ ์ผ๋ก ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๋ณํ */}
</body>
);
}
๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ก ๋ณ๊ฒฝ๋๋ฉด Next.js ์๋ฒ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ์ฅ์ ์ด ์ฌ๋ผ์ง๋ฏ๋ก ์๋์ ๊ฐ์ ์ฐจ์ ์ฑ (workaround)์ผ๋ก ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ๋๋๋ก ๋ง๋ค ์ ์๋ค.
โถ ์ํ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ <ColorProvider />
ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ฐ๋ก ๋ถ๋ฆฌ
// components/ColorProvider.js
'use client';
import { DARK_COLORS, LIGHT_COLORS } from '@/constants.js';
function ColorProvider({ children }) {
const [colorTheme, setColorTheme] = React.useState('light');
const colorVariables = colorTheme === 'light' ? LIGHT_COLORS : DARK_COLORS;
return <body style={colorVariables}>{children}</body>;
}
โท <Homepage />
์๋ฒ ์ปดํฌ๋ํธ์์ <ColorProvider />
ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ์ํฌํธํด์ ์ฌ์ฉ
// components/Homepage.js
import Header from './Header';
import MainContent from './MainContent';
import ColorProvider from './ColorProvider';
function Homepage() {
return (
<ColorProvider>
<Header /> {/* ์๋ฒ ์ปดํฌ๋ํธ */}
<MainContent /> {/* ์๋ฒ ์ปดํฌ๋ํธ */}
</ColorProvider>
);
}
<Header />
, <MainContent />
์ปดํฌ๋ํธ๋ฅผ import ํ ๊ณณ์ด <Homepage />
์๋ฒ ์ปดํฌ๋ํธ ์ด๋ฏ๋ก, ์ฌ๊ธฐ์ ๋ ๋๋ง ํ๋ ์ปดํฌ๋ํธ๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ ์ปดํฌ๋ํธ๋ก ์๋ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ์ฆ, ์ด๋ค ์ ํ์ ์ปดํฌ๋ํธ์์ ๋ถ๋ฌ์๋์ง์ ๋ฐ๋ผ ํ์ ์ปดํฌ๋ํธ์ ์๋ฒ/ํด๋ผ์ด์ธํธ ์๋ ๋ฐฉ์์ด ๊ฒฐ์ ๋๋ค.
๋ ๋๋ง ํ๋ฆ ๋น๊ต
๐ก ํธ์๋ฅผ ์ํด Render Shell์ ๋ ์ด์์ ๋ ๋๋ง์ผ๋ก ๋ฒ์ญ
CSR
๋ชจ๋ ์ฝํ ์ธ ๋ฅผ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋งํด์ ์๋ฒ ๋ถ๋ด์ ์ค์ด๊ณ ์ธํฐ๋ํฐ๋ธํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ์ง๋ง, ์ด๊ธฐ ๋ก๋ฉ ์๋๊ฐ ๊ธธ์ด์ง๋ ๋จ์ ์ด ์๋ค.
- (ํด๋ผ์ด์ธํธ) JS ๋ฒ๋ค์ ํฌํจํ ๋ฆฌ์์ค ๋ค์ด๋ก๋
- (ํด๋ผ์ด์ธํธ) ๋น HTML ๋ ๋๋ง
===== ๋น ํ๋ฉด ํ์ | ์ธํฐ๋ ์ ๊ฐ๋ฅ ===== - (ํด๋ผ์ด์ธํธ) ์ฝํ ์ธ ๋ค์ด๋ก๋
- (ํด๋ผ์ด์ธํธ) ์ฝํ ์ธ ๋ ๋๋ง
SSR
ํ์ด์ง ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํด๋ ์๋ฒ์์ ์ฝํ ์ธ ๋ฅผ ๋ฏธ๋ฆฌ ๋ค์ด๋ก๋ํ๊ณ HTML์ ์์ฑํ ์ ์์ง๋ง, ์ปดํฌ๋ํธ ํธ๋ฆฌ ๊ฐ์ฅ ์๋จ์ ์๋ ๋ผ์ฐํธ ๋ ๋ฒจ์์๋ง ์๋ํ๋ ๋จ์ ์ด ์์ผ๋ฉฐ ์ด๋ฅผ Pre-RSC๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค. ์๋ ์ด๋ฏธ์ง๋ ๊ธฐ๋ณธ SSR ๋ ๋๋ง ํ๋ก์ฐ. CSR์ ๋นํด First Paint๊ฐ ๋นจ๋ผ์ง๋ ์ฅ์ ์ด ์๋ค.
- (์๋ฒ) ๋ ์ด์์ HTML ์์ฑ
- (ํด๋ผ์ด์ธํธ) JS ๋ฒ๋ค์ ํฌํจํ ๋ฆฌ์์ค ๋ค์ด๋ก๋
===== ๋ ์ด์์ ํ์ | ์ธํฐ๋ ์ ๋ถ๊ฐ ===== - (ํด๋ผ์ด์ธํธ) ํ์ด๋๋ ์ด์
===== ์ธํฐ๋ ์ ๊ฐ๋ฅ ===== - (ํด๋ผ์ด์ธํธ) ์ฝํ ์ธ ๋ค์ด๋ก๋
- (ํด๋ผ์ด์ธํธ) ์ฝํ ์ธ ๋ ๋๋ง
SSR with Server Component
SSR์ ๋นํด First Paint๋ ๋ค์ ๋ฆ์ด์ง์ง๋ง, Content Painted(์ฝํ ์ธ ํ์ธํธ)๊ฐ ๋นจ๋ผ์ง๋ ์ฅ์ ์ด ์๋ค.
- (์๋ฒ) ์ฝํ ์ธ ๋ค์ด๋ก๋ ํ HTML ์์ฑ
- (ํด๋ผ์ด์ธํธ) JS ๋ฒ๋ค์ ํฌํจํ ๋ฆฌ์์ค ๋ค์ด๋ก๋
===== ๋ ์ด์์ ๋ฐ ์ฝํ ์ธ ํ์ | ์ธํฐ๋ ์ ๋ถ๊ฐ ===== - (ํด๋ผ์ด์ธํธ) ํ์ด๋๋ ์ด์
===== ์ธํฐ๋ ์ ๊ฐ๋ฅ =====
SSR with Server Component, Streaming(Suspense)
UI๋ฅผ ์ฒญํฌ ๋จ์๋ก ๋๋ ์ ์ฐ์ ์์๊ฐ ๋๊ฑฐ๋ ๋ฐ์ดํฐ์ ์์กดํ์ง ์๋ ์ปดํฌ๋ํธ๋ฅผ ๋จผ์ ์ ์ก(์คํธ๋ฆฌ๋ฐ), ๊ธฐ์กด SSR๋ณด๋ค ๋ ๋น ๋ฅด๊ฒ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ ์ ์๋ค. ์๋ฒ ์ปดํฌ๋ํธ๊ฐ ์คํธ๋ฆฌ๋ฐ๋๋ ๋์ ํด๋ผ์ด์ธํธ์์ ํ์ด๋๋ ์ด์ ์ด ๋์์ ์งํ๋ผ์ ๋ ๋น ๋ฅธ ํ์ด๋๋ ์ด์ ๊ฐ๋ฅ → ์ด๊ธฐ ์ธํฐ๋ํฐ๋ธ ์๊ฐ(TTI)์ ๋จ์ถํ ์ ์๋ ์ฅ์ ์ด ์๋ค.
- (์๋ฒ) ๋ ์ด์์ HTML ์์ฑ ๋ฐ ์ฝํ ์ธ ๋ค์ด๋ก๋
- (ํด๋ผ์ด์ธํธ) JS ๋ฒ๋ค์ ํฌํจํ ๋ฆฌ์์ค ๋ค์ด๋ก๋
===== ๋ ์ด์์ ํ์ | ์ธํฐ๋ ์ ๋ถ๊ฐ ===== - (ํด๋ผ์ด์ธํธ) ๋ถ๋ถ ํ์ด๋๋ ์ด์
===== ๋ถ๋ถ ์ธํฐ๋ ์ ๊ฐ๋ฅ ===== - (์๋ฒ) ์ฝํ ์ธ ๋ฅผ ํฌํจํ HTML ์์ฑ
- (ํด๋ผ์ด์ธํธ) ์ฝํ
์ธ HTML ๋ค์ด๋ก๋ ๋ฐ ํ์ด๋๋ ์ด์
===== ์ ์ฒด ์ธํฐ๋ ์ ๊ฐ๋ฅ =====
๋ ํผ๋ฐ์ค
- The Differences Between App Router and Page Router | @stk.devtest
- Making Sense of React Server Components | Josh Comeau
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Network] ์ฃ์ง ํ๋ซํผ ์ํคํ ์ฒ Edge Platform Architecture
[Network] ์ฃ์ง ํ๋ซํผ ์ํคํ ์ฒ Edge Platform Architecture
2024.06.02 -
[HTML/CSS] ์ํ๋ ์์น์ ๋ ธ๋ ์ฝ์ ํ๊ธฐ — insertAdjacentHTML
[HTML/CSS] ์ํ๋ ์์น์ ๋ ธ๋ ์ฝ์ ํ๊ธฐ — insertAdjacentHTML
2024.06.02 -
[Algorithm] ๋ฏธ๋๋งฅ์ค / ์ํ-๋ฒ ํ ๊ฐ์ง์น๊ธฐ ์๊ณ ๋ฆฌ์ฆ ํบ์๋ณด๊ธฐ
[Algorithm] ๋ฏธ๋๋งฅ์ค / ์ํ-๋ฒ ํ ๊ฐ์ง์น๊ธฐ ์๊ณ ๋ฆฌ์ฆ ํบ์๋ณด๊ธฐ
2024.06.01 -
[React] ํฑํํ (Tic-Tac-Toe) ๊ฒ์ ์ฃผ์ ๋ก์ง ํบ์๋ณด๊ธฐ
[React] ํฑํํ (Tic-Tac-Toe) ๊ฒ์ ์ฃผ์ ๋ก์ง ํบ์๋ณด๊ธฐ
2024.05.30