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

๐ธ Sonamu ๋ฐฉ์์์ ์กด์ฌํ์ง ์๋ ์์ฑ์ ์ ๊ทผํ๋ฉด ์ปดํ์ผ ์๋ฌ ํ์
Frontend Integration
๋ฐฑ์๋ API๋ฅผ ์ ์ํ๋ฉด, ํ๋ก ํธ์๋ Service์ TanStack Query Hook์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.๐ฌ ๋ฐฑ์๋ @api ๋ฉ์๋ ์์ฑ โ ํ๋ก ํธ์๋ Service ์๋ ์์ฑ โ useQuery ์ฌ์ฉ
Subset์ผ๋ก ์ต์ ํ
ํ์ํ ํ๋๋ง ์กฐํํ์ฌ ๋คํธ์ํฌ ๋น์ฉ์ ์ค์ด๊ณ ์ฑ๋ฅ์ ๋์ ๋๋ค. ๊ฐ Subset๋ง๋ค ์ ํํ TypeScript ํ์ ์ด ์๋์ผ๋ก ์์ฑ๋ฉ๋๋ค.- โ ๋ฐฑ์๋ ๋ณ๊ฒฝ ์ ์ปดํ์ผ ์๋ฌ๋ก ์ฆ์ ๊ฐ์ง
- โ Namespace ๊ธฐ๋ฐ์ผ๋ก ๊น๋ํ ๊ตฌ์กฐ
- โ TanStack Query ์๋ ํตํฉ (์บ์ฑ, ์ฌ๊ฒ์ฆ, ๋๊ด์ ์ ๋ฐ์ดํธ)
- โ Subset๋ณ ์ ํํ ํ์ ์ถ๋ก
Service ์ฌ์ฉ๋ฒ
TanStack Query
Testing
Sonamu๋ ํ ์คํธ๋ฅผ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ๋ด์ฅํ๊ณ ์์ต๋๋ค.Fixture ์์คํ
ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์์ฑํ๊ณ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.Naite: ํ ์คํธ ๋ฐ์ดํฐ ์ถ์ & ์๊ฐํ
ํ ์คํธ ์คํ ์ค ๋ชจ๋ ๋ฐ์ดํฐ ๋ณํ๋ฅผ ์ถ์ ํ๊ณ ์๊ฐํํฉ๋๋ค. ๋๋ฒ๊น ์ด ํจ์ฌ ์ฌ์์ง๋๋ค.๐ธ Naite Viewer ํ๋ฉด - ํ ์คํธ ์คํ ์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณํ๋ฅผ ์๊ฐ์ ์ผ๋ก ๋ณด์ฌ์ฃผ๋ UI
Transaction ์๋ ๋กค๋ฐฑ
๊ฐ ํ ์คํธ๋ ๋ ๋ฆฝ๋ Transaction์์ ์คํ๋๊ณ ์๋์ผ๋ก ๋กค๋ฐฑ๋ฉ๋๋ค. ํ ์คํธ ๊ฐ ๊ฒฉ๋ฆฌ๊ฐ ๋ณด์ฅ๋๋ฉฐ ๋ฐ์ดํฐ ์ ๋ฆฌ๊ฐ ํ์ ์์ต๋๋ค.Context ๊ธฐ๋ฐ ๊ถํ ํ ์คํธ
ํน์ ์ฌ์ฉ์๋ก ์ธ์ฆ๋ ์ํ์์ ํ ์คํธํ ์ ์์ต๋๋ค.- โ Fixture๋ก ํ ์คํธ ๋ฐ์ดํฐ ์ฌ์ฌ์ฉ
- โ Naite๋ก ๋ฐ์ดํฐ ๋ณํ ์๊ฐํ
- โ Transaction ์๋ ๋กค๋ฐฑ์ผ๋ก ๊ฒฉ๋ฆฌ๋ ํ ์คํธ
- โ testAs๋ก ๊ถํ ํ ์คํธ ๊ฐํธํ
AI Ready
Sonamu๋ AI ์๋์ ๋ง๋ ๊ธฐ๋ฅ๋ค์ ๋ค์ดํฐ๋ธ๋ก ์ง์ํฉ๋๋ค.Vector Search (pgvector)
AI ์๋ฒ ๋ฉ ๊ฒ์์ Entity ํ๋๋ก ์ ์ํ๋ฉด ๋์ ๋๋ค. pgvector๋ฅผ ๋ค์ดํฐ๋ธ๋ก ์ง์ํฉ๋๋ค.๐ฌ Entity์ vector ํ๋ ์ ์ โ ๋ง์ด๊ทธ๋ ์ด์ ์๋ ์์ฑ โ ๋ฒกํฐ ๊ฒ์ API ๊ตฌํ
AI SDK ํตํฉ
Vercel AI SDK์ ์๋ฒฝํ๊ฒ ํตํฉ๋ฉ๋๋ค. ์คํธ๋ฆฌ๋ฐ ์๋ต๋ ๊ฐ๋จํฉ๋๋ค.SSE (Server-Sent Events)
์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ์ ์ํ SSE๋ฅผ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.AI Agent ํตํฉ
Sonamu UI์ AI ์ฑํ ์ผ๋ก Entity๋ฅผ ์์ฐ์ด๋ก ์์ฑํ ์ ์์ต๋๋ค.๐ฌ Sonamu UI์์ AI์๊ฒ '์ด์ปค๋จธ์ค ์ฃผ๋ฌธ ์์คํ ๋ง๋ค์ด์ค' ์ ๋ ฅ โ Entity 4๊ฐ ์๋ ์์ฑ
- โ pgvector ๋ค์ดํฐ๋ธ ์ง์ (๋ฒกํฐ ๊ฒ์)
- โ AI SDK ์๋ฒฝ ํตํฉ (์คํธ๋ฆฌ๋ฐ)
- โ SSE๋ก ์ค์๊ฐ ์ด๋ฒคํธ
- โ AI Agent๋ก Entity ์๋ ์์ฑ
Production Ready
Sonamu๋ ํ๋ก๋์ ํ๊ฒฝ์ ์ํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๋ค์ ๋ด์ฅํ๊ณ ์์ต๋๋ค.BentoCache: ๋ค์ธต ์บ์ฑ
๋ฉ๋ชจ๋ฆฌ + Redis ๋ค์ธต ์บ์ฑ์ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.Cache-Control: ์๋ต ์บ์ฑ
HTTP ์๋ต ์บ์ฑ ์ ๋ต์ ๋ฐ์ฝ๋ ์ดํฐ๋ก ๊ฐ๋จํ ์ค์ ํ ์ ์์ต๋๋ค.i18n: ํ์ ์์ ํ ๋ค๊ตญ์ด ์ง์
Entity์ title, prop.desc, enumLabels๊ฐ ์๋์ผ๋ก ๋์ ๋๋ฆฌ์ ์ถ์ถ๋ฉ๋๋ค. ํ์ ์์ ํSD() ํจ์๋ก ๋ฒ์ญ์ ๊ด๋ฆฌํ๊ณ , ์กด์ฌํ์ง ์๋ ํค๋ ์ปดํ์ผ ํ์์ ์๋ฌ๋ก ์ก์์ค๋๋ค.
Workflow: ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง ๊ด๋ฆฌ
์ฌ๋ฌ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ต๋๋ค.์ฑ๋ฅ ์ต์ ํ ๋ด์ฅ
N+1 ๋ฌธ์ ์๋ ํด๊ฒฐ, ์ฟผ๋ฆฌ ์ต์ ํ, HMR(Hot Module Replacement)์ด ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค.- โ 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 ์ ์
๐ฌ 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๋ก ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ฆ๊ฑฐ์์ง๋๋ค.