๋๊ตฌ๋ฅผ ์ํ ํ๋ ์์ํฌ์ธ๊ฐ
์์ฐ์ฑ์ ์ค์ํ๋ ๊ฐ๋ฐ์
ํ์ ์์ ์ฑ์ ์ ๋ขฐํ๋ ํ
ํ๋ก ํธ์๋์ ํ์ ํ๋ ๋ฐฑ์๋
๋น ๋ฅธ ํ๋กํ ํ์ดํ์ด ํ์ํ ์คํํธ์
ํต์ฌ ์ฒ ํ: ๋จ์ผ ์ง์ค ๊ณต๊ธ์
Entity ํ๋๋ฅผ ์ ์ํ๋ฉด, ๋๋จธ์ง๋ TypeScript๊ฐ ์์์ ํฉ๋๋ค.๐ฌ Entity ์์ฑ โ Migration ์คํ โ ํ์ /์คํค๋ง/API ์๋ ์์ฑ โ ํ๋ก ํธ์๋ Service ์์ฑ๊น์ง ์ ์ฒด ํ๋ก์ฐ
๋ฐฑ์๋์ ํ๋ก ํธ์๋์ ํ์ ๋๊ธฐํ
์ผ๋ฐ์ ์ผ๋ก ๋ฐฑ์๋ API๋ฅผ ๋ง๋ค๊ณ ํ๋ก ํธ์๋์์ ์ฌ์ฉํ ๋๋ ํ์ ๋๊ธฐํ๊ฐ ์ด๋ ต์ต๋๋ค. Sonamu๋ ๋ฐฑ์๋ ๋ณ๊ฒฝ์ด ์ฆ์ ํ๋ก ํธ์๋์ ๋ฐ์๋์ด ์ปดํ์ผ ํ์์ ์๋ฌ๋ฅผ ๊ฐ์งํฉ๋๋ค.- ์๋ ์์ฑ ์
- Sonamu ๋ฐฉ์

๐ธ Sonamu ๋ฐฉ์์์ ์กด์ฌํ์ง ์๋ ์์ฑ์ ์ ๊ทผํ๋ฉด ์ปดํ์ผ ์๋ฌ ํ์
Fully Type-safe Query Builder: Puri
Sonamu๋ Knex ๊ธฐ๋ฐ์ ํ์ ์์ ํ ์ฟผ๋ฆฌ ๋น๋ Puri๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ ์ด๋ธ๋ช , ์นผ๋ผ๋ช , ๊ด๊ณ๊น์ง ๋ชจ๋ ํ์ ์ฒดํฌ๋ฉ๋๋ค.๐ฌ ํ์: Puri๋ก ํ์ ์์ ํ ์ฟผ๋ฆฌ ์์ฑ - ํ ์ด๋ธ๋ช , ์นผ๋ผ๋ช ์๋์์ฑ
- โ Entity ์ ์์์ ํ์ ์๋ ์ถ์ถ
- โ ํ ์ด๋ธ๋ช , ์นผ๋ผ๋ช , ๊ด๊ณ ๋ชจ๋ ์๋์์ฑ
- โ ์๋ชป๋ ์นผ๋ผ๋ช ์ ์ปดํ์ผ ์๋ฌ
- โ Knex์ ๋ชจ๋ ๊ธฐ๋ฅ ์ง์
Puri ๊ฐ์ด๋
Frontend Integration
๋ฐฑ์๋ API๋ฅผ ์ ์ํ๋ฉด, ํ๋ก ํธ์๋ Service์ TanStack Query Hook์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.๐ฌ ๋ฐฑ์๋ @api ๋ฉ์๋ ์์ฑ โ ํ๋ก ํธ์๋ Service ์๋ ์์ฑ โ useQuery ์ฌ์ฉ
Subset์ผ๋ก ์ต์ ํ
ํ์ํ ํ๋๋ง ์กฐํํ์ฌ ๋คํธ์ํฌ ๋น์ฉ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ๋์ ๋๋ค. ๊ฐ Subset๋ง๋ค ์ ํํ TypeScript ํ์ ์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.SSR
Vite + React ๊ธฐ๋ฐ์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ง์ํฉ๋๋ค.registerSSR๋ก SSRํ ๋ผ์ฐํธ๋ฅผ ๋ฑ๋กํ๊ณ , preload ์ฝ๋ฐฑ์ผ๋ก ์๋ฒ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํฉ๋๋ค.
- โ ๋ฐฑ์๋ ๋ณ๊ฒฝ ์ ์ปดํ์ผ ์๋ฌ๋ก ์ฆ์ ๊ฐ์ง
- โ Namespace ๊ธฐ๋ฐ์ผ๋ก ๊น๋ํ ๊ตฌ์กฐ
- โ TanStack Query ์๋ ํตํฉ (์บ์ฑ, ์ฌ๊ฒ์ฆ, ๋๊ด์ ์ ๋ฐ์ดํธ)
- โ Subset๋ณ ์ ํํ ํ์ ์ถ๋ก
- โ SSR ์ง์์ผ๋ก SEO ์ต์ ํ
Service ์ฌ์ฉ๋ฒ
TanStack Query
SSR
Testing
Sonamu๋ ํ ์คํธ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ๋ด์ฅํ๊ณ ์์ต๋๋ค.Fixture ์์คํ
Fixture DB์ ๋ฏธ๋ฆฌ ์ธํ ๋ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผcreateFixtureLoader๋ก ์ฝ๊ฒ ๋ก๋ํ ์ ์์ต๋๋ค.
Naite: ํ ์คํธ ๋ฐ์ดํฐ ์ถ์ & ์๊ฐํ
ํ ์คํธ ์คํ ์ค ๋ชจ๋ ๋ฐ์ดํฐ ๋ณํ๋ฅผ ์ถ์ ํ๊ณ ์๊ฐํํฉ๋๋ค. ๋๋ฒ๊น ์ด ํจ์ฌ ์ฌ์์ง๋๋ค.๐ธ Naite Viewer ํ๋ฉด - ํ ์คํธ ์คํ ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณํ๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ UI
Transaction ์๋ ๋กค๋ฐฑ
๊ฐ ํ ์คํธ๋ ๋ ๋ฆฝ๋ Transaction์์ ์คํ๋๊ณ ์๋์ผ๋ก ๋กค๋ฐฑ๋ฉ๋๋ค. ํ ์คํธ ๊ฐ ๊ฒฉ๋ฆฌ๊ฐ ๋ณด์ฅ๋๋ฉฐ ๋ฐ์ดํฐ ์ ๋ฆฌ๊ฐ ํ์ ์์ต๋๋ค.- โ Fixture๋ก ํ ์คํธ ๋ฐ์ดํฐ ์ฌ์ฌ์ฉ
- โ Naite๋ก ๋ฐ์ดํฐ ๋ณํ ์๊ฐํ
- โ Transaction ์๋ ๋กค๋ฐฑ์ผ๋ก ๊ฒฉ๋ฆฌ๋ ํ ์คํธ
Fixture ์์คํ
Naite ๊ฐ์ด๋
AI Ready
Sonamu๋ AI ์๋์ ๋ง๋ ๊ธฐ๋ฅ๋ค์ ๋ค์ดํฐ๋ธ๋ก ์ง์ํฉ๋๋ค.Vector Search (pgvector)
AI ์๋ฒ ๋ฉ ๊ฒ์์ Entity ํ๋๋ก ์ ์ํ๋ฉด ๋์ ๋๋ค. pgvector๋ฅผ ๋ค์ดํฐ๋ธ๋ก ์ง์ํฉ๋๋ค.๐ฌ Entity์ vector ํ๋ ์ ์ โ ๋ง์ด๊ทธ๋ ์ด์ ์๋ ์์ฑ โ ๋ฒกํฐ ๊ฒ์ API ๊ตฌํ
AI SDK ํตํฉ
Vercel AI SDK์ ์๋ฒฝํ๊ฒ ํตํฉ๋ฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ ์๋ต๋ ๊ฐ๋จํฉ๋๋ค.SSE (Server-Sent Events)
@stream ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ์ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
AI Agent ํตํฉ
Sonamu UI์ AI ์ฑํ ์ผ๋ก Entity๋ฅผ ์์ฐ์ด๋ก ์์ฑํ ์ ์์ต๋๋ค.๐ฌ Sonamu UI์์ AI์๊ฒ '์ด์ปค๋จธ์ค ์ฃผ๋ฌธ ์์คํ ๋ง๋ค์ด์ค' ์ ๋ ฅ โ Entity 4๊ฐ ์๋ ์์ฑ
- โ pgvector ๋ค์ดํฐ๋ธ ์ง์ (๋ฒกํฐ ๊ฒ์)
- โ AI SDK ์๋ฒฝ ํตํฉ (์คํธ๋ฆฌ๋ฐ)
- โ SSE๋ก ์ค์๊ฐ ์ด๋ฒคํธ
- โ AI Agent๋ก Entity ์๋ ์์ฑ
Vector Search
SSE ์คํธ๋ฆฌ๋ฐ
Seamless DX
Sonamu๋ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ต์ฐ์ ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค.HMR (Hot Module Replacement)
์ฝ๋๋ฅผ ์์ ํ๋ฉด ์๋ฒ ์ฌ์์ ์์ด ์ฆ์ ๋ฐ์๋ฉ๋๋ค. Entity, Model, API ์ด๋๋ฅผ ์์ ํ๋ 2์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค.Sonamu UI
Entity ์ ์, Subset ๊ด๋ฆฌ, Migration ์คํ์ ์น UI์์ ์ง์ ํ ์ ์์ต๋๋ค. JSON์ ์ง์ ํธ์งํ์ง ์์๋ ๋ฉ๋๋ค.๐ฌ Sonamu UI์์ Entity ์ ์ ๋ฐ ๊ด๋ฆฌ
๋น ๋ฅธ ํผ๋๋ฐฑ ๋ฃจํ
Entity ๋ณ๊ฒฝ โ ํ์ /์คํค๋ง ์๋ ์์ฑ โ API ์ฌ๋ฑ๋ก โ ํ๋ก ํธ์๋ Service ์ ๋ฐ์ดํธ๊น์ง ๋ชจ๋ ๊ฒ์ด ์๋์ ๋๋ค. ํต์ฌ ๊ธฐ๋ฅ:- โ HMR๋ก ์๋ฒ ์ฌ์์ ์์ด ๊ฐ๋ฐ
- โ Sonamu UI๋ก ์๊ฐ์ Entity ๊ด๋ฆฌ
- โ Syncer๊ฐ ๋ชจ๋ ์ฝ๋ ์๋ ๋๊ธฐํ
- โ ๋ณ๊ฒฝ ์ฆ์ ํ์ ์๋ฌ ๊ฐ์ง
์์ธํ ๋ณด๊ธฐ
HMR ๋์ ์๋ฆฌ
Sonamu UI
Production Ready
Sonamu๋ ํ๋ก๋์ ํ๊ฒฝ์ ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๋ค์ ๋ด์ฅํ๊ณ ์์ต๋๋ค.BentoCache: ๋ค์ธต ์บ์ฑ
๋ฉ๋ชจ๋ฆฌ + Redis ๋ค์ธต ์บ์ฑ์ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.Cache-Control: ์๋ต ์บ์ฑ
HTTP ์๋ต ์บ์ฑ ์ ๋ต์ ๋ฐ์ฝ๋ ์ดํฐ๋ก ๊ฐ๋จํ ์ค์ ํ ์ ์์ต๋๋ค.i18n: ํ์ ์์ ํ ๋ค๊ตญ์ด ์ง์
Entity์ title, prop.desc, enumLabels๊ฐ ์๋์ผ๋ก ๋์ ๋๋ฆฌ์ ์ถ์ถ๋ฉ๋๋ค. ํ์ ์์ ํSD() ํจ์๋ก ๋ฒ์ญ์ ๊ด๋ฆฌํ๊ณ , ์กด์ฌํ์ง ์๋ ํค๋ ์ปดํ์ผ ํ์์ ์๋ฌ๋ก ์ก์์ค๋๋ค.
Workflow: ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง ๊ด๋ฆฌ
์ฌ๋ฌ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.์ฑ๋ฅ ์ต์ ํ ๋ด์ฅ
N+1 ๋ฌธ์ ์๋ ํด๊ฒฐ๊ณผ ์ฟผ๋ฆฌ ์ต์ ํ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค.- โ BentoCache๋ก ๋ค์ธต ์บ์ฑ (๋ฉ๋ชจ๋ฆฌ + Redis)
- โ Cache-Control๋ก HTTP ์๋ต ์บ์ฑ
- โ i18n์ผ๋ก ํ์ ์์ ํ ๋ค๊ตญ์ด ์ง์
- โ Workflow๋ก ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง ๊ด๋ฆฌ
- โ N+1 ๋ฌธ์ ์๋ ํด๊ฒฐ
BentoCache
i18n
๊ฐ๋จํ ์์
Entity๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ๊ธฐ๊น์ง์ ์ ์ฒด ํ๋ก์ฐ์ ๋๋ค.์ฐธ๊ณ : ์๋ ์์ฑ๋๋ ํ์ผ๋ค
api/src/application/sonamu.generated.ts- ๋ชจ๋ ํ์ , ์คํค๋ง, Enumweb/src/services/sonamu.generated.ts- ํ๋ก ํธ์๋ ํ์ (๋๊ธฐํ๋จ)web/src/services/services.generated.ts- ๋ชจ๋ Service ๋ฉ์๋web/src/services/{entity}/{entity}.types.ts- ์ปค์คํ ํ์ (์๋ ์์ฑ)
1. Entity ์ ์
๐ฌ Sonamu UI์์ User Entity๋ฅผ ์ ์ํ๋ ํ๋ฉด
2. Migration ์คํ ๋ฐ ๋๊ธฐํ
Entity ์ ์ฅ โ Migration ์คํ โpnpm sync:
โ
TypeScript ํ์
(sonamu.generated.ts)โ Zod ์คํค๋ง (BaseSchema, BaseListParams)
โ DB ๋ง์ด๊ทธ๋ ์ด์
โ ํ๋ก ํธ์๋ Service (
services.generated.ts)โ TanStack Query Hook
3. Model์์ ๋น์ฆ๋์ค ๋ก์ง ์์ฑ
4. React์์ ์ฆ์ ์ฌ์ฉ
๐ฌ Entity ์ ์ โ Migration โ Model ์์ฑ โ React์์ ์ฌ์ฉ๊น์ง ์ ์ฒด ํ๋ก์ฐ
์์ํ๊ธฐ
3๋ถ์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค.Quick Start
Installation
Core Concepts
Development Workflow
์ปค๋ฎค๋ํฐ
GitHub
Sonamu์ ํจ๊ป๋ผ๋ฉด, TypeScript๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ฆ๊ฑฐ์์ง๋๋ค.