μλ² μ¬μμ μμ΄ κ°λ°νκΈ°
Sonamuλ‘ κ°λ°ν λλ μ΄λ μ΅λλ€:- μ½λ μμ
- μ μ₯ (Cmd+S)
- λ! π λ°λ‘ λ°μλ¨
μ€μ κ°λ° μλ μ°¨μ΄
HMR μμ΄ (μ ν΅μ λ°©μ):- HMR μμ΄: 50 Γ 30μ΄ = 25λΆ λλΉ
- HMR μμ λ: 50 Γ 2μ΄ = 1.7λΆ
λ€λ₯Έ νλ μμν¬μμ μ°¨μ΄
Sonamuλ§μ νΉλ³ν¨
μΌλ°μ μΈ Node.js HMR:- λ¨μν νμΌ μ¬λ‘λλ§ ν¨
- μλ μμ± μ½λλ μ§μ κ΄λ¦¬ νμ
- Entity λ³κ²½ μ μ¬λ¬ νμΌ μλ μμ
- νμΌ μ¬λ‘λ + Syncer μλ μ€ν
- Entity λ³κ²½ β λͺ¨λ κ΄λ ¨ μ½λ μλ μμ±/μ λ°μ΄νΈ
- μμ‘΄νλ λͺ¨λ νμΌ μλ μ¬λ‘λ
- API μλ μ¬λ±λ‘
μ€μ κ°λ° μλ리μ€
μλλ¦¬μ€ 1: Entity νλ μΆκ°νκΈ°
User Entityμnickname νλλ₯Ό μΆκ°νλ κ³Όμ :
1λ¨κ³: Sonamu UIμμ νλ μΆκ°
user.entity.tsμλ μ λ°μ΄νΈuser.types.tsνμ μλ μμ±user.zod.tsZod μ€ν€λ§ μλ μμ±UserModelμλ μ¬λ‘λ- λͺ¨λ UserApi λ©μλ μλ μ¬λ±λ‘
- νλ‘ νΈμλ
UserServiceμλ μ λ°μ΄νΈ
β±οΈ HMR μμ λ: 30μ΄ (μλ² μ¬μμ + μ¬μ»΄νμΌ)
μλλ¦¬μ€ 2: API λ‘μ§ μμ νκΈ°
UserApi.list()μ νμ΄μ§λ€μ΄μ
κ³Ό κ²μ κΈ°λ₯ μΆκ°:
μλλ¦¬μ€ 3: Model λΉμ¦λμ€ λ‘μ§ μΆκ°
Userμ νμ± μν μ²΄ν¬ λ‘μ§ μΆκ°:Sonamu HMRμ νμ : Syncer ν΅ν©
μΌλ°μ μΈ Node.js HMRμ βνμΌμ΄ λ°λμλ€? λ€μ λΆλ¬μ€μβκ° μ λΆμ λλ€. νμ§λ§ Sonamuλ λ€λ¦ λλ€.λ¬Έμ : μλ μμ± μ½λμ λλ λ§
Sonamuλ Entity κΈ°λ°μΌλ‘ μλ§μ μ½λλ₯Ό μλ μμ±ν©λλ€:- TypeScript νμ
νμΌ (
*.types.ts) - Zod μ€ν€λ§ (
*.zod.ts) - API λΌμ°νΈ λ±λ‘
- νλ‘ νΈμλ Service ν΄λμ€
Sonamuμ ν΄κ²°μ±
Watcherκ° λͺ¨μ νμΌ μ΄λ²€νΈλ€μ Syncerκ° ν μ§μ μ (hmrAndSync)μμ λ°μ HMRκ³Ό syncλ₯Ό μμλ³λ‘
λΆλ¦¬ν΄μ μ²λ¦¬ν©λλ€:
- μ½λ μμ±μ΄ μμ ν λλ ν
- μ¬λ‘λκ° μμλ¨
- νμ μ΅μ μ½λκ° λ‘λλ¨ β
Watcherλ 100ms μ μ batch νμμΌλ‘ λ³κ²½ μ΄λ²€νΈλ₯Ό λͺ¨μ λ€
hmrAndSyncλ₯Ό ν λ² νΈμΆν©λλ€. ν
μμ μ μ¬μ΄ν΄μ νλλ§ λλλ‘ μ§λ ¬νλ©λλ€.HMR μν€ν μ²
μ£Όμ μ»΄ν¬λνΈ
Sonamuμ HMR μμ€ν μ μΈ κ°μ§ ν΅μ¬ μ»΄ν¬λνΈλ‘ ꡬμ±λ©λλ€: 1. @sonamu-kit/hmr-hook hot-hookμ forkνμ¬ Sonamuμ λ§κ² 컀μ€ν°λ§μ΄μ§ν ν¨ν€μ§μ λλ€.user.model.tsκ° λ³κ²½λλ©΄ μμ‘΄νλ 3κ° νμΌλ ν¨κ» μ¬λ‘λλ©λλ€.
μμ: user.model.tsκ° λ³κ²½λλ©΄ μμ‘΄νλ 3κ° νμΌ(user.api.ts, post.api.ts, admin.api.ts)λ ν¨κ» μ¬λ‘λλ©λλ€.
3. Watcher + Syncer
syncer/watcher.ts(chokidar κΈλ£¨)κ° νμΌ μ΄λ²€νΈλ₯Ό 4λ¨ 1μ°¨ κ°λλ‘ κ±°λ₯Έ λ€ 100ms μ μ batchλ‘ νμ,
ν λ²μ λͺ¨μμ Syncerμ hmrAndSyncλ₯Ό νΈμΆν©λλ€:
HMR νλ‘μΈμ€ μμΈ
κ°λ°μκ° νμΌμ μμ νλ©΄ λ€μ κ³Όμ μ΄ μλμΌλ‘ μ€νλ©λλ€:1. νμΌ λ³κ²½ κ°μ§
2. λͺ¨λ 무ν¨ν
3. μλ μμ± μ½λ μ±ν¬
Entityλ Modelμ΄ λ³κ²½λ κ²½μ°, Syncerκ° κ΄λ ¨ μ½λλ₯Ό μλ μμ±ν©λλ€:- TypeScript νμ
νμΌ (
user.types.ts) - Zod μ€ν€λ§ (
user.zod.ts) - νλ‘ νΈμλ Service (
UserService.ts)
4. λͺ¨λ μ¬λ‘λ
5. API μ¬λ±λ‘
Model νμΌμ΄ λ³κ²½λλ©΄ ν΄λΉ Modelμ λͺ¨λ APIλ₯Ό μ¬λ±λ‘ν©λλ€:μλ³Έ hot-hookκ³Όμ μ°¨μ΄μ
Sonamuμ@sonamu-kit/hmr-hookμ μλ³Έ hot-hookμ forkνμ¬ λ€μκ³Ό κ°μ΄ κ°μ νμ΅λλ€:
1. λ³μ κΈ°λ° λμ Import νμ©
2. Boundary κ° μ μ Import νμ©
3. νμΌμμ€ν μμ² λΉνμ±ν
μλ³Έμ μ체 νμΌ μμ²λ₯Ό μ¬μ©νμ§λ§, Sonamuλ Syncerμ μμ²λ§ μ¬μ©ν©λλ€:4. ts-loaderμμ ν΅ν© κ°μ
TypeScript μ»΄νμΌ νdist/*.js κ²½λ‘μ μλ³Έ src/*.ts κ²½λ‘μ λΆμΌμΉλ₯Ό ν΄κ²°νμ΅λλ€.
μ±λ₯ μ΅μ ν
μ νμ 무ν¨ν
λ³κ²½λ νμΌκ³Ό κ·Έ μμ‘΄μ±λ§ 무ν¨ννλ―λ‘ λΆνμν μ¬λ‘λλ₯Ό λ°©μ§ν©λλ€:체ν¬μ¬ κΈ°λ° λ³κ²½ κ°μ§
μ€μ λ΄μ©μ΄ λ³κ²½λ νμΌλ§ μ²λ¦¬ν©λλ€:Graceful Shutdown μ²λ¦¬
μ±ν¬ μμ μ€ νλ‘μΈμ€ μ’ λ£λ₯Ό λ°©μ§ν©λλ€:HMR νμ±ν
κ°λ° λͺ¨λμμ μλμΌλ‘ νμ±νλ©λλ€:νλ‘λμ
λΉλμμλ HMRμ΄ μλμΌλ‘ λΉνμ±νλλ©°, μ μ λΉλκ° μμ±λ©λλ€.
κ°λ° ν
HMR μν νμΈ
λλ €μ§ κ² κ°λ€λ©΄
νμΌμ μμ νλλ° λ°μμ΄ λλ €μ§ κ² κ°λ€λ©΄:μ¬μμμ΄ νμν λ³κ²½μ¬ν
λ€μ νμΌλ€μ μμ νλ©΄ μλ²λ₯Ό μ¬μμν΄μΌ ν©λλ€:sonamu.config.ts- μ€μ νμΌ.env- νκ²½λ³μpackage.json- μμ‘΄μ±
import.meta.hot?.decline()μΌλ‘ νμλμ΄ μμ΄ λ³κ²½ μ μλμΌλ‘ μ¬μμμ μꡬν©λλ€.