๋ณธ ๊ธ์ ํจ์คํธ์บ ํผ์ค โ Next.js ์ค๋ฌด ๊ฐ์ ์ค Part 8. Next.js 13์ผ๋ก ์๋ฐ ์์ฝ ํ๋ซํผ ๋ง๋ค๊ธฐ๋ฅผ ์๊ฐํ๋ฉฐ ํ์ตํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ฒ์ ๋๋ค. ๐๐ป
์๋ฐ ์์ฝ ํ๋ซํผ์ ์ง์ ๊ตฌ์ถํ๋ฉฐ Next.js 13์ App Router ๊ธฐ๋ฐ ๊ตฌ์กฐ,SSR/ISR/CSR ๋ฑ ๋ค์ํ ๋ ๋๋ง ๋ฐฉ์, React Query, Prisma, Supabase ๋ฑ์ ๊ธฐ์ ์ ์ค๋ฌด ํ๋ฆ์ ๋ง๊ฒ ์ ์ฉํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๋ค.
์ฌ์ฉ์ ๊ด์ ์์ ํ๋ซํผ์ด ์ ๊ณตํด์ผํ๋ ๊ธฐ๋ฅ์ ์ ์ํ๊ณ , ๊ธฐ์ ์ ์ผ๋ก ์ด๋ค ์ฑ๋ฅ ๊ธฐ์ค๊ณผ ์ ๋ต์ด ํ์ํ์ง๋ฅผ ๋์ถํด๋ณผ ์ ์๋ค.
์ฃผ์ ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ
- ๋ฉ์ธ ํ์ด์ง: ์ ์ฒด ์์ ๋ฆฌ์คํธ ๋ ธ์ถ, ๋ฌดํ ์คํฌ๋กค, ํํฐ๋ง ๊ธฐ๋ฅ
- ์์ธ ํ์ด์ง: ์์ ์์ธ ์ ๋ณด, ๋ฉ์ธ ํํฐ ์ ์ง
- ์ง๋ ํ์ด์ง: ์นด์นด์ค ์ง๋ ์ฐ๋, ๋ง์ปค ๊ธฐ๋ฐ ์์ ํ์
- ์ธ์ฆ: SNS ๊ฐํธ ๋ก๊ทธ์ธ, ์ ๊ทผ ๊ถํ ์ ์ด
- ์์ฝ/๊ฒฐ์ : ์์ ์์ฝ/์ทจ์, ํ ์คํ์ด๋จผ์ธ ๊ฒฐ์ ์ฐ๋
- ๊ฒ์: ์์ ๋ฑ๋ก/์กฐํ ์ ๊ฒ์ ๋ฐ ํํฐ ๊ธฐ๋ฅ ์ ๊ณต
์ฑ๋ฅ ๋ฐ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ
- ๋ ๋๋ง ์ฑ๋ฅ ๋ถ์: Lighthouse ๊ธฐ์ค ๋ถ์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๊ธฐ ํ์ธ (@next/bundle-analyzer)
- ํ์ด์ง ๋ ๋๋ง ์ต์ ํ: SSR/CSR/ISR ์ ๋ต ์๋ฆฝ
- ํ ์คํธ: Cypress๋ฅผ ํ์ฉํ E2E ํ ์คํธ ์์ฑ
- ์ฌ์ฉ์ ํ๋ ๋ถ์: Google Analytics, SEO ์ต์ ํ ๋๊ตฌ ํ์ฉ
๊ธฐ๋ฅ, ์ฑ๋ฅ ๋ฐ ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ์ฌ์ฉ์ ์ค์ฌ์ ์คํ ๋ฆฌ๋ก ์ฌ๊ตฌ์ฑํ๊ณ , ๊ฐ ์๊ตฌ์ ๋ง๋ ๊ธฐ์ ์ ๋์ ๋ฐฉ์์ ์ค๊ณ๋ฅผ ํด๋ณผ ์ ์๋ค.
์ ์ ์คํ ๋ฆฌ | ๊ธฐ๋ฅ ์ค๊ณ |
---|---|
์ฌ์ฉ์๊ฐ ์คํฌ๋กค์ ๋ด๋ฆด ๋ ์์๊ฐ ์ถ๊ฐ๋ก ๋ก๋๋๋ค | React Query useInfiniteQuery ํ์ฉํ ๋ฌดํ ์คํฌ๋กค (CSR ๊ธฐ๋ฐ) |
ํ์ด์ง ๋ ๋๋ง์ด ๋น ๋ฅด๊ณ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๊ธฐ๊ฐ ์ ๋นํ์ง ๋ถ์ํ๋ค. | Lighthouse์ ์ฌ์ฉ์ ๊ธฐ์ค์ ์ฑ๋ฅ ์ธก์ ๊ธฐ์ค์ ๋ฐ๋ผ ์ฑ๋ฅ ์ธก์ , @next/bundle-analyzer๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌ๊ธฐ๋ฅผ ๋ถ์ |
์์ธ ํ์ด์ง ์ง์ ์ ์ด์ ํํฐ๊ฐ ์ ์ง๋๋ค. | Recoil์ ํ์ฉํ ์ ์ญ ์ํ ๊ด๋ฆฌ ์ต์ ํ |
Next.js13์ ๋ค์ํ ์ฑ๋ฅ ๊ฐ์ ๋ฐฉ๋ฒ์ ์ด์ฉํด์ ๊ฐ ํ์ด์ง๋ณ ๋ ๋๋ง ๋ฐฉ์์ ์ต์ ํํ๋ค. | CSR, ISR, SSR, SSG ๋ฑ ๊ฐ ๋ ๋๋ง ๋ฐฉ์์ ํน์ง์ ์์๋ณด๊ณ , ํ์ด์ง๋ณ๋ก ๊ฐ์ฅ ์ต์ ํ๋ ๋ ๋๋ง ๋ฐฉ์์ ์ ์ฉ |
์์ฝ ๋ฐ ๊ฒฐ์ ๋ ๋งค ์์ฒญ๋ง๋ค ์ ํํ ์ ๋ณด๊ฐ ํ์ํ๋ค | SSR์ ํตํด ์ค์๊ฐ ๋ฐ์ดํฐ ๋ฐ์ |
ํด๋น ๋ค์ด์ด๊ทธ๋จ์ ์๋ฐ ์์ฝ ์๋น์ค์ ์ ๋ฐ์ ์ธ ์ฌ์ฉ์ ํ๋ ํ๋ฆ์ ๋ฐ๋ผ ์์คํ ์ด ์ด๋ป๊ฒ ๋ฐ์ํ๋์ง๋ฅผ ์๊ฐํํ ๊ฒ์ด๋ค.์ฌ์ฉ์์ ์ก์ (๋ก๊ทธ์ธ, ์์ ์ ํ, ๊ฒฐ์ ๋ฑ)์ ๋ฐ๋ผ ์ด๋ค ํ์ด์ง๊ฐ ๋ ๋๋ง๋๊ณ ์ด๋ค ๊ธฐ๋ฅ(API ํธ์ถ, ์ธ์ฆ ์ฒ๋ฆฌ ๋ฑ)์ด ์ํ๋๋์ง๋ฅผ ํ๋ก์ฐ ์ฐจํธ ํํ๋ก ํ๋์ ํ์ ํ ์ ์๋ค.
๐ง ์๊ตฌ์ฌํญ ๋ถ์ ๋จ๊ณ์์ ์ฌ์ฉ์ ํ๋ฆ์ ์๊ฐ์ ์ผ๋ก ์ ๋ฆฌํด๋๋ฉด ๊ธฐ๋ฅ๋ณ ํ๋ฉด ๊ตฌ์ฑ๊ณผ ํ์ด์ง ๊ฐ ์ญํ ์ ๋ช ํํ ์ดํดํ ์ ์๊ณ , ๋ ๋๋ง ๋ฐฉ์์ด๋ ์ํ ๊ด๋ฆฌ ์ ๋ต์ ์ค๊ณํ๋ ๋ฐ ๊ธฐ์ค์ด ๋ ์ ์์ ๊ฑฐ ๊ฐ๋ค
app/
(home)/ // ํ ํ์ด์ง ๋ผ์ฐํธ ๊ทธ๋ฃน
api/ // Route Handlers (Next.js 13 API ์๋ํฌ์ธํธ)
layout.tsx // ๊ณตํต ๋ ์ด์์
global-error.tsx // ์ ์ฒด ์๋ฌ ์ฒ๋ฆฌ
not-found.tsx // 404 ํ์ด์ง
providers.tsx // ์ ์ญ Provider ์ค์
components/ // ๊ณตํต UI ์ปดํฌ๋ํธ
hooks/ // ์ปค์คํ
ํ
(ex. useIntersectionObserver)
interface/ // TypeScript ํ์
/์ธํฐํ์ด์ค ์ ์
constants/ // ์์
atom/ // Recoil ์ํ ๊ด๋ฆฌ
utils/ // ์ ํธ๋ฆฌํฐ ํจ์
db/ // Prisma ํด๋ผ์ด์ธํธ ์ ์
๊ฐ ํ์ด์ง์ ๊ธฐ๋ฅ, ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฃผ๊ธฐ, SEO ์๊ตฌ์ฌํญ ๋ฑ์ ๋ฐ๋ผ ๊ฐ์ฅ ์ ํฉํ ๋ ๋๋ง ๋ฐฉ์์ ์ ํํด ์ ์ฉํ๋ค. Next.js 13์์๋ SSG, SSR, ISR, CSR์ ํผํฉ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ํ์ด์ง์ ๋ชฉ์ ๊ณผ ๋ฐ์ดํฐ์ ํน์ฑ์ ๊ณ ๋ คํ ์ ๋ต์ ์ธ ๋ ๋๋ง ๋ฐฉ์ ๊ตฌ์ฑ์ด ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ์ค๋ค.
- SSG (Static Site Generation)
๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋น๋๊ฐ ๋ฎ๊ณ , ๋น ๋ฅธ ์ด๊ธฐ ๋ก๋ฉ ๋ฐ SEO๊ฐ ์ค์ํ ํ์ด์ง์ ์ฌ์ฉ (ex. ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ์ ์ ์ฝํ ์ธ ์ธ FAQ ํ์ด์ง)- SSR (Server-Side Rendering)
ํ์ด์ง ์ ๊ทผ ์๋ง๋ค ์ต์ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ฌ์ฉ. ์๋ฒ์์ HTML์ ๋์ ์ผ๋ก ๋ ๋๋ง
(ex. ์์ฝ ํ๋ก์ธ์ค์ ๊ฐ์ด ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ผ ๋ฐ์ดํฐ๊ฐ ์ค์๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋๋ ์๋ฐ ์์ฝํ๊ธฐ ํ์ด์ง)- ISR (Incremental Static Regeneration)
์ ์ ํ์ด์ง ๊ธฐ๋ฐ์ด์ง๋ง, ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ์๋ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ํฉ (ex. ์์ ์์ธ ํ์ด์ง์ฒ๋ผ ๋ณ๊ฒฝ์ ๋๋ฌผ์ง๋ง ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์ฝํ ์ธ )- CSR (Client-Side Rendering)
ํด๋ผ์ด์ธํธ์์ JavaScript๋ก ํ์ด์ง๋ฅผ ๋์ ์ผ๋ก ๋ ๋๋ง. ์ด๊ธฐ ๋ก๋ฉ ์ดํ ์ฌ์ฉ์ ์ํธ์์ฉ ์ค์ฌ์ ํ์ด์ง์ ์ ํฉ (ex. ๊ฒฐ์ ํ์ด์ง, ๋ฌดํ ์คํฌ๋กค์ด ์ ์ฉ๋ ๋ฆฌ์คํธ, ๋ก๊ทธ์ธ ๊ธฐ๋ฐ ๋ง์ดํ์ด์ง ๋ฑ)
์คํค๋ง ๋ค์ด์ด๊ทธ๋จ์ ํตํด ์ฃผ์ ๋๋ฉ์ธ ๋ชจ๋ธ ๊ฐ์ ๊ด๊ณ๋ฅผ ํ์ ํ ์ ์๋ค. ์ฌ์ฉ์(User)๋ ์ฌ๋ฌ ๊ฐ์ ์์(Room)๋ฅผ ์์ ํ ์ ์์ผ๋ฉฐ, ๊ฐ ์์์๋ ์ข์์(Like)์ ๋๊ธ(Comment)์ด ์ฐ๊ฒฐ๋๋ค. ๋๊ธ์ ์์ฑ ์์ , ๋ด์ฉ ๋ฑ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ๋ค์ํ ์์ฑ์ ๊ฐ์ง ์ ์๋๋ก ์ค๊ณํ๋ค.
๋ค์์ ์์(Room)์ ๋ํ CRUD ์์
์ ์ํํ๊ธฐ ์ํ API ์๋ํฌ์ธํธ ์ค๊ณ์ด๋ค. Next.js 13์ Route Handler ๊ธฐ๋ฅ์ ํตํด /app/api/rooms/route.ts
์ ๊ฐ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ Prisma Client๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์ ์ฐ๋ํด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์์ ์ด๋ค.
- ์์ ๋ฑ๋ก POST
/api/rooms
- ์์ ๋ชฉ๋ก ์กฐํ GET
/api/rooms
- ์์ ์์ธ ์กฐํ GET
/api/rooms?id={id}
- ์์ ์์ PATCH
/api/rooms?id={id}
- ์์ ์ญ์ DELETE
/api/rooms?id={id}
์ด๋ฒ ํ๋ก์ ํธ์์ ์ฌ์ฉํ ๊ธฐ์ ์ ์ฃผ์ ํน์ง์ ์์ ๋ณด์
Next.js 13 ์ฃผ์ ์ ๋ฐ์ดํธ ์ฌํญ (2022๋ 10์ 25์ผ Next.js Conf ์์ Next.js 13 ๊ณต์ ๋ฐํ)
- App Router ๋์ (/app ๋๋ ํฐ๋ฆฌ) ๊ธฐ์กด Pages ๋ผ์ฐํ ๋์ , ๋ ์ ์ฐํ ๋ผ์ฐํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณต (๋ ์ด์์ ๊ด๋ฆฌ, ์๋ฒ ์ปดํฌ๋ํธ, ์คํธ๋ฆฌ๋ฐ UI ๊ตฌ์ฑ ๊ฐ๋ฅ)
Route Handlers
/app/api/route.ts
ํ์ผ์์GET
,POST
๋ฑ ๋ฉ์๋๋ฅผ ์ง์ ์ ์ํ์ฌ API ๋ก์ง ๊ตฌํ ๊ฐ๋ฅ- Turbopack Rust ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ ์๋ก์ด ๋ฒ๋ค๋ฌ(Webpack๋ณด๋ค ํจ์ฌ ๋น ๋ฆ)
- next/image ๊ฐ์ ๋ธ๋ผ์ฐ์ ์ lazy loading์ ํ์ฉํด ์ด๋ฏธ์ง ๋ก๋ฉ ์๋ ํฅ์
- @next/font ๋์ ํฐํธ๋ฅผ ์ง์ ํธ์คํ ํ์ฌ FOUT(๋ ์ด์์ ๊นจ์ง) ์์ด ์์ ์ ์ธ ๊ธ๊ผด ๋ก๋ฉ ๊ฐ๋ฅ
- next/link ๊ฐ์
<a>
ํ๊ทธ๋ฅผ ์๋์ผ๋ก ํฌํจ์์ผ ๋ ๊ฐ๋จํ๊ฒ ๋งํฌ ๊ตฌ์ฑ ๊ฐ๋ฅ
์ฃผ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ซํผ
Prisma
ํ์
์์ ์ฑ๊ณผ ์์ฐ์ฑ์ ๊ฒธ๋นํ ํ๋์ ์ธ ORM ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ์ ์, ๋ง์ด๊ทธ๋ ์ด์
, ํ์
๊ธฐ๋ฐ ์ฟผ๋ฆฌ ์์ฑ์ ํตํด ์์ ์ ์ธ ๋ฐ์ดํฐ ์ฐ๋์ ์ง์
TailwindCSS
์ ํธ๋ฆฌํฐ ํผ์คํธ CSS ํ๋ ์์ํฌ๋ก ํด๋์ค ๊ธฐ๋ฐ์ผ๋ก ๋น ๋ฅด๊ณ ์ผ๊ด๋ ์คํ์ผ๋ง์ด ๊ฐ๋ฅํ๋ฉฐ ๋ฐ์ํ UI ๊ตฌํ์ ์ ๋ฆฌ
Reocil
Facebook์์ ๊ฐ๋ฐํ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ณต์กํ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌ์กฐํํ๊ณ ์ปดํฌ๋ํธ ๊ฐ ์ํ ๊ณต์ ๋ฅผ ๋จ์ํ๊ฒ ๊ด๋ฆฌ ๊ฐ๋ฅ
React Query (TanStack Query)
์๋ฒ ์ํ๋ฅผ ํด๋ผ์ด์ธํธ์์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฐ์ดํฐ ํ์นญ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์๋ ์บ์ฑ, ๋ฆฌํ์นญ, ์๋ฌ ํธ๋ค๋ง ๋ฑ์ ์ ๊ณตํ์ฌ API ํต์ ํ๋ฆ์ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์์
Cypress
E2E ํ
์คํธ ๋๊ตฌ๋ก ์ค์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์ฌ์ฉ์์ ํ๋์ ์๋ฎฌ๋ ์ด์
ํ๋ฉฐ ์ฃผ์ ๊ธฐ๋ฅ ํ๋ฆ์ ํ
์คํธ ์ฝ๋๋ก ๊ฒ์ฆ ๊ฐ๋ฅ
Vercel
Next.js ๊ณต์ ํธ์คํ
ํ๋ซํผ์ผ๋ก GitHub ์ฐ๋ ๋ฐ ์๋ ๋ฐฐํฌ, ์๋ฒ๋ฆฌ์ค ํจ์ ์ง์ ๋ฑ ๋น ๋ฅธ ๊ฐ๋ฐ๊ณผ ๋ฐฐํฌ ์ํฌํ๋ก์ฐ์ ์ต์ ํ
ESLint์ Prettier๋ฅผ ํจ๊ป ์ค์ ํ๋ฉด ํ ๋ด ์ฝ๋ ์คํ์ผ์ ํต์ผํ๊ณ ์ฌ์ํ ํฌ๋งทํ ์ฐจ์ด๋ก ์ธํ ๋ฆฌ๋ทฐ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์์ด ํ์ ํจ์จ์ ํฌ๊ฒ ๊ธฐ์ฌํ๋ค.
ESLint: ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋์ ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ๊ฒ์ถํ๊ณ ์ ํด์ง ์ฝ๋ ์คํ์ผ ๊ฐ์ด๋๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํ ์ ์ ๋ถ์ ๋๊ตฌ
Prettier: ์ฝ๋ ํฌ๋งทํ ์ ์๋์ผ๋ก ์ผ๊ด๋๊ฒ ์ ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ
{
"extends": ["next/core-web-vitals", "plugin:prettier/recommended"],
"plugins": ["prettier"],
"rules": {
"prettier/prettier": "error",
"react-hooks/rules-of-hooks": "warn",
"react/display-name": "warn"
}
}
next/core-web-vitals
Next.js์ ๊ณต์ ESLint ์ค์ ์ผ๋ก, Core Web Vitals ๊ธฐ์ค์ ์ฑ๋ฅ ๊ด๋ จ ๊ท์น๋ ํฌํจplugin:prettier/recommended
Prettier์ ESLint๋ฅผ ์ฐ๋ํ์ฌ ์ถฉ๋ ์์ด ์คํ์ผ ๊ฒ์ฌ๋ฅผ ์ํํ๋๋ก ์ค์ (์ฝ๋ ํฌ๋งทํ ์ค๋ฅ๊ฐ ESLint ์ค๋ฅ๋ก ์ฒ๋ฆฌ๋จ)prettier/prettier: error
Prettier ํฌ๋งท์ ๋ง์ง ์๋ ์ฝ๋๋ฅผ ESLint ์๋ฌ๋ก ๊ฐ์ฃผํ์ฌ ๋น๋๋ ์ปค๋ฐ ์ฐจ๋จ ๊ฐ๋ฅreact-hooks/rules-of-hooks: warn
React Hooks๋ ์กฐ๊ฑด๋ฌธ, ๋ฐ๋ณต๋ฌธ ๋ฑ์์ ํธ์ถํ ์ ์์ผ๋ฉฐ ํญ์ ์ต์์์์ ํธ์ถํด์ผ ํจ์ ๊ฒ์ฌreact/display-name: warn
์ต๋ช ์ปดํฌ๋ํธ์ displayName์ด ์์ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ํ์ฌ ๋๋ฒ๊น ํธ์์ฑ์ ํ๋ณดํจ
Supabase๋ ์คํ ์์ค ๊ธฐ๋ฐ์ ๋ฐฑ์๋ ํ๋ซํผ์ผ๋ก PostgreSQL์ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ธ์ฆ ์์คํ
, ์คํ ๋ฆฌ์ง, ์ค์๊ฐ ์น์์ผ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๋ณต์กํ ๋ฐฑ์๋ ์ธํ๋ผ๋ฅผ ์ง์ ๊ตฌ์ถํ์ง ์๊ณ ๋, ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ ์ค์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ตฌ์ฑํ ์ ์๋๋ก ๋์์ค๋ค.
Prisma๋ Node.js ํ๊ฒฝ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ORM(Object-Relational Mapping) ๋๊ตฌ๋ก,
์ง๊ด์ ์ธ ์คํค๋ง ๋ฌธ๋ฒ๊ณผ ํ์
๊ธฐ๋ฐ ์ฟผ๋ฆฌ ์์ฑ์ ํตํด ์์ฐ์ฑ๊ณผ ์์ ์ฑ์ ๋ชจ๋ ๊ฐ์ถ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํ๋ค.
- Prisma Client: TypeScript ๊ธฐ๋ฐ์ผ๋ก ์์ ํ๊ณ ์๋์์ฑ ๊ฐ๋ฅํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ ํด๋ผ์ด์ธํธ
- Prisma Migrate: DB ๋ง์ด๊ทธ๋ ์ด์ ์ ๊ด๋ฆฌํ๊ณ , ๋ณ๊ฒฝ ์ด๋ ฅ์ ์ฝ๋๋ก ์ถ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๋๊ตฌ
- Prisma Studio: ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ GUI ํ๊ฒฝ์์ ์๊ฐ์ ์ผ๋ก ํ์ธํ๊ณ ํธ์งํ ์ ์๋ ์ธํฐํ์ด์ค
ํ๋ก์ ํธ์ ๋ฐฑ์๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ Supabase์ Prisma๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณํ๋ค. ์ด๊ธฐ ์ํคํ ์ฒ ์ค๊ณ ๋จ๊ณ์์ ์ฌ์ฉ์(User)์ ์์(Room)๋ฅผ ์ค์ฌ์ผ๋ก ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ด๊ณ๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก Prisma ์คํค๋ง๋ฅผ ๊ตฌ์ฑํ๋ค.
Prisma๋ ์ง๊ด์ ์ธ ๋ฌธ๋ฒ์ ํตํด ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์ฝ๋ ๊ธฐ๋ฐ์ผ๋ก ํํํ ์ ์์ด ์คํค๋ง ์ค๊ณ์ ๊ด๋ฆฌ๊ฐ ํจ์จ์ ์ด๋ค. ๐คฉ
๐คช CLI๋ฅผ ํตํด ์คํค๋ง ๋ง์ด๊ทธ๋ ์ด์ ๋ช ๋ น์ ์คํํด ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์์ฑํ์ง๋ง ์ด๊ธฐ ๋ง์ด๊ทธ๋ ์ด์ ๊ณผ์ ์์ ์ถฉ๋ ์ด์๊ฐ ๋ฐ์ํ์ฌ Supabase์ SQL Editor๋ฅผ ์ด์ฉํด ํ ์ด๋ธ์ ์ง์ ์์ฑํ ํ, Prisma ์คํค๋ง์ ๋๊ธฐํํ๋ ๋ฐฉ์์ผ๋ก ์ด๊ธฐ ์ค์ ์ ๋ง๋ฌด๋ฆฌํ๋ค.
Prisma ์คํค๋ง๋ ๋ด๋ถ์ ์ผ๋ก SQL ๋ฌธ์ผ๋ก ๋ณํ๋์ด ๋ง์ด๊ทธ๋ ์ด์ ๋ชจ๋ธ๋ก ์ ์ฅ๋๋ฉฐ ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ด ์์ฑ๋๊ณ ๊ด๋ฆฌ๋๋ค! (์๋๋ Supabase SQL Editor์ ์ง์ ์ ๋ ฅํ ๋ชจ๋ธ ๊ตฌ์ฑ์ด๋ฉฐ ์ค์ ๋ก ํ ์ด๋ธ์ด ์ ์์ ์ผ๋ก ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.)
๐ Prisma์์ ์ ๊ณตํ๋ ์๊ฐํ ๋๊ตฌ์ธ Prisma Studio๋ฅผ ํ์ฉํ๋ฉด ๋ก์ปฌ ํ๊ฒฝ์์๋ ํ ์ด๋ธ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์๋ค. (์๋๋ mock ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ๋ค Studio์์ ํ์ธํ ํ๋ฉด์ด๋ค.)