Next.js Pages Router ๋ ๊ฑฐ์๋ฅผ ๋์ด, App Router ๊ธฐ๋ฐ ๊ตฌ์กฐ ๋ค์ ์ค๊ณํ๊ธฐ
- #Next.js
- #App Router
- #React
- #Frontend
๋ค์ด๊ฐ๋ฉฐ
์๋ ํ์ธ์, ๋ ธ๋จธ์ค FE ๊ฐ๋ฐ์ ๊น๋ฏผ์์ ๋๋ค.
์ด๋ฒ์ ๋ ธ๋จธ์ค์์ ์๋ก์ด ์ด์ปค๋จธ์ค ์๋น์ค๋ฅผ ๊ตฌํํ๊ฒ ๋์์ต๋๋ค.
๊ฐ๋ฐ ๊ธฐ๊ฐ์ ์ฝ ํ ๋ฌ ์ ๋์๊ณ , ์๊ตฌ์ฌํญ ์๋น์๊ฐ ๊ธฐ์กด fromm store์ ์ ์ฌํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์์ต๋๋ค.
ํ ๋ฌ์ด๋ผ๋ ๊ธฐ๊ฐ ์์ ๋ชจ๋ ๊ฒ์ ์ฒ์๋ถํฐ ๋ง๋ค๊ธฐ๋ณด๋ค๋, ๊ธฐ์กด ์ฝ๋๋ฅผ ์ ํ์ฉํ๋ ํธ์ด ํจ์จ์ ์ด์์ต๋๋ค. ๋ค๋ง ๊ทธ๋๋ก ๋ณต์ฌํ๋ฉด Next.js Pages Router ๊ธฐ๋ฐ์ ๋ ๊ฑฐ์ ๊ตฌ์กฐ๊น์ง ํจ๊ป ์ ์ ๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๊ทธ๋์ ํ์ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉํฅ์ ์ ํํ์ต๋๋ค.
โ๊ธฐ์กด ์ฝ๋๋ ์ฐธ์กฐ ์์ฐ์ผ๋ก ํ์ฉํ๋, App Router ๊ตฌ์กฐ์ ๋ง์ถฐ ์ฌ์ค๊ณํ๊ณ ํ์ํ ๋ฆฌํฉํ ๋ง๊น์ง ํจ๊ป ์งํํ๋ค.โ
๋จ์ํ ์ฝ๋ ๋ณต์ฌ๊ฐ ์๋๋ผ, ๊ฒ์ฆ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ฌํ์ฉํ๋ฉด์๋ ์๋ก์ด ์ํคํ ์ฒ์ ํ ์ปจ๋ฒค์ ์ ๋ง๊ฒ ๋ค์ ๊ตฌํํ๋ ์ ๋ต์ด์์ต๋๋ค.
1. Pages Router vs App Router: ํต์ฌ ์ฐจ์ด์
์ ํ๋ก์ ํธ๋ฅผ ์์ํ๊ธฐ ์ , ํ ๋ด์์ App Router์ ํต์ฌ ๋ณํ๋ฅผ ๋จผ์ ์ ๋ฆฌํ์ต๋๋ค.
๋ผ์ฐํ ๊ตฌ์กฐ
# Pages Router (๊ธฐ์กด fromm store)
pages/
โโโ _app.tsx
โโโ _document.tsx
โโโ index.tsx
โโโ goods/
โ โโโ [id].tsx
# App Router (์ ํ๋ก์ ํธ)
app/
โโโ layout.tsx
โโโ page.tsx
โโโ goods/
โ โโโ [id]/
โ โโโ page.tsx
Pages Router์์๋ _app.tsx์ _document.tsx๊ฐ ์ ์ญ ์ญํ ์ ๋ด๋นํ์ง๋ง, App Router์์๋ layout.tsx๋ฅผ ์ค์ฌ์ผ๋ก ๊ณ์ธต์ ์ธ ๋ ์ด์์ ๊ตฌ์ฑ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค.
์ปดํฌ๋ํธ ํจ๋ฌ๋ค์ ๋ณํ
| ๊ตฌ๋ถ | Pages Router | App Router |
|---|---|---|
| ๊ธฐ๋ณธ ์ปดํฌ๋ํธ | Client Component | Server Component |
| ๋ฐ์ดํฐ ํ์นญ | getServerSideProps,ย getStaticProps | Server Component ๋ด๋ถย async/await |
| ๋ฉํ๋ฐ์ดํฐ | next/head | generateMetadata |
๊ฐ์ฅ ํฐ ๋ณํ๋ Server Component๊ฐ ๊ธฐ๋ณธ๊ฐ์ด ๋์๋ค๋ ์ ์ ๋๋ค.
๊ธฐ์กด Pages Router์์๋ ๋๋ถ๋ถ์ ์ปดํฌ๋ํธ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ Client Component ์ค์ฌ์ด์์ง๋ง, App Router์์๋ ๋ณ๋์ 'use client' ์ ์ธ์ด ์๋ ํ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฒ์์ ๋ ๋๋ง๋ฉ๋๋ค.
Server Component๋ ๋ธ๋ผ์ฐ์ ๋ก ์ ๋ฌ๋๋ JavaScript ์์ ์ค์ผ ์ ์๊ณ , ์๋ฒ์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ํ์นญํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค. ๋ฐ๋ฉด ์ํ(useState), ์ดํํธ(useEffect), ๋ธ๋ผ์ฐ์ API(window, document), ์ด๋ฒคํธ ํธ๋ค๋ฌ(onClick ๋ฑ)๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค๋ง ์ด๋ฒ ํ๋ก์ ํธ์์๋ Server Component์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ํ์นญํ๊ธฐ๋ณด๋ค, ๋๋ถ๋ถ์ ๋ฐ์ดํฐ ํ์นญ์ ํด๋ผ์ด์ธํธ์ TanStack Query์ ์์ํ๋ ๊ตฌ์กฐ๋ฅผ ํํ์ต๋๋ค. Server Component๋ API ํค๋ ์ด๊ธฐํ, ์ธ์ฆ ๊ฐ๋ ๋ํ, ๋ฉํ๋ฐ์ดํฐ ์์ฑ ๋ฑ ์ต์ํ์ ์๋ฒ ์์ ๋ง ๋ด๋นํ๊ณ , ์ฌ์ฉ์ ์ธํฐ๋์ ๊ณผ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ Client Component์์ ์ฒ๋ฆฌํฉ๋๋ค.
์ด ๋ณํ๋ก ์ธํด ๋จ์ํ ๋ผ์ฐํ ๋ฐฉ์๋ง ๋ฌ๋ผ์ง ๊ฒ์ด ์๋๋ผ, โ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ์๋ฒ์์ ์คํํ ๊ฒ์ธ๊ฐโ๊น์ง ํจ๊ป ๊ณ ๋ คํ๋ ๊ตฌ์กฐ์ ์ค๊ณ๊ฐ ์ค์ํด์ก์ต๋๋ค.
useRouter API ๋ณํ
// Pages Router
import { useRouter } from 'next/router';
const router = useRouter();
router.pathname // โ
router.query // โ
router.push() // โ
// App Router
import { useRouter } from 'next/navigation';
const router = useRouter();
router.pathname // โ โ usePathname()
router.query // โ โ useSearchParams()
router.push() // โ
๊ธฐ์กด Pages Router์์ ์ต์ํ๋ API ์ผ๋ถ๊ฐ ์ ๊ฑฐ๋๋ฉด์, ํ๋ก์ ํธ ์ ๋ฐ์ ๊ฑธ์ณ ๋ผ์ฐํ ๊ด๋ จ ์ฝ๋๋ฅผ ๋ค์ ์ค๊ณํ ํ์๊ฐ ์์์ต๋๋ค.
2. App Router ๊ธฐ๋ฐ ๊ตฌ์กฐ ์ฌ์ค๊ณ
์ํฉ
์ ํ๋ก์ ํธ์์ง๋ง ๋ค์ ์กฐ๊ฑด๋ค์ด ์กด์ฌํ์ต๋๋ค.
- ๊ธฐ์กด fromm store์ ๋๋ฉ์ธ ๋ก์ง์ด ๋งค์ฐ ์ ์ฌ
- ์ฃผ๋ฌธ, ๊ฒฐ์ , ์ฅ๋ฐ๊ตฌ๋ ๋ฑ ๊ฒ์ฆ๋ ๋น์ฆ๋์ค ๋ก์ง์ด ์ด๋ฏธ ์กด์ฌ
- ํ์ง๋ง ๊ธฐ์กด ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ๋ฉด Pages Router ํจํด๊น์ง ํจ๊ป ์ ์ ๋จ
์ฆ, โ๋ก์ง์ ์ฌ์ฌ์ฉํ๊ณ ์ถ์ง๋ง ๊ตฌ์กฐ๋ ๊ฐ์ ธ์ค๊ณ ์ถ์ง ์์โ ์ํฉ์ด์์ต๋๋ค.
์ ๊ทผ ๋ฐฉ์
๊ธฐ์กด ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ๋ณต์ฌํ์ง ์๊ณ , App Router ๊ธฐ๋ฐ ์ํคํ ์ฒ์ ์๋ก์ด ํ ์ปจ๋ฒค์ ์ ๋ง์ถฐ ์ฒ์๋ถํฐ ๋ค์ ์ค๊ณํ๋ ๋ฐฉํฅ์ผ๋ก ์งํํ์ต๋๋ค.
ํนํ ์๋ ํญ๋ชฉ๋ค์ ์ค์ ์ ์ผ๋ก ์ ๋ฆฌํ์ต๋๋ค.
- App Router ๊ธฐ๋ฐ ํด๋ ๊ตฌ์กฐ ์ ๋ฆฝ
- Server / Client Component ์ญํ ๋ถ๋ฆฌ
- ๊ณตํต ๋ผ์ฐํฐ ์ธํฐํ์ด์ค ์ฌ์ค๊ณ
- ์คํ์ผ ์์คํ ๋ฐ ํ ํฐ ์ฒด๊ณ ๊ฐ์
- ์ ์ญ ๋ ์ด์์๊ณผ Provider ์ฑ ์ ๋ถ๋ฆฌ
์ค์ ์ํฌํ๋ก์ฐ
- ๊ธฐ์กด ์๋น์ค ๊ตฌ์กฐ ๋ฐ ๋๋ฉ์ธ ํ๋ฆ ๋ถ์
- App Router + ํ ์ปจ๋ฒค์ ๊ธฐ์ค ์ ์
- ๊ธฐ๋ฅ ๋จ์๋ก ์๋ก์ด ๊ตฌ์กฐ์ ๋ง์ถฐ ๊ตฌํ
- ๊ตฌํ ๊ณผ์ ์์ ๊ณตํต ํจํด๊ณผ ์ ์ฑ ์ ๋ฆฌ
์ด ๊ณผ์ ์ ํตํด ๋จ์ ๋ง์ด๊ทธ๋ ์ด์ ์ด ์๋๋ผ, ์ ํ๋ก์ ํธ ๊ธฐ์ค์ ๋ง๋ ๊ตฌ์กฐ์ ๊ฐ๋ฐ ๋ฌธํ๋ฅผ ํจ๊ป ์ ๋ฆฝํ ์ ์์์ต๋๋ค.
3. ๊ตฌ์ฒด์ ์ผ๋ก ๊ฐ์ ํ ๋ถ๋ถ๋ค
์ ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ฉด์, ๊ธฐ์กด์ ๊ฐ์ ํ๊ณ ์ถ์๋ ๋ถ๋ถ๋ค๋ ํจ๊ป ์ ๋ฆฌํ์ต๋๋ค.
3.1 useRouter ํธํ ๋ ์ด์ด ๊ตฌ์ฑ + safeBack() ์ถ๊ฐ
๊ธฐ์กด Pages Router์ ์ฌ์ฉ ํจํด์ ์ต๋ํ ์ ์งํ๋, ์ ํ๋ก์ ํธ์์๋ safeBack() ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ต๋๋ค.
safeBack()ย โ SNS, ์ธ๋ถ ๋ธ๋ผ์ฐ์ ๋ฑ์์ ์ง์ ์ ์ ๋ ์ฌ์ฉ์๊ฐ ๋ค๋ก๊ฐ๊ธฐ ์ ์์์น ๋ชปํ ์ธ๋ถ ํ์ด์ง๋ก ์ด๋ํ์ง ์๋๋ก ์ฒ๋ฆฌ
safeBack() {
const prevPath = sessionStorage.getItem(StorageKey.prevPath);
if (prevPath) {
sessionStorage.removeItem(StorageKey.prevPath);
appRouter.back();
} else {
appRouter.push(withLocale(Path.Home));
}
}
์ผ๋ฐ์ ์ธ router.back()์ ์ด์ ํ์คํ ๋ฆฌ๊ฐ ์์ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋์์ ์์กดํ๊ธฐ ๋๋ฌธ์, ์ธ๋ถ ์ ์
์ฌ์ฉ์๊ฐ ์๋น์ค ๋ฐ๊นฅ์ผ๋ก ์ด๋ํ๊ฑฐ๋ ๋น ํ๋ฉด์ ๋ง์ฃผํ๋ UX ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์์ต๋๋ค.
๊ทธ๋์ ๋ด๋ถ ์ด๋ ์ด๋ ฅ์ด ์๋ ๊ฒฝ์ฐ ๋ฉ์ธ ํ์ด์ง๋ก ์์ ํ๊ฒ ์ด๋์ํค๋ ๋ฐฉ์์ผ๋ก ๋ณด์ํ์ต๋๋ค.
๋ํ ๊ธฐ์กด ์ฝ๋์ ๋ผ์ฐํฐ ์ฌ์ฉ ๋ฐฉ์์ ์ ์งํ๊ธฐ ๋๋ฌธ์, ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์ ์์ ๋๊ท๋ชจ ์์ ์์ด ์ ์ง์ ์ผ๋ก App Router ๊ตฌ์กฐ์ ์ ์ํ ์ ์์์ต๋๋ค.
3.2 Server / Client Component ๊ฒฝ๊ณ ๋ช ํํ
๊ธฐ์กด ํ๋ก์ ํธ์์๋ ๋๋ถ๋ถ์ ์ปดํฌ๋ํธ๊ฐ ํด๋ผ์ด์ธํธ ๊ธฐ๋ฐ์ด์์ง๋ง, ์ ํ๋ก์ ํธ์์๋ Server Component๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ ๊ท์น์ ์ ๋ฆฝํ์ต๋๋ค.
app/[M]/order/
โโโ page.tsx # Server Component
โโโ OrderClientPage.tsx # Client Component
// page.tsx โ Server Component ('use client' ์์)
const OrderPage = async () => {
return (
<SigninRequiredGuard>
<OrderClientPage />
</SigninRequiredGuard>
);
};
// OrderClientPage.tsx โ Client Component
'use client';
const OrderClientPage: FC = () => {
const { data } = useGetOrderInfo();
return (...);
};
๋ค๋ง ํ์ฌ ๊ตฌ์กฐ์์๋ Server Component์์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ํ์นญํ์ง ์๊ธฐ ๋๋ฌธ์, ์๋ฒ ๋ ๋๋ง์ ํต์ฌ ์ด์ ์ ์ถฉ๋ถํ ํ์ฉํ๊ณ ์๋ค๊ณ ๋ณด๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ๊ธฐ์กด fromm store์ TanStack Query ๊ธฐ๋ฐ ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ ํ์นญ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ฉด์ App Router ์์ ์์ ์ ์ผ๋ก ์ฌ๋ฆฌ๋ ๊ฒ์ด ์ด๋ฒ ํ๋ก์ ํธ์ ์ฐ์ ๋ชฉํ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์๋ฒ ์ฌ์ด๋ ๋ฐ์ดํฐ ํ์นญ ํ์ฉ์ ์ดํ ๊ฐ์ ๊ณผ์ ๋ก ๋จ์ ์์ต๋๋ค.
3.3 z-index ํ ํฐ ์ฒด๊ณ ๊ฐ์
๊ธฐ์กด ํ๋ก์ ํธ์์๋ z-index๋ฅผ modalZIndex๋ผ๋ ๋จ์ผ ๊ธฐ์ค๊ฐ์ ๋๊ณ , ํ์์ ๋ฐ๋ผ CSS ๋ณ์์ ๋ํ๊ฑฐ๋ ๋นผ๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๊ณ ์์์ต๋๋ค.
// ๊ธฐ์กด ํ๋ก์ ํธ: ๋จ์ผ ๊ธฐ์ค๊ฐ ์ ์
zIndex: {
modalZIndex: { value: 10 }
}
// ์ฌ์ฉ์ฒ์์ ๊ธฐ์ค๊ฐ์ ๋ํ๊ฑฐ๋ ๋นผ์ ๋ ์ด์ด ์กฐ์
zIndex: 'calc(var(--z-index-modal-z-index) + 2)' // ๋๋กญ๋ค์ด
zIndex: 'calc(var(--z-index-modal-z-index) + 10)' // ๋๋กญ๋ค์ด ๋ชฉ๋ก
ํ๋์ ๊ธฐ์ค๊ฐ์ ์์กดํ๋ค ๋ณด๋ +2, +10 ๊ฐ์ ๋งค์ง ๋๋ฒ๊ฐ ๊ณณ๊ณณ์ ์๊ฒผ๊ณ , ๋ ์ด์ด ๊ฐ ์ฐ์ ์์๋ฅผ ํ๋์ ํ์
ํ๊ธฐ ์ด๋ ค์ ์ต๋๋ค.
ํด๊ฒฐ: ์ญํ ๋ณ ํ ํฐ ๋ถ๋ฆฌ
์ ํ๋ก์ ํธ์์๋ ๊ฐ ๋ ์ด์ด์ ์ญํ ์ ๋ง๋ ํ ํฐ์ ๊ฐ๋ณ ์ ์ํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
tokens: {
zIndex: {
local: { value: 1 }, // ๋ฐฐ๋ ์ปจํธ๋กค, ์บ๋ฌ์
์ธ๋์ผ์ดํฐ
backdrop: { value: 9 }, // ํค๋, ๋ชจ๋ฌ ๋ฐฑ๋๋กญ
modalZIndex: { value: 10 }, // ๋ชจ๋ฌ, ๋ค์ด์ผ๋ก๊ทธ
overlay: { value: 11 }, // ๋ชจ๋ฌ ์ ์ค๋ฒ๋ ์ด (๊ฒ์์ฐฝ ๋ฑ)
loading: { value: 20 } // ๋ก๋ฉ ์คํผ๋
}
}
// Before: ๋งค์ง ๋๋ฒ ์์กด
zIndex: 'calc(var(--z-index-modal-z-index) + 2)'
// After: ์๋ฏธ ๊ธฐ๋ฐ ํ ํฐ
zIndex: 'overlay'
local(1) < backdrop(9) < modal(10) < overlay(11) < loading(20) ์ฒด๊ณ๋ก ์ ๋ฆฌ๋๋ฉด์, ์ซ์๊ฐ ์๋ ๋ ์ด์ด ์ญํ ๊ธฐ์ค์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ๋์๊ณ , ์คํ์ผ ์ถฉ๋๊ณผ ์ฐ์ ์์ ํผ๋์ด ํฌ๊ฒ ์ค์ด๋ค์์ต๋๋ค.
3.4 _app.tsx ์ญํ ๋ถ๋ฆฌ
๊ธฐ์กด _app.tsx๋ ์๋ฒ ๋ก์ง๊ณผ ํด๋ผ์ด์ธํธ ๋ก์ง์ด ํผ์ฌ๋์ด ์์์ต๋๋ค. ์ ํ๋ก์ ํธ์์๋ ์ด๋ฅผ layout.tsx์ providers.tsx๋ก ๋ถ๋ฆฌํ์ต๋๋ค.
// layout.tsx โ Server Component
const RootLayout = ({ children }: { children: ReactNode }) => {
const locale = getLang();
const currency = getCurrency();
const messages = messagesMap[locale] ?? messagesMap.ko;
setApiHeaders({ lang: locale, currency });
return (
<html lang={locale}>
<body>
<Providers locale={locale} messages={messages} currency={currency}>
{children}
</Providers>
</body>
</html>
);
};
// providers.tsx โ Client Component
'use client';
const Providers = ({ children, locale, messages, currency }: Props) => {
const [queryClient] = useState(() => new QueryClient({ ... }));
return (
<NextIntlClientProvider locale={locale} messages={messages}>
<JotaiProvider>
<QueryClientProvider client={queryClient}>
<InitHeaders locale={locale} currency={currency}>
<ErrorBoundary>
<CustomApp>
<AuthReadyGate>{children}</AuthReadyGate>
</CustomApp>
</ErrorBoundary>
</InitHeaders>
</QueryClientProvider>
</JotaiProvider>
</NextIntlClientProvider>
);
};
๊ฐ์ ํฌ์ธํธ
- ์๋ฒ/ํด๋ผ์ด์ธํธ ์ฑ ์ ๋ช ํ ๋ถ๋ฆฌ
- Provider ์ด๊ธฐํ ์ฑ ์ ์ง์ค
AuthReadyGate๋ฅผ ํตํ ์ธ์ฆ ์ค๋น ์ ๋ก๋ฉ ์ฒ๋ฆฌ๋ก ํ๋ฉด ๊น๋นก์ ๊ฐ์
3.5 Panda CSS: breakpoints vs conditions ์ ๋ฆฌ
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์คํ์ผ ์์คํ ์์๋ ํผ๋ ์์๊ฐ ๋ฐ๊ฒฌ๋์์ต๋๋ค.
breakpoints์ conditions๋ฅผ ๋์์ ์ฌ์ฉํ๊ณ ์์๋ค๋ ์ ์
๋๋ค.
๋ฌธ์ ์ํฉ
breakpoints: {
tablet: '760px',
pc: '1000px'
}
conditions: {
tablet: '@media (min-width: 760px) and (max-width: 999px)',
pc: '@media (min-width: 1000px)'
}
์ด๋ฆ์ ๊ฐ์ง๋ง ์ค์ ์๋ฏธ๊ฐ ๋ฌ๋์ต๋๋ค.
| ๊ตฌ๋ถ | breakpoints | conditions |
|---|---|---|
| ๋ฐฉ์ | ๋ชจ๋ฐ์ผ ํผ์คํธ (min-widthย ๋์ ) | ์ปค์คํ ๋ฒ์ ์ง์ |
| ์ฌ์ฉ ํํ | { base, tablet, pc } | { _tablet, _pc } |
| tablet ์๋ฏธ | 760pxย ์ด์ ์ ์ฒด | 760px ~ 999pxย ํ์ |
๊ฐ์ tablet์ด๋ผ๋ ์ด๋ฆ์ด ๋งฅ๋ฝ์ ๋ฐ๋ผ ์ ํ ๋ค๋ฅธ ๋ฒ์๋ก ๋์ํ๊ณ ์์์ต๋๋ค.
์ต์ข ๋ฐฉํฅ
์ฌ๋ฌ ๋ฐฉ์์ ๊ฒํ ํ ๋์, conditions๋ฅผ ์ ๊ฑฐํ๊ณ breakpoints ์ค์ฌ์ผ๋ก ํต์ผํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
์ด์ :
- ๋ชจ๋ฐ์ผ ํผ์คํธ ์ ๋ต์ ์ผ๊ด์ฑ ํ๋ณด
- Panda CSS ๊ธฐ๋ณธ ์ฒ ํ๊ณผ ๋ถํฉ
- ํ ๋ด ํผ๋ ๊ฐ์
- ๋ฐ์ํ ์คํ์ผ ํจํด ๋จ์ํ
์ด๊ธฐ์๋ ๋ง์ด๊ทธ๋ ์ด์ ๋น์ฉ์ด ์์์ง๋ง, ์ฅ๊ธฐ์ ์ผ๋ก๋ ์ ์ง๋ณด์์ฑ๊ณผ ์์ธก ๊ฐ๋ฅ์ฑ์ด ๋ ์ค์ํ๋ค๊ณ ํ๋จํ์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
์ด๋ฒ ํ๋ก์ ํธ๋ ๋จ์ํ Pages Router์์ App Router๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ์์ ์ด ์๋์์ต๋๋ค. ๊ธฐ์กด ๋ ๊ฑฐ์๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ ๊ฒ์ธ์ง, ๊ทธ๋ฆฌ๊ณ ์๋ก์ด ๊ตฌ์กฐ๋ฅผ ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ค๊ณํ ๊ฒ์ธ์ง์ ๋ํ ๊ณ ๋ฏผ์ ๋ ๊ฐ๊น์ ์ต๋๋ค.
ํ๋ก์ ํธ ํ๋ฐ์๋ ์๋ฒ/ํด๋ผ์ด์ธํธ ์ญํ ๋ถ๋ฆฌ, ๋ผ์ฐํ ๊ท์น, ์คํ์ผ ํ ํฐ ์ ์ฑ ๋ฑ์ด ์๋ฆฌ ์ก์ผ๋ฉด์ ์ดํ ๊ธฐ๋ฅ ๊ฐ๋ฐ์์๋ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์๋ ๊ธฐ๋ฐ์ด ๋ง๋ จ๋์์ต๋๋ค.
App Router ํ๊ฒฝ์์๋ Server Component, Client Component, ๋ผ์ฐํ , ๋ ์ด์์, ์คํ์ผ ์์คํ ์ด ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์๊ธฐ ๋๋ฌธ์, ์ด๊ธฐ ์ํคํ ์ฒ์ ์ปจ๋ฒค์ ์ค๊ณ๊ฐ ํ๋ก์ ํธ ์ ์ฒด์ ์์ฐ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ํฐ ์ํฅ์ ์ค๋๋ค.
์ ํ๋ก์ ํธ๋ฅผ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํด์ผ ํ๋ ์ํฉ์ด๋ผ๋ฉด, ๊ธฐ๋ฅ ๊ตฌํ๋ง ์ฐ์ ํ๊ธฐ๋ณด๋ค ํ๋ก์ ํธ ๊ตฌ์กฐ์ ๊ฐ๋ฐ ๊ธฐ์ค์ ๋จผ์ ์ ๋ฆฌํ๋ ์ ๊ทผ๋ ์ถฉ๋ถํ ๊ฐ์น ์๋ ์ ํ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฌํฉ๋๋ค.