Skip to main content
Sonamu๋Š” ์—”ํ‹ฐํ‹ฐ ์ค‘์‹ฌ์˜ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” TypeScript ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Sonamu์˜ ์ „์ฒด ์•„ํ‚คํ…์ฒ˜์™€ ํ•ต์‹ฌ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

Sonamu์˜ ์ฒ ํ•™

Sonamu๋Š” ๋‹ค์Œ ์›์น™์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค:
1

1. Entity First (์—”ํ‹ฐํ‹ฐ ์šฐ์„ )

๋ชจ๋“  ๊ฐœ๋ฐœ์€ ์—”ํ‹ฐํ‹ฐ ์ •์˜์—์„œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ์ •์˜ํ•˜๋ฉด, ๋‚˜๋จธ์ง€๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
2

2. Type Safety (ํƒ€์ž… ์•ˆ์ „์„ฑ)

๋ฐฑ์—”๋“œ๋ถ€ํ„ฐ ํ”„๋ก ํŠธ์—”๋“œ๊นŒ์ง€ ์™„์ „ํ•œ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
3

3. Code Generation (์ฝ”๋“œ ์ž๋™ ์ƒ์„ฑ)

๋ฐ˜๋ณต์ ์ธ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
4

4. Developer Experience (๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜)

HMR, ํƒ€์ž… ์ถ”๋ก , Sonamu UI ๋“ฑ์œผ๋กœ ๋›ฐ์–ด๋‚œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ์•„ํ‚คํ…์ฒ˜

Sonamu๋Š” 6๊ฐœ์˜ ๋ ˆ์ด์–ด๊ฐ€ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ

1. Entity (์—”ํ‹ฐํ‹ฐ)

์—”ํ‹ฐํ‹ฐ๋Š” Sonamu์˜ ๋ชจ๋“  ๊ฒƒ์˜ ์‹œ์ž‘์ ์ž…๋‹ˆ๋‹ค.
user.entity.json
์—”ํ‹ฐํ‹ฐ ์ •์˜์˜ ์—ญํ• 
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์˜ ์†Œ์Šค
  • TypeScript ํƒ€์ž… ์ƒ์„ฑ์˜ ๊ธฐ๋ฐ˜
  • API ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ •์˜
  • ํ”„๋ก ํŠธ์—”๋“œ ํƒ€์ž…์˜ ๊ธฐ์ค€

2. Type System (ํƒ€์ž… ์‹œ์Šคํ…œ)

์—”ํ‹ฐํ‹ฐ ์ •์˜๋กœ๋ถ€ํ„ฐ 3๊ฐ€์ง€ ํƒ€์ž… ํŒŒ์ผ์ด ์ž๋™ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค:
ํƒ€์ž… ํŒŒ์ผ 3์ข… ์„ธํŠธ
  1. {entity}.types.ts - ์—”ํ‹ฐํ‹ฐ๋ณ„ ํƒ€์ž… (ํ™•์žฅ ๊ฐ€๋Šฅ)
  2. sonamu.generated.ts - ์ „์ฒด Base ์Šคํ‚ค๋งˆ (์ž๋™ ์ƒ์„ฑ)
  3. sonamu.generated.sso.ts - Subset ์ฟผ๋ฆฌ (์ž๋™ ์ƒ์„ฑ)

3. Model (๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง)

Model์€ ์—”ํ‹ฐํ‹ฐ์˜ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
user.model.ts
Model์˜ ํŠน์ง•
  • @api ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋กœ ์ž๋™ REST API ์ƒ์„ฑ
  • BaseModelClass ์ƒ์†์œผ๋กœ ๊ธฐ๋ณธ CRUD ๋ฉ”์„œ๋“œ ์ œ๊ณต
  • Puri ์ฟผ๋ฆฌ ๋นŒ๋”๋กœ ํƒ€์ž… ์•ˆ์ „ํ•œ DB ์ฟผ๋ฆฌ
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ ๊ฐ€๋Šฅ

4. Syncer (๋™๊ธฐํ™” ์‹œ์Šคํ…œ)

Syncer๋Š” Sonamu์˜ ํ•ต์‹ฌ ์—”์ง„์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
Syncer ๋™์ž‘ ์‹œ์ 
  • ์ž๋™: pnpm dev ์‹คํ–‰ ์ค‘ ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ (HMR)
  • ์ˆ˜๋™: pnpm sync ๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ

5. API Layer (REST API)

Model์˜ @api ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์ž๋™์œผ๋กœ REST API๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ž๋™ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ๋“ค
  • โœ… REST API ๋ผ์šฐํŠธ
  • โœ… ์š”์ฒญ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฒ€์ฆ (Zod)
  • โœ… ์‘๋‹ต ํƒ€์ž…
  • โœ… ์—๋Ÿฌ ํ•ธ๋“ค๋ง
  • โœ… API ๋ฌธ์„œ (sonamu.generated.http)

6. Frontend Service (ํ”„๋ก ํŠธ์—”๋“œ ํ†ตํ•ฉ)

Model์˜ API๋Š” ์ž๋™์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ Service๋กœ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
web/src/services/UserService.ts (์ž๋™ ์ƒ์„ฑ)
ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ฐฑ์—”๋“œ์˜ ํƒ€์ž…์ด ํ”„๋ก ํŠธ์—”๋“œ์— ๊ทธ๋Œ€๋กœ ๋™๊ธฐํ™”๋˜์–ด, ํƒ€์ž… ๋ถˆ์ผ์น˜ ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๊ฐœ๋ฐœ ํ”Œ๋กœ์šฐ

์‹ค์ œ ๊ฐœ๋ฐœ ์‹œ Sonamu๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ด…์‹œ๋‹ค:
1

1. ์—”ํ‹ฐํ‹ฐ ์ •์˜ (Sonamu UI)

์ €์žฅ ์‹œ ์ž๋™ ์ƒ์„ฑ:
  • post.types.ts
  • sonamu.generated.ts ์—…๋ฐ์ดํŠธ
2

2. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (Migration ํƒญ)

์‹คํ–‰ ์‹œ:
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ…Œ์ด๋ธ” ์ƒ์„ฑ
3

3. Model ์ž‘์„ฑ (์ง์ ‘ ๋˜๋Š” ์Šค์บํด๋”ฉ)

์ €์žฅ ์‹œ ์ž๋™ ์ƒ์„ฑ:
  • REST API: GET /api/posts/:id
  • PostService.ts (ํ”„๋ก ํŠธ์—”๋“œ)
  • sonamu.generated.http ์—…๋ฐ์ดํŠธ
4

4. ํ”„๋ก ํŠธ์—”๋“œ ์‚ฌ์šฉ

ํƒ€์ž… ์•ˆ์ „์„ฑ:
  • ๋ฐฑ์—”๋“œ ํƒ€์ž… ๋ณ€๊ฒฝ ์‹œ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ์ฆ‰์‹œ ์˜ค๋ฅ˜ ๊ฐ์ง€

Development Flow

HMR (Hot Module Replacement)

Sonamu๋Š” ๊ฐ•๋ ฅํ•œ HMR ์‹œ์Šคํ…œ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

HMR ์ž‘๋™ ๋ฐฉ์‹

HMR์˜ ์ด์ 
  • โœ… ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ - ์ฝ”๋“œ ๋ณ€๊ฒฝ ํ›„ 1-2์ดˆ ๋‚ด ๋ฐ˜์˜
  • โœ… ์ƒํƒœ ์œ ์ง€ - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋“ฑ ์œ ์ง€
  • โœ… ์ž๋™ ๋™๊ธฐํ™” - ํ”„๋ก ํŠธ์—”๋“œ Service ์ž๋™ ์—…๋ฐ์ดํŠธ

HMR in Action

์ž๋™ ์ƒ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜

Sonamu๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค:

์—”ํ‹ฐํ‹ฐ ์ •์˜ ๋ณ€๊ฒฝ ์‹œ

Model ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ

Types ํŒŒ์ผ ๋ณ€๊ฒฝ ์‹œ

์ ˆ๋Œ€ ์ˆ˜์ •ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ํŒŒ์ผ
  • sonamu.generated.ts - ๋‹ค์Œ sync ์‹œ ๋ฎ์–ด์”Œ์›Œ์ง
  • {Entity}Service.ts - ๋‹ค์Œ sync ์‹œ ๋ฎ์–ด์”Œ์›Œ์ง
  • sonamu.generated.sso.ts - ๋‹ค์Œ sync ์‹œ ๋ฎ์–ด์”Œ์›Œ์ง
์ด ํŒŒ์ผ๋“ค์€ ํ•ญ์ƒ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ๋งˆ์„ธ์š”!

ํƒ€์ž… ์•ˆ์ „์„ฑ์˜ ํ๋ฆ„

Sonamu์˜ End-to-End ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์‹œ๊ฐํ™”ํ•˜๋ฉด:
ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ณด์žฅ
  1. ์—”ํ‹ฐํ‹ฐ ์ •์˜ โ†’ ํƒ€์ž… ์ƒ์„ฑ
  2. Model โ†’ API ํƒ€์ž… ์ถ”๋ก 
  3. API โ†’ Service ํƒ€์ž… ๋™๊ธฐํ™”
  4. Service โ†’ UI ํƒ€์ž… ์ฒดํฌ
์–ด๋А ๋‹จ๊ณ„์—์„œ๋“  ํƒ€์ž…์ด ๋ณ€๊ฒฝ๋˜๋ฉด, ์ „์ฒด ์ฒด์ธ์— ๋ฐ˜์˜๋˜์–ด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ•ฉ๋‹ˆ๋‹ค!

Sonamu์˜ ์ฃผ์š” ์žฅ์ 

1. ๊ฐœ๋ฐœ ์†๋„ ํ–ฅ์ƒ

2. ํƒ€์ž… ์•ˆ์ „์„ฑ

3. ์œ ์ง€๋ณด์ˆ˜์„ฑ

4. ์ผ๊ด€์„ฑ

์ œ์•ฝ์‚ฌํ•ญ๊ณผ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

Sonamu์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์€ ์ผ๋ถ€ ์ œ์•ฝ์‚ฌํ•ญ์„ ๋™๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค:
์•Œ์•„๋‘์–ด์•ผ ํ•  ์ œ์•ฝ์‚ฌํ•ญ
  1. ํ•™์Šต ๊ณก์„ : Sonamu์˜ ๊ฐœ๋…๊ณผ ๊ทœ์น™์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
  2. ์ž๋™ ์ƒ์„ฑ ํŒŒ์ผ ์ˆ˜์ • ๋ถˆ๊ฐ€: ์ˆ˜๋™ ์ˆ˜์ • ์‹œ ๋ฎ์–ด์”Œ์›Œ์ง‘๋‹ˆ๋‹ค
  3. ์—”ํ‹ฐํ‹ฐ ์ค‘์‹ฌ ์„ค๊ณ„ ํ•„์ˆ˜: Sonamu ๋ฐฉ์‹์„ ๋”ฐ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค
  4. ๋ณต์žกํ•œ ์ฟผ๋ฆฌ: ๋งค์šฐ ๋ณต์žกํ•œ ๊ฒฝ์šฐ Raw SQL ์‚ฌ์šฉ ํ•„์š”
ํ•˜์ง€๋งŒ ์žฅ์ ์ด ํ›จ์”ฌ ํฝ๋‹ˆ๋‹คโœ… ๊ฐœ๋ฐœ ์†๋„ ํ–ฅ์ƒ (90% ์‹œ๊ฐ„ ๋‹จ์ถ•) โœ… ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ณด์žฅ โœ… ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ โœ… ์ฝ”๋“œ ์ผ๊ด€์„ฑ โœ… ํŒ€ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ

๋‹ค์Œ ๋‹จ๊ณ„

Sonamu์˜ ์ž‘๋™ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ์ด์ œ ๊ฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”:

์—”ํ‹ฐํ‹ฐ ์ •์˜ํ•˜๊ธฐ

์—”ํ‹ฐํ‹ฐ์˜ ๊ตฌ์กฐ์™€ ์„ค์ • ์˜ต์…˜์„ ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

Model ์ดํ•ดํ•˜๊ธฐ

Model์˜ ์—ญํ• ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ž‘์„ฑ ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ณด์„ธ์š”.

์ž๋™ ์ƒ์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜

์–ด๋–ค ํŒŒ์ผ๋“ค์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์„ธ์š”.

ํƒ€์ž… ์‹œ์Šคํ…œ

Sonamu์˜ ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์„ธ์š”.