Syncer๋?
ํ์ผ ๋ณ๊ฒฝ ๊ฐ์ง
Entity, Model, Types ํ์ผ ๋ณ๊ฒฝ ์ถ์ Checksum ๊ธฐ๋ฐ ํจ์จ์ ๊ฐ์ง
์๋ ์ฝ๋ ์์ฑ
ํ์
, ์คํค๋ง, API ํด๋ผ์ด์ธํธ ์์ฑTemplate ๊ธฐ๋ฐ ์์ฑ
HMR ์ง์
๊ฐ๋ฐ ์ค ์ค์๊ฐ ๋ฐ์ํ์ผ ๋ฌดํจํ ๋ฐ ์ฌ๋ก๋
๋ฉํฐ ํ๊ฒ ๋๊ธฐํ
web, app ๋ฑ ์ฌ๋ฌ ํ๋ก์ ํธ ๋๊ธฐํ์๋ ํ์ผ ๋ณต์ฌ
Syncer์ ๋์ ํ๋ฆ
๊ฐ์ ๋์ ํ์ผ
Syncer๊ฐ ๋ณ๊ฒฝ์ ์ถ์ ํ๋ ํ์ผ ํจํด์ ๋๋ค:ํ์ผ ํจํด:
file-patterns.ts์์ ๊ด๋ฆฌ๋๋ฉฐ, checksum์ผ๋ก ๋ณ๊ฒฝ ๊ฐ์ง์๋ ๋๊ธฐํ
๊ฐ๋ฐ ์๋ฒ ์์ด ์๋์ผ๋ก ๋๊ธฐํํ ์ ์์ต๋๋ค.์๋ ๋๊ธฐํ (HMR)
๊ฐ๋ฐ ์๋ฒ ์คํ ์ค์๋ ํ์ผ ๋ณ๊ฒฝ์ด ์๋์ผ๋ก ๊ฐ์ง๋๊ณ ๋๊ธฐํ๋ฉ๋๋ค.Syncer ์ด๋ฒคํธ
Syncer๋ EventEmitter๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํต๋๋ค.Syncer ์ก์
ํ์ผ ๋ณ๊ฒฝ ์ ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ก์ ์ด ์คํ๋ฉ๋๋ค.1. Entity ๋ณ๊ฒฝ (handleTruthSourceChanges)
Entity ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด ์คํค๋ง๋ฅผ ์ฌ์์ฑํฉ๋๋ค.
ํธ๋ฆฌ๊ฑฐ: *.entity.json ํ์ผ ๋ณ๊ฒฝ
์ก์
:
- EntityManager ์ฌ๋ก๋
- ์ Entity๋ฉด
*.types.ts์์ฑ - ์คํค๋ง ํ์ผ ์์ฑ:
sonamu.generated.tssonamu.generated.sso.ts
- ํ๊ฒ์ ํ์ผ ๋ณต์ฌ
2. Types/Functions/Generated ๋ณ๊ฒฝ
ํ์ ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด ํ๊ฒ์ ๋ณต์ฌํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ:*.types.ts, *.functions.ts, *.generated.ts ๋ณ๊ฒฝ
์ก์
:
- ๋ณ๊ฒฝ๋ ํ์ผ ๋ชฉ๋ก ์์ง
- ๊ฐ ํ๊ฒ(
web,app)์ ๋ณต์ฌ sonamuimport๋ฅผ./sonamu.shared๋ก ๋ณ๊ฒฝ
sonamu.shared.ts: web/app์๋ sonamu ํจํค์ง๊ฐ ์์ผ๋ฏ๋ก, ๊ณตํต ์ ํธ๋ฆฌํฐ๋ฅผ shared ํ์ผ๋ก ์ ๊ณตํฉ๋๋ค.
3. Model/Frame ๋ณ๊ฒฝ
Model ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด API ํด๋ผ์ด์ธํธ๋ฅผ ์ฌ์์ฑํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ:*.model.ts, *.frame.ts ๋ณ๊ฒฝ
์ก์
:
- Model, Types, APIs ์ฌ๋ก๋
- API ํด๋ผ์ด์ธํธ ์์ฑ (
services.generated.ts) - HTTP ํ
์คํธ ํ์ผ ์์ฑ (
sonamu.generated.http) - SSR ํ์ผ ์ฌ์์ฑ (
queries.generated.ts,entry-server.generated.tsx)
4. Config ๋ณ๊ฒฝ
์ค์ ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด ํ๊ฒฝ ๋ณ์๋ฅผ ๋๊ธฐํํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ:sonamu.config.ts ๋ณ๊ฒฝ
์ก์
:
.sonamu.envํ์ผ ์์ฑ/์ ๋ฐ์ดํธ- ๊ฐ ํ๊ฒ์ ๋ณต์ฌ
web/.sonamu.env
5. Workflow ๋ณ๊ฒฝ
์ํฌํ๋ก์ฐ ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด ์ฌ๋ก๋ํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ:*.workflow.ts ๋ณ๊ฒฝ
์ก์
: ์ํฌํ๋ก์ฐ ์ฌ๋ก๋ ๋ฐ ๋๊ธฐํ
6. i18n ๋ณ๊ฒฝ
๋ค๊ตญ์ด ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด SD ํ์ผ์ ์ฌ์์ฑํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ:src/i18n/**/!(sd.generated).ts ๋ณ๊ฒฝ
์ก์
:
- Locale ํ์ผ์ ํ๊ฒ์ ๋ณต์ฌ
sd.generated.ts์์ฑ (api, web, app)
7. SSR ์ค์ ๋ณ๊ฒฝ
SSR ๋ผ์ฐํธ ์ค์ ํ์ผ์ด ๋ณ๊ฒฝ๋๋ฉด ์ฆ์ ์ฌ๋ก๋ํฉ๋๋ค. ํธ๋ฆฌ๊ฑฐ:src/ssr/**/*.ts ๋ณ๊ฒฝ
์ก์
:
- ๋ณ๊ฒฝ๋ ํ์ผ ๋ฌดํจํ (HMR)
- SSR ๋ผ์ฐํธ ์ ์ฒด ์ฌ๋ก๋ (
autoloadSSRRoutes) - HMR ์๋ฃ ์ด๋ฒคํธ ๋ฐ์
SSR ์ค์ ๋ณ๊ฒฝ์ ์ฒดํฌ์ฌ ๊ธฐ๋ฐ ๋๊ธฐํ ๋์์ด ์๋๋๋ค. Watcher๊ฐ ์ง์ ๊ฐ์งํ์ฌ ๋ณ๋์ ๊ฒฝ๋ก๋ก ์ฒ๋ฆฌํฉ๋๋ค.
Checksum ๊ธฐ๋ฐ ๋ณ๊ฒฝ ๊ฐ์ง
Syncer๋ ํ์ผ์ checksum์ ์ ์ฅํ์ฌ ํจ์จ์ ์ผ๋ก ๋ณ๊ฒฝ์ ๊ฐ์งํฉ๋๋ค.sonamu.lock
- ํ์ผ ๋ด์ฉ์ SHA-1 ํด์ ๊ณ์ฐ
- ์ ์ฅ๋ checksum๊ณผ ๋น๊ต
- ๋ค๋ฅด๋ฉด ๋ณ๊ฒฝ์ผ๋ก ํ๋จ
- ๋๊ธฐํ ํ checksum ๊ฐฑ์
- ๋น ๋ฅธ ๋ณ๊ฒฝ ๊ฐ์ง (ํ์ผ ๋ด์ฉ ๋น๊ต ๋ถํ์)
- ์ ํํ ๋ณ๊ฒฝ ์ถ์ (timestamp ์ํฅ ์์)
- ์ฌ๋ฌ ํ์ผ ๋์ ๋ณ๊ฒฝ ์ฒ๋ฆฌ
Syncer API
Syncer๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.์๋ ๋๊ธฐํ
ํ ํ๋ฆฟ ์์ฑ
๋ชจ๋ ๋ก๋
Syncer ์ค์
sonamu.config.ts์์ Syncer ๋์์ ์ค์ ํ ์ ์์ต๋๋ค.
api/src/sonamu.config.ts
๊ฐ๋ฐ ์ํฌํ๋ก์ฐ
Syncer๋ฅผ ํ์ฉํ ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ ํ๋ฆ์ ๋๋ค:1
๊ฐ๋ฐ ์๋ฒ ์์
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๊ฐ ๋์ํ์ง ์์ ๋
ํ์ผ์ด ์์ฑ๋์ง ์์
ํ์ผ์ด ์์ฑ๋์ง ์์
ํ์ธ ์ฌํญ:
- ๊ฐ๋ฐ ์๋ฒ๊ฐ ์คํ ์ค์ธ์ง ํ์ธ
- ํ์ผ์ด ๊ฐ์ ๋์ ํจํด์ ํฌํจ๋๋์ง ํ์ธ
- Checksum ํ์ผ ์ญ์ ํ ์ฌ์๋
ํ๊ฒ์ ํ์ผ์ด ๋ณต์ฌ๋์ง ์์
ํ๊ฒ์ ํ์ผ์ด ๋ณต์ฌ๋์ง ์์
ํ์ธ ์ฌํญ:
sonamu.config.ts์sync.targetsํ์ธ- ํ๊ฒ ๋๋ ํ ๋ฆฌ ์กด์ฌ ํ์ธ
- ํ๊ฒ ๋๋ ํ ๋ฆฌ์
src/services/๋๋ ํ ๋ฆฌ ์์ฑ
HMR์ด ๋๋ฆผ
HMR์ด ๋๋ฆผ
์ต์ ํ ๋ฐฉ๋ฒ:
- Node.js ์ต์ ๋ฒ์ ์ฌ์ฉ (v22+)
- SSD ์ฌ์ฉ (HDD๋ ๋๋ฆผ)
- ๋ถํ์ํ ํ์ผ ์ ์ธ
- TypeScript ํ๋ก์ ํธ ๋ถ๋ฆฌ (monorepo)
import ์๋ฌ ๋ฐ์
import ์๋ฌ ๋ฐ์
์์ธ:
sonamu import๊ฐ ./sonamu.shared๋ก ๋ณํ๋์ง ์์ํด๊ฒฐ:๋ค์ ๋จ๊ณ
When Files Regenerate
ํ์ผ ์ฌ์์ฑ ์์ ์์ธ ๊ฐ์ด๋
Customizing Generated Code
์์ฑ๋ ์ฝ๋ ์ปค์คํฐ๋ง์ด์ง ๋ฐฉ๋ฒ
Templates
์ปค์คํ
ํ
ํ๋ฆฟ ๋ง๋ค๊ธฐ
HMR System
HMR ์์คํ
๊น์ด ์ดํดํ๊ธฐ