Skip to main content
TypeScript๋Š” ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŽ์€ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์ด ์ด ๊ฐ•์ ์„ ์˜จ์ „ํžˆ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Sonamu๋Š” TypeScript์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์ค‘์‹ฌ์— ๋‘๊ณ  ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ตฌ๋ฅผ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ธ๊ฐ€

์ƒ์‚ฐ์„ฑ์„ ์ค‘์‹œํ•˜๋Š” ๊ฐœ๋ฐœ์ž

๋ฐ˜๋ณต ์ž‘์—…์— ์‹œ๊ฐ„์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๊ณ , ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ์€ ๋ถ„

ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์‹ ๋ขฐํ•˜๋Š” ํŒ€

๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ณด๋‹ค ์ปดํŒŒ์ผ ์—๋Ÿฌ๋ฅผ ์„ ํ˜ธํ•˜๊ณ , IDE์˜ ๋„์›€์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋Š” ํŒ€

ํ”„๋ก ํŠธ์—”๋“œ์™€ ํ˜‘์—…ํ•˜๋Š” ๋ฐฑ์—”๋“œ

API ์ŠคํŽ™ ๋ฌธ์„œํ™”์™€ ํด๋ผ์ด์–ธํŠธ ์ž‘์„ฑ์˜ ์ด์ค‘ ์ž‘์—…์—์„œ ๋ฒ—์–ด๋‚˜๊ณ  ์‹ถ์€ ๋ถ„

๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘์ด ํ•„์š”ํ•œ ์Šคํƒ€ํŠธ์—…

MVP๋ฅผ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“ค๋ฉด์„œ๋„ ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ์‹ถ์€ ํŒ€

ํ•ต์‹ฌ ์ฒ ํ•™: ๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›

Entity ํ•˜๋‚˜๋ฅผ ์ •์˜ํ•˜๋ฉด, ๋‚˜๋จธ์ง€๋Š” TypeScript๊ฐ€ ์•Œ์•„์„œ ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽฌ Entity ์ƒ์„ฑ โ†’ Migration ์‹คํ–‰ โ†’ ํƒ€์ž…/์Šคํ‚ค๋งˆ/API ์ž๋™ ์ƒ์„ฑ โ†’ ํ”„๋ก ํŠธ์—”๋“œ Service ์ƒ์„ฑ๊นŒ์ง€ ์ „์ฒด ํ”Œ๋กœ์šฐ

Entity๋ฅผ ํ•œ ๊ณณ์— ์ •์˜ํ•˜๋ฉด, ์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์ˆ˜๋™์œผ๋กœ ํƒ€์ž…์„ ๋งž์ถ”๊ฑฐ๋‚˜, API ์ŠคํŽ™์„ ๋ฌธ์„œํ™”ํ•˜๊ฑฐ๋‚˜, ํ”„๋ก ํŠธ์—”๋“œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ์˜ ํƒ€์ž… ๋™๊ธฐํ™”

์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐฑ์—”๋“œ 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 ์ฝœ๋ฐฑ์œผ๋กœ ์„œ๋ฒ„์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
๋“ฑ๋ก๋œ ๋ผ์šฐํŠธ๋Š” ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋˜๊ณ , ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์ž๋™์œผ๋กœ hydration๋ฉ๋‹ˆ๋‹ค. SEO ์ตœ์ ํ™”์™€ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์†๋„๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๊ธฐ๋Šฅ:
  • โœ… ๋ฐฑ์—”๋“œ ๋ณ€๊ฒฝ ์‹œ ์ปดํŒŒ์ผ ์—๋Ÿฌ๋กœ ์ฆ‰์‹œ ๊ฐ์ง€
  • โœ… Namespace ๊ธฐ๋ฐ˜์œผ๋กœ ๊น”๋”ํ•œ ๊ตฌ์กฐ
  • โœ… TanStack Query ์ž๋™ ํ†ตํ•ฉ (์บ์‹ฑ, ์žฌ๊ฒ€์ฆ, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ)
  • โœ… Subset๋ณ„ ์ •ํ™•ํ•œ ํƒ€์ž… ์ถ”๋ก 
  • โœ… SSR ์ง€์›์œผ๋กœ SEO ์ตœ์ ํ™”

Service ์‚ฌ์šฉ๋ฒ•

์ž๋™ ์ƒ์„ฑ๋œ Service ํ™œ์šฉํ•˜๊ธฐ

TanStack Query

React Hook์œผ๋กœ ๋ฐ์ดํ„ฐ ํŽ˜์นญ

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์ดˆ๋ฉด ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
ํ•˜๋ฃจ์— 50๋ฒˆ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด? ์ „ํ†ต์  ๋ฐฉ์‹์€ 25๋ถ„ ๋‚ญ๋น„, Sonamu๋Š” 1.7๋ถ„์ž…๋‹ˆ๋‹ค.

Sonamu UI

Entity ์ •์˜, Subset ๊ด€๋ฆฌ, Migration ์‹คํ–‰์„ ์›น UI์—์„œ ์ง์ ‘ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JSON์„ ์ง์ ‘ ํŽธ์ง‘ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

๐ŸŽฌ Sonamu UI์—์„œ Entity ์ •์˜ ๋ฐ ๊ด€๋ฆฌ

๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„

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 ๋ฌธ์ œ ์ž๋™ ํ•ด๊ฒฐ

BentoCache

๋‹ค์ธต ์บ์‹ฑ ์ „๋žต

i18n

๋‹ค๊ตญ์–ด ์ง€์› ์‹œ์Šคํ…œ

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ

Entity๋ฅผ ์ •์˜ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ๊นŒ์ง€์˜ ์ „์ฒด ํ”Œ๋กœ์šฐ์ž…๋‹ˆ๋‹ค.
์ฐธ๊ณ : ์ž๋™ ์ƒ์„ฑ๋˜๋Š” ํŒŒ์ผ๋“ค
  • api/src/application/sonamu.generated.ts - ๋ชจ๋“  ํƒ€์ž…, ์Šคํ‚ค๋งˆ, Enum
  • web/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

5๋ถ„ ๋งŒ์— ์ฒซ API ๋งŒ๋“ค๊ธฐ

Installation

์ž์„ธํ•œ ์„ค์น˜ ๊ฐ€์ด๋“œ

Core Concepts

Sonamu ์ž‘๋™ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ

Development Workflow

๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ ์•Œ์•„๋ณด๊ธฐ

์ปค๋ฎค๋‹ˆํ‹ฐ

GitHub

์ด์Šˆ ๋ฆฌํฌํŠธ์™€ ๊ธฐ์—ฌ

Sonamu์™€ ํ•จ๊ป˜๋ผ๋ฉด, TypeScript๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ์ฆ๊ฑฐ์›Œ์ง‘๋‹ˆ๋‹ค.