๋๊ตฌ๋ฅผ ์ํ ํ๋ ์์ํฌ์ธ๊ฐ
์์ฐ์ฑ์ ์ค์ํ๋ ๊ฐ๋ฐ์
๋ฐ๋ณต ์์
์ ์๊ฐ์ ๋ญ๋นํ์ง ์๊ณ , ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ๊ณ ์ถ์ ๋ถ
ํ์ ์์ ์ฑ์ ์ ๋ขฐํ๋ ํ
๋ฐํ์ ์๋ฌ๋ณด๋ค ์ปดํ์ผ ์๋ฌ๋ฅผ ์ ํธํ๊ณ , IDE์ ๋์์ ์ต๋ํ ํ์ฉํ๋ ํ
ํ๋ก ํธ์๋์ ํ์ ํ๋ ๋ฐฑ์๋
API ์คํ ๋ฌธ์ํ์ ํด๋ผ์ด์ธํธ ์์ฑ์ ์ด์ค ์์
์์ ๋ฒ์ด๋๊ณ ์ถ์ ๋ถ
๋น ๋ฅธ ํ๋กํ ํ์ดํ์ด ํ์ํ ์คํํธ์
MVP๋ฅผ ๋น ๋ฅด๊ฒ ๋ง๋ค๋ฉด์๋ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ต์ํํ๊ณ ์ถ์ ํ
ํต์ฌ ์ฒ ํ: ๋จ์ผ ์ง์ค ๊ณต๊ธ์
Entity ํ๋๋ฅผ ์ ์ํ๋ฉด, ๋๋จธ์ง๋ TypeScript๊ฐ ์์์ ํฉ๋๋ค.๋ฐฑ์๋์ ํ๋ก ํธ์๋์ ํ์ ๋๊ธฐํ
์ผ๋ฐ์ ์ผ๋ก ๋ฐฑ์๋ API๋ฅผ ๋ง๋ค๊ณ ํ๋ก ํธ์๋์์ ์ฌ์ฉํ ๋๋ ํ์ ๋๊ธฐํ๊ฐ ์ด๋ ต์ต๋๋ค. Sonamu๋ ๋ฐฑ์๋ ๋ณ๊ฒฝ์ด ์ฆ์ ํ๋ก ํธ์๋์ ๋ฐ์๋์ด ์ปดํ์ผ ํ์์ ์๋ฌ๋ฅผ ๊ฐ์งํฉ๋๋ค.- ์๋ ์์ฑ ์
- Sonamu ๋ฐฉ์

Fully Type-safe Query Builder: Puri
Sonamu๋ Knex ๊ธฐ๋ฐ์ ํ์ ์์ ํ ์ฟผ๋ฆฌ ๋น๋ Puri๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ ์ด๋ธ๋ช , ์นผ๋ผ๋ช , ๊ด๊ณ๊น์ง ๋ชจ๋ ํ์ ์ฒดํฌ๋ฉ๋๋ค.- โ Entity ์ ์์์ ํ์ ์๋ ์ถ์ถ
- โ ํ ์ด๋ธ๋ช , ์นผ๋ผ๋ช , ๊ด๊ณ ๋ชจ๋ ์๋์์ฑ
- โ ์๋ชป๋ ์นผ๋ผ๋ช ์ ์ปดํ์ผ ์๋ฌ
- โ Knex์ ๋ชจ๋ ๊ธฐ๋ฅ ์ง์
Puri ๊ฐ์ด๋
ํ์
์์ ํ ์ฟผ๋ฆฌ ์์ฑํ๊ธฐ
Frontend Integration
๋ฐฑ์๋ API๋ฅผ ์ ์ํ๋ฉด, ํ๋ก ํธ์๋ Service์ TanStack Query Hook์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.Subset์ผ๋ก ์ต์ ํ
ํ์ํ ํ๋๋ง ์กฐํํ์ฌ ๋คํธ์ํฌ ๋น์ฉ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ๋์ ๋๋ค. ๊ฐ Subset๋ง๋ค ์ ํํ TypeScript ํ์ ์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.SSR
Vite + React ๊ธฐ๋ฐ์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง์ ์ง์ํฉ๋๋ค.registerSSR๋ก SSRํ ๋ผ์ฐํธ๋ฅผ ๋ฑ๋กํ๊ณ , preload ์ฝ๋ฐฑ์ผ๋ก ์๋ฒ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํฉ๋๋ค.
- โ ๋ฐฑ์๋ ๋ณ๊ฒฝ ์ ์ปดํ์ผ ์๋ฌ๋ก ์ฆ์ ๊ฐ์ง
- โ Namespace ๊ธฐ๋ฐ์ผ๋ก ๊น๋ํ ๊ตฌ์กฐ
- โ TanStack Query ์๋ ํตํฉ (์บ์ฑ, ์ฌ๊ฒ์ฆ, ๋๊ด์ ์ ๋ฐ์ดํธ)
- โ Subset๋ณ ์ ํํ ํ์ ์ถ๋ก
- โ SSR ์ง์์ผ๋ก SEO ์ต์ ํ
Service ์ฌ์ฉ๋ฒ
์๋ ์์ฑ๋ Service ํ์ฉํ๊ธฐ
TanStack Query
React Hook์ผ๋ก ๋ฐ์ดํฐ ํ์นญ
SSR
์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง
Testing
Sonamu๋ ํ ์คํธ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ๋ด์ฅํ๊ณ ์์ต๋๋ค.Fixture ์์คํ
Fixture DB์ ๋ฏธ๋ฆฌ ์ธํ ๋ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผcreateFixtureLoader๋ก ์ฝ๊ฒ ๋ก๋ํ ์ ์์ต๋๋ค.
Naite: ํ ์คํธ ๋ฐ์ดํฐ ์ถ์ & ์๊ฐํ
ํ ์คํธ ์คํ ์ค ๋ชจ๋ ๋ฐ์ดํฐ ๋ณํ๋ฅผ ์ถ์ ํ๊ณ ์๊ฐํํฉ๋๋ค. ๋๋ฒ๊น ์ด ํจ์ฌ ์ฌ์์ง๋๋ค.Transaction ์๋ ๋กค๋ฐฑ
๊ฐ ํ ์คํธ๋ ๋ ๋ฆฝ๋ Transaction์์ ์คํ๋๊ณ ์๋์ผ๋ก ๋กค๋ฐฑ๋ฉ๋๋ค. ํ ์คํธ ๊ฐ ๊ฒฉ๋ฆฌ๊ฐ ๋ณด์ฅ๋๋ฉฐ ๋ฐ์ดํฐ ์ ๋ฆฌ๊ฐ ํ์ ์์ต๋๋ค.- โ Fixture๋ก ํ ์คํธ ๋ฐ์ดํฐ ์ฌ์ฌ์ฉ
- โ Naite๋ก ๋ฐ์ดํฐ ๋ณํ ์๊ฐํ
- โ Transaction ์๋ ๋กค๋ฐฑ์ผ๋ก ๊ฒฉ๋ฆฌ๋ ํ ์คํธ
AI Ready
Sonamu๋ AI ์๋์ ๋ง๋ ๊ธฐ๋ฅ๋ค์ ๋ค์ดํฐ๋ธ๋ก ์ง์ํฉ๋๋ค.Vector Search (pgvector)
AI ์๋ฒ ๋ฉ ๊ฒ์์ Entity ํ๋๋ก ์ ์ํ๋ฉด ๋์ ๋๋ค. pgvector๋ฅผ ๋ค์ดํฐ๋ธ๋ก ์ง์ํฉ๋๋ค.AI SDK ํตํฉ
Vercel AI SDK์ ์๋ฒฝํ๊ฒ ํตํฉ๋ฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ ์๋ต๋ ๊ฐ๋จํฉ๋๋ค.SSE (Server-Sent Events)
@stream ๋ฐ์ฝ๋ ์ดํฐ๋ก ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ์ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
AI Agent ํตํฉ
Sonamu UI์ AI ์ฑํ ์ผ๋ก Entity๋ฅผ ์์ฐ์ด๋ก ์์ฑํ ์ ์์ต๋๋ค.- โ pgvector ๋ค์ดํฐ๋ธ ์ง์ (๋ฒกํฐ ๊ฒ์)
- โ AI SDK ์๋ฒฝ ํตํฉ (์คํธ๋ฆฌ๋ฐ)
- โ SSE๋ก ์ค์๊ฐ ์ด๋ฒคํธ
- โ AI Agent๋ก Entity ์๋ ์์ฑ
Seamless DX
Sonamu๋ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ต์ฐ์ ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค.HMR (Hot Module Replacement)
์ฝ๋๋ฅผ ์์ ํ๋ฉด ์๋ฒ ์ฌ์์ ์์ด ์ฆ์ ๋ฐ์๋ฉ๋๋ค. Entity, Model, API ์ด๋๋ฅผ ์์ ํ๋ 2์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค.Sonamu UI
Entity ์ ์, Subset ๊ด๋ฆฌ, Migration ์คํ์ ์น UI์์ ์ง์ ํ ์ ์์ต๋๋ค. JSON์ ์ง์ ํธ์งํ์ง ์์๋ ๋ฉ๋๋ค.๋น ๋ฅธ ํผ๋๋ฐฑ ๋ฃจํ
Entity ๋ณ๊ฒฝ โ ํ์ /์คํค๋ง ์๋ ์์ฑ โ API ์ฌ๋ฑ๋ก โ ํ๋ก ํธ์๋ Service ์ ๋ฐ์ดํธ๊น์ง ๋ชจ๋ ๊ฒ์ด ์๋์ ๋๋ค. ํต์ฌ ๊ธฐ๋ฅ:- โ HMR๋ก ์๋ฒ ์ฌ์์ ์์ด ๊ฐ๋ฐ
- โ Sonamu UI๋ก ์๊ฐ์ Entity ๊ด๋ฆฌ
- โ Syncer๊ฐ ๋ชจ๋ ์ฝ๋ ์๋ ๋๊ธฐํ
- โ ๋ณ๊ฒฝ ์ฆ์ ํ์ ์๋ฌ ๊ฐ์ง
์์ธํ ๋ณด๊ธฐ
Seamless DX ์์ธ ํ์ด์ง
HMR ๋์ ์๋ฆฌ
HMR ์์คํ
์ดํดํ๊ธฐ
Sonamu UI
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 ๋ฌธ์ ์๋ ํด๊ฒฐ
๊ฐ๋จํ ์์
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 ์ ์
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์์ ์ฆ์ ์ฌ์ฉ
์์ํ๊ธฐ
3๋ถ์ด๋ฉด ์ถฉ๋ถํฉ๋๋ค.Quick Start
5๋ถ ๋ง์ ์ฒซ API ๋ง๋ค๊ธฐ
Installation
์์ธํ ์ค์น ๊ฐ์ด๋
Core Concepts
Sonamu ์๋ ์๋ฆฌ ์ดํดํ๊ธฐ
Development Workflow
๊ฐ๋ฐ ์ํฌํ๋ก์ฐ ์์๋ณด๊ธฐ
์ปค๋ฎค๋ํฐ
GitHub
์ด์ ๋ฆฌํฌํธ์ ๊ธฐ์ฌ
Sonamu์ ํจ๊ป๋ผ๋ฉด, TypeScript๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ฆ๊ฑฐ์์ง๋๋ค.