์๋ก์ด React ์ฑ ๋ง๋ค๊ธฐ
React๋ก ์๋ก์ด ์ฑ์ด๋ ์น์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ ค๋ฉด ํ๋ ์์ํฌ๋ถํฐ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฑ์ ๊ธฐ์กด ํ๋ ์์ํฌ์์ ์ ์ ๊ณต๋์ง ์๋ ์ ์ฝ ์กฐ๊ฑด์ด ์๊ฑฐ๋, ์์ฒด ํ๋ ์์ํฌ๋ฅผ ๋น๋ํ๋ ๊ฒ์ ์ ํธํ๊ฑฐ๋, React ์ฑ์ ๊ธฐ๋ณธ ์ฌํญ๋ง ๋ฐฐ์ฐ๋ ค๋ ๊ฒฝ์ฐ React ์ฑ์ ์ฒ์๋ถํฐ ๋น๋ํ ์ ์์ต๋๋ค.
ํ์คํ ํ๋ ์์ํฌ
์ด๋ฌํ ๊ถ์ฅ ํ๋ ์์ํฌ๋ ํ๋ก๋์ ์์ ์ฑ์ ๋ฐฐํฌํ๊ณ ํ์ฅํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค. ๊ทธ๋ค์ ์ต์ React ๊ธฐ๋ฅ์ ํตํฉํ๊ณ React์ ์ํคํ ์ฒ๋ฅผ ํ์ฉํฉ๋๋ค.
Next.js (์ฑ ๋ผ์ฐํฐ)
Next.js์ ์ฑ ๋ผ์ฐํฐ๋ React์ ์ํคํ ์ฒ๋ฅผ ์ต๋ํ ํ์ฉํ์ฌ ํ ์คํ React ์ฑ์ ํ์ฑํํ๋ React ํ๋ ์์ํฌ์ ๋๋ค.
Next.js๋ Vercel์์ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค. Next.js ์ฑ์ ๋น๋ํด์ Node.js, ๋์ปค ์ปจํ ์ด๋, ์๋ฒ๋ฆฌ์ค ํธ์คํ , ํน์ ์์ฒด ์๋ฒ์ ๋ฐฐํฌํ ์ ์์ต๋๋ค. Next.js๋ ๋ํ ์๋ฒ๊ฐ ํ์์๋ ์ ์ ๋ด๋ณด๋ด๊ธฐ๋ ์ง์ํฉ๋๋ค.
React Router (v7)
React Router๋ React์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฉฐ Vite์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํ์คํ React ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ํ์ค Web API๋ฅผ ๊ฐ์กฐํ๊ณ ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์๊ณผ ํ๋ซํผ์ ์ํ ์ค๋น๋ ๋ฐฐํฌ ํ ํ๋ฆฟ์ด ์์ต๋๋ค.
์๋ก์ด React Router ํ๋ ์์ํฌ๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ธ์.
React Router๋ Shopify์์ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค.
Expo (๋ค์ดํฐ๋ธ ์ฑ์ฉ)
Expo๋ ๋ค์ดํฐ๋ธ UI๋ฅผ ์ฌ์ฉํ์ฌ ์๋๋ก์ด๋, iOS, ์น์ ์ํ ๋ฒ์ฉ์ฑ์ ๋ง๋ค ์ ์๋ React ํ๋ ์์ํฌ์ ๋๋ค. ๋ค์ดํฐ๋ธ ๋ถ๋ถ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ React Native SDK๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ก์ด Expo ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ธ์.
Expo๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, Expo ์์ต์๋ฅผ ์ฐธ์กฐํ์ธ์.
Expo๋ Expo (the company)์์ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค. Expo๋ก ์ฑ์ ๋น๋ํ๋ ๊ฒ์ ๋ฌด๋ฃ์ด๊ณ ๊ตฌ๊ธ์ด๋ ์ ํ ์คํ ์ด์ ์ ํ์์ด ์ ์ถํ ์ ์์ต๋๋ค. Expo๋ ์ถ๊ฐ์ ์ผ๋ก ์ตํธ์ธ ์ ๋ฃ ํด๋ผ์ฐ๋ ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ค๋ฅธ ํ๋ ์์ํฌ
ํ์คํ React ๋น์ ์ ํฅํด ๋์๊ฐ๊ณ ์๋ ๋ ๋ค๋ฅธ ๋ ์ค๋ฅด๋ ํ๋ ์์ํฌ๊ฐ ์์ต๋๋ค.
- TanStack Start (Beta): TanStack Start๋ TanStack Router๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํ์คํ React ํ๋ ์์ํฌ์ ๋๋ค. Nitro๋ Vite์ ๊ฐ์ด ์ ์ฒด ๋ฌธ์ SSR, ์คํธ๋ฆฌ๋ฐ, ์๋ฒ ํจ์, ๋ฒ๋ค๋ง๊ณผ ๋ง์ ์ ์ฉํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- RedwoodJS: Redwood๋ ์ฝ๊ฒ ํ์คํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋๋ก ์ฌ์ ํ์ฌ๋ ํจํค์ง์ ๊ตฌ์ฑ์ ๊ฐ์ง ํ์คํ React ํ๋ ์์ํฌ์ ๋๋ค.
์์ธํ ์ดํด๋ณด๊ธฐ
Next.js์ App Router ๋ฒ๋ค๋ฌ๋ ๊ณต์ React Server Components ๋ช ์ธ๋ฅผ ๋ชจ๋ ๊ตฌํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋น๋ ์๊ฐ, ์๋ฒ ์ ์ฉ ๋ฐ ๋ํํ ๊ตฌ์ฑ ์์๋ฅผ ๋จ์ผ React ํธ๋ฆฌ์ ํผํฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ฒ ์ ์ฉ React ์ปดํฌ๋ํธ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํ์ผ์ ์ฝ๋ ๋น๋๊ธฐ
ํจ์๋ก ์์ฑํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ํํ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
// ์ด ์ปดํฌ๋ํธ๋ *์ค์ง* ์๋ฒ์์๋ง(ํน์ ๋น๋๋๋ ๋์๋ง) ์คํ๋ฉ๋๋ค.
async function Talks({ confId }) {
// 1. ์๋ฒ์์๋ผ๋ฉด ๋ฐ์ดํฐ ๋ ์ด์ด์ ๋ํํ ์ ์์ต๋๋ค. API ์๋ํฌ์ธํธ๋ ํ์ํ์ง ์์ต๋๋ค.
const talks = await db.Talks.findAll({ confId });
// 2. ๋ ๋๋ง ๋ก์ง์ด ์ถ๊ฐ๋๋๋ผ๊ณ ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ํฌ๊ฒ ๋ง๋ค์ง ์์ต๋๋ค.
const videos = talks.map(talk => talk.video);
// 3. ๋ธ๋ผ์ฐ์ ์์ ์คํ๋ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค.
return <SearchableVideoList videos={videos} />;
}
Next.js์ App Router๋ Suspense์ ๋ฐ์ดํฐ ์กฐํ๋ฅผ ํตํฉํฉ๋๋ค. React tree์์ ์๋ก๋ค๋ฅธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ์ ์ผ๋ก ๋ก๋ฉ ์ํ(์: ์ค์ผ๋ ํค ํ๋ ์ด์คํ๋)๋ก ์ง์ ํ ์ ์๊ฒ ํด์ค๋๋ค.
<Suspense fallback={<TalksLoading />}>
<Talks confId={conf.id} />
</Suspense>
์๋ฒ ์ปดํฌ๋ํธ์ Suspense๋ Next.js ๊ธฐ๋ฅ์ด ์๋ React ๊ธฐ๋ฅ์ ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ ์์ํฌ ์์ค์์ ์ด๋ฅผ ์ฑํํ๋ ค๋ฉด ์ฐธ์ฌ์ ์ฌ์ํ์ง ์์ ๊ตฌํ ์์ ์ด ํ์ํฉ๋๋ค. ํ์ฌ Next.js App Router๋ ๊ฐ์ฅ ์๋ฒฝํ ๊ตฌํ์ ๋๋ค. React ํ์ ์ฐจ์ธ๋ ํ๋ ์์ํฌ์์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋ฒ๋ค๋ฌ ๊ฐ๋ฐ์์ ํ๋ ฅํ๊ณ ์์ต๋๋ค.
์ฒ์๋ถํฐ ์์ํ๊ธฐ
์ฑ์ ๊ธฐ์กด ํ๋ ์์ํฌ์์ ์ ์ ๊ณต๋์ง ์๋ ์ ์ฝ ์กฐ๊ฑด์ด ์๊ฑฐ๋, ์์ฒด ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ์ ํธํ๊ฑฐ๋, React ์ฑ์ ๊ธฐ๋ณธ ์ฌํญ์ ๋ฐฐ์ฐ๋ ค๋ ๊ฒฝ์ฐ React ํ๋ก์ ํธ๋ฅผ ์ฒ์๋ถํฐ ์์ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ค๋ฅธ ์ต์ ์ด ์์ต๋๋ค.
์ฒ์๋ถํฐ ์์ํ๋ฉด ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ป์ ์ ์์ง๋ง ๋ผ์ฐํ , ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๊ธฐํ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ํจํด์ ์ฌ์ฉํ ๋๊ตฌ๋ฅผ ์ ํํด์ผ ํฉ๋๋ค. ์ด๋ฏธ ์กด์ฌํ๋ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ ๋์ ์์ ๋ง์ ํ๋ ์์ํฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค. ์ ํฌ๊ฐ ๊ถ์ฅํ๋ ํ๋ ์์ํฌ์๋ ์ด๋ฌํ ๋ฌธ์ ์ ๋ํ ๊ธฐ๋ณธ ์ ๊ณต ์๋ฃจ์ ์ด ์์ต๋๋ค.
์์ ๋ง์ ์๋ฃจ์ ์ ๊ตฌ์ถํ๋ ค๋ฉด, Vite, Parcel ๋๋ RSbuild์ ๊ฐ์ ๋น๋ ๋๊ตฌ๋ก ์์ํ ์ ์๋๋ก ํ๋ ์ฒ์๋ถํฐ React ์ฑ ๋ง๋ค๊ธฐ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ธ์.
๋ง์ฝ ์ด ํ์ด์ง์ ํฌํจ๋๋๋ฐ ๊ด์ฌ์๋ ํ๋ ์์ํฌ ์์ฑ์๋ผ๋ฉด, ์ ํฌ์๊ฒ ์๋ ค์ฃผ์ธ์.