Skip to main content
Syncer๋Š” Sonamu์˜ ์ž๋™ ์ƒ์„ฑ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜๊ณ , ํ•„์š”ํ•œ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋ฉฐ, ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ(web, app ๋“ฑ)์— ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

Syncer๋ž€?

ํŒŒ์ผ ๋ณ€๊ฒฝ ๊ฐ์ง€

Entity, Model, Types ํŒŒ์ผ ๋ณ€๊ฒฝ ์ถ”์ Checksum ๊ธฐ๋ฐ˜ ํšจ์œจ์  ๊ฐ์ง€

์ž๋™ ์ฝ”๋“œ ์ƒ์„ฑ

ํƒ€์ž…, ์Šคํ‚ค๋งˆ, API ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑTemplate ๊ธฐ๋ฐ˜ ์ƒ์„ฑ

HMR ์ง€์›

๊ฐœ๋ฐœ ์ค‘ ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜ํŒŒ์ผ ๋ฌดํšจํ™” ๋ฐ ์žฌ๋กœ๋“œ

๋ฉ€ํ‹ฐ ํƒ€๊ฒŸ ๋™๊ธฐํ™”

web, app ๋“ฑ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ ๋™๊ธฐํ™”์ž๋™ ํŒŒ์ผ ๋ณต์‚ฌ

Syncer์˜ ๋™์ž‘ ํ๋ฆ„

๊ฐ์‹œ ๋Œ€์ƒ ํŒŒ์ผ

Syncer๊ฐ€ ๋ณ€๊ฒฝ์„ ์ถ”์ ํ•˜๋Š” ํŒŒ์ผ ํŒจํ„ด์ž…๋‹ˆ๋‹ค:
ํŒŒ์ผ ํŒจํ„ด: file-patterns.ts์—์„œ ๊ด€๋ฆฌ๋˜๋ฉฐ, checksum์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ์ง€

์ˆ˜๋™ ๋™๊ธฐํ™”

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์—†์ด ์ˆ˜๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์‹คํ–‰ ๊ฒฐ๊ณผ:

์ž๋™ ๋™๊ธฐํ™” (HMR)

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ ์ค‘์—๋Š” ํŒŒ์ผ ๋ณ€๊ฒฝ์ด ์ž๋™์œผ๋กœ ๊ฐ์ง€๋˜๊ณ  ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
HMR ๋กœ๊ทธ ์˜ˆ์‹œ:

Syncer ์ด๋ฒคํŠธ

Syncer๋Š” EventEmitter๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
์ด๋ฒคํŠธ ์ข…๋ฅ˜:

Syncer ์•ก์…˜

ํŒŒ์ผ ๋ณ€๊ฒฝ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์•ก์…˜์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

1. Entity ๋ณ€๊ฒฝ (handleTruthSourceChanges)

Entity ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์Šคํ‚ค๋งˆ๋ฅผ ์žฌ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ: *.entity.json ํŒŒ์ผ ๋ณ€๊ฒฝ ์•ก์…˜:
  1. EntityManager ์žฌ๋กœ๋“œ
  2. ์ƒˆ Entity๋ฉด *.types.ts ์ƒ์„ฑ
  3. ์Šคํ‚ค๋งˆ ํŒŒ์ผ ์ƒ์„ฑ:
    • sonamu.generated.ts
    • sonamu.generated.sso.ts
  4. ํƒ€๊ฒŸ์— ํŒŒ์ผ ๋ณต์‚ฌ

2. Types/Functions/Generated ๋ณ€๊ฒฝ

ํƒ€์ž… ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํƒ€๊ฒŸ์— ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ: *.types.ts, *.functions.ts, *.generated.ts ๋ณ€๊ฒฝ ์•ก์…˜:
  1. ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ ๋ชฉ๋ก ์ˆ˜์ง‘
  2. ๊ฐ ํƒ€๊ฒŸ(web, app)์— ๋ณต์‚ฌ
  3. sonamu import๋ฅผ ./sonamu.shared๋กœ ๋ณ€๊ฒฝ
sonamu.shared.ts: web/app์—๋Š” sonamu ํŒจํ‚ค์ง€๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ๊ณตํ†ต ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ shared ํŒŒ์ผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

3. Model/Frame ๋ณ€๊ฒฝ

Model ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด API ํด๋ผ์ด์–ธํŠธ๋ฅผ ์žฌ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ: *.model.ts, *.frame.ts ๋ณ€๊ฒฝ ์•ก์…˜:
  1. Model, Types, APIs ์žฌ๋กœ๋“œ
  2. API ํด๋ผ์ด์–ธํŠธ ์ƒ์„ฑ (services.generated.ts)
  3. HTTP ํ…Œ์ŠคํŠธ ํŒŒ์ผ ์ƒ์„ฑ (sonamu.generated.http)
  4. SSR ํŒŒ์ผ ์žฌ์ƒ์„ฑ (queries.generated.ts, entry-server.generated.tsx)

4. Config ๋ณ€๊ฒฝ

์„ค์ • ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ: sonamu.config.ts ๋ณ€๊ฒฝ ์•ก์…˜:
  1. .sonamu.env ํŒŒ์ผ ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ
  2. ๊ฐ ํƒ€๊ฒŸ์— ๋ณต์‚ฌ
web/.sonamu.env

5. Workflow ๋ณ€๊ฒฝ

์›Œํฌํ”Œ๋กœ์šฐ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์žฌ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ: *.workflow.ts ๋ณ€๊ฒฝ ์•ก์…˜: ์›Œํฌํ”Œ๋กœ์šฐ ์žฌ๋กœ๋“œ ๋ฐ ๋™๊ธฐํ™”

6. i18n ๋ณ€๊ฒฝ

๋‹ค๊ตญ์–ด ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด SD ํŒŒ์ผ์„ ์žฌ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ: src/i18n/**/!(sd.generated).ts ๋ณ€๊ฒฝ ์•ก์…˜:
  1. Locale ํŒŒ์ผ์„ ํƒ€๊ฒŸ์— ๋ณต์‚ฌ
  2. sd.generated.ts ์ƒ์„ฑ (api, web, app)

7. SSR ์„ค์ • ๋ณ€๊ฒฝ

SSR ๋ผ์šฐํŠธ ์„ค์ • ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ฆ‰์‹œ ์žฌ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๊ฑฐ: src/ssr/**/*.ts ๋ณ€๊ฒฝ ์•ก์…˜:
  1. ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ ๋ฌดํšจํ™” (HMR)
  2. SSR ๋ผ์šฐํŠธ ์ „์ฒด ์žฌ๋กœ๋“œ (autoloadSSRRoutes)
  3. HMR ์™„๋ฃŒ ์ด๋ฒคํŠธ ๋ฐœ์ƒ
SSR ์„ค์ • ๋ณ€๊ฒฝ์€ ์ฒดํฌ์„ฌ ๊ธฐ๋ฐ˜ ๋™๊ธฐํ™” ๋Œ€์ƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. Watcher๊ฐ€ ์ง์ ‘ ๊ฐ์ง€ํ•˜์—ฌ ๋ณ„๋„์˜ ๊ฒฝ๋กœ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Checksum ๊ธฐ๋ฐ˜ ๋ณ€๊ฒฝ ๊ฐ์ง€

Syncer๋Š” ํŒŒ์ผ์˜ checksum์„ ์ €์žฅํ•˜์—ฌ ํšจ์œจ์ ์œผ๋กœ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
sonamu.lock
์ž‘๋™ ๋ฐฉ์‹:
  1. ํŒŒ์ผ ๋‚ด์šฉ์˜ SHA-1 ํ•ด์‹œ ๊ณ„์‚ฐ
  2. ์ €์žฅ๋œ checksum๊ณผ ๋น„๊ต
  3. ๋‹ค๋ฅด๋ฉด ๋ณ€๊ฒฝ์œผ๋กœ ํŒ๋‹จ
  4. ๋™๊ธฐํ™” ํ›„ checksum ๊ฐฑ์‹ 
์žฅ์ :
  • ๋น ๋ฅธ ๋ณ€๊ฒฝ ๊ฐ์ง€ (ํŒŒ์ผ ๋‚ด์šฉ ๋น„๊ต ๋ถˆํ•„์š”)
  • ์ •ํ™•ํ•œ ๋ณ€๊ฒฝ ์ถ”์  (timestamp ์˜ํ–ฅ ์—†์Œ)
  • ์—ฌ๋Ÿฌ ํŒŒ์ผ ๋™์‹œ ๋ณ€๊ฒฝ ์ฒ˜๋ฆฌ

Syncer API

Syncer๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜๋™ ๋™๊ธฐํ™”

ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ

๋ชจ๋“ˆ ๋กœ๋“œ

Syncer ์„ค์ •

sonamu.config.ts์—์„œ Syncer ๋™์ž‘์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
api/src/sonamu.config.ts

๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ

Syncer๋ฅผ ํ™œ์šฉํ•œ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ ํ๋ฆ„์ž…๋‹ˆ๋‹ค:
1

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘

Syncer๊ฐ€ ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ฐ์‹œํ•ฉ๋‹ˆ๋‹ค.
2

Entity ์ •์˜

Sonamu UI์—์„œ Entity๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ .entity.json ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.์ž๋™ ์‹คํ–‰:
  • *.types.ts ์ƒ์„ฑ
  • sonamu.generated.ts ๊ฐฑ์‹ 
  • sonamu.generated.sso.ts ๊ฐฑ์‹ 
  • ํƒ€๊ฒŸ์— ํŒŒ์ผ ๋ณต์‚ฌ
3

Model ์ž‘์„ฑ

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ Model์— ์ž‘์„ฑํ•˜๊ณ  @api ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.์ž๋™ ์‹คํ–‰:
  • services.generated.ts ๊ฐฑ์‹ 
  • sonamu.generated.http ๊ฐฑ์‹ 
  • SSR ํŒŒ์ผ ๊ฐฑ์‹ 
4

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ

์ƒ์„ฑ๋œ API ํด๋ผ์ด์–ธํŠธ์™€ Types๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ UI๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.
5

์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜

Model์ด๋‚˜ Entity๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด HMR๋กœ ์ฆ‰์‹œ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.๋ธŒ๋ผ์šฐ์ € ์ƒˆ๋กœ๊ณ ์นจ ์—†์ด ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ ๊ฐ€๋Šฅ!

๋ฌธ์ œ ํ•ด๊ฒฐ

Syncer๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๋•Œ

ํ™•์ธ ์‚ฌํ•ญ:
  1. ๊ฐœ๋ฐœ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธ
  2. ํŒŒ์ผ์ด ๊ฐ์‹œ ๋Œ€์ƒ ํŒจํ„ด์— ํฌํ•จ๋˜๋Š”์ง€ ํ™•์ธ
  3. Checksum ํŒŒ์ผ ์‚ญ์ œ ํ›„ ์žฌ์‹œ๋„
ํ™•์ธ ์‚ฌํ•ญ:
  1. sonamu.config.ts์˜ sync.targets ํ™•์ธ
  2. ํƒ€๊ฒŸ ๋””๋ ‰ํ† ๋ฆฌ ์กด์žฌ ํ™•์ธ
  3. ํƒ€๊ฒŸ ๋””๋ ‰ํ† ๋ฆฌ์— src/services/ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
์ตœ์ ํ™” ๋ฐฉ๋ฒ•:
  1. Node.js ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ (v22+)
  2. SSD ์‚ฌ์šฉ (HDD๋Š” ๋А๋ฆผ)
  3. ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์ œ์™ธ
  4. TypeScript ํ”„๋กœ์ ํŠธ ๋ถ„๋ฆฌ (monorepo)
์›์ธ: sonamu import๊ฐ€ ./sonamu.shared๋กœ ๋ณ€ํ™˜๋˜์ง€ ์•Š์Œํ•ด๊ฒฐ:

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

When Files Regenerate

ํŒŒ์ผ ์žฌ์ƒ์„ฑ ์‹œ์  ์ƒ์„ธ ๊ฐ€์ด๋“œ

Customizing Generated Code

์ƒ์„ฑ๋œ ์ฝ”๋“œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๋ฐฉ๋ฒ•

Templates

์ปค์Šคํ…€ ํ…œํ”Œ๋ฆฟ ๋งŒ๋“ค๊ธฐ

HMR System

HMR ์‹œ์Šคํ…œ ๊นŠ์ด ์ดํ•ดํ•˜๊ธฐ