이벤트 다루기
ํ๋ ์์คํ ์์ DDD(Domain-Driven Design) ๋ฐ ํด๋ฆฐ ์ํคํ ์ฒ(Clean Architecture)์ ๊ฐ์ ์ํคํ ์ฒ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒฝ์ฐ, ์ด๋ฒคํธ๋ ์ํ ๋ณ๊ฒฝ์ ๋ชจ๋ธ๋งํ๊ณ ๊ตฌ์ฑ ์์ ๋๋ ์์คํ ๊ฐ ๋น๋๊ธฐ ํต์ ์ ์ํํ๋ ๋ฐ ํ์์ ์ธ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด๋ฒคํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋๋ฉ์ธ์์ ์ด๋ฏธ ๋ฐ์ํ ์ผ์ด๋ฉฐ, ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ด๋ ์ธ๋ถ ์๋น์ค์์ ๊ด์ฌ์ ๊ฐ์ง ์ ์์ต๋๋ค.
๋๋ฉ์ธ ์ด๋ฒคํธ
๋๋ฉ์ธ ์ด๋ฒคํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ ๋ด์์ ๋ฐ์ํ ์ค์ํ ์ฌ์ค์ ๋ํ๋ ๋๋ค. ์ด ์ด๋ฒคํธ๋ ์์คํ ๋ด๋ถ์์ ์์ฑ ๋ฐ ์๋น๋๋ฉฐ, ์ํ ๋ณ๊ฒฝ์ ๋์จํ๊ฒ ๊ฒฐํฉ๋ ๋ฐฉ์์ผ๋ก ์ ํํ ์ ์์ต๋๋ค. ์ฆ, ๊ฐ์ฒด๋ค์ด ์๋ก๋ฅผ ์ง์ ์ ํ์๊ฐ ์์ต๋๋ค.
๋๋ฉ์ธ ์ด๋ฒคํธ๋ฅผ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์?
- ์ด๋ค ์์ ์ด ๋๋ฉ์ธ์ ์ค์ํ ๋ณํ๋ฅผ ์ผ์ผํค๊ณ , ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์๋ฆผ ๋๋ ํธ๋ฆฌ๊ฑฐ๊ฐ ํ์ํ ๋.
- ๋๋ฉ์ธ ๋ชจ๋ธ์ ์์ง๋ ฅ์ ์ ์งํ๊ณ , ์๋ก ์ง์ ์์กดํ์ง ์๊ณ ๋ ๋ค์ํ ํ๋ก์ธ์ค๋ฅผ ํธ๋ฆฌ๊ฑฐํ ์ ์๋๋ก ํ ๋.
Lino์์๋ ์๋ก์ด ๋๋ฉ์ธ ์ด๋ฒคํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ๋ค์ ๋ช ๋ น์ ์คํํ์ธ์:
lino event new
CLI ๋ง๋ฒ์ฌ๊ฐ ๋ค์์ ์์ฒญํฉ๋๋ค:
- ์๋น์ค โ ์ด๋ฒคํธ๊ฐ ์์ฑ๋ ์๋น์ค.
- ๋ชจ๋ โ ์ด๋ฒคํธ๊ฐ ์์ฑ๋ ๋ชจ๋(๋ชจ๋ํ ์๋น์ค๋ง ํด๋น).
- ์ํฐํฐ โ ์ด๋ฒคํธ๊ฐ ์์ฑ/์ฐ๊ฒฐ๋ ์ํฐํฐ.
- ์ด๋ฒคํธ ์ ํ โ ๋๋ฉ์ธ ์ด๋ฒคํธ ๋๋ ํตํฉ ์ด๋ฒคํธ.
- ์ด๋ฒคํธ ์ด๋ฆ โ ๋๋ฉ์ธ์์ ์ฌ์ฉ๋๋ฉฐ ์ํฐํฐ์ ์ฐ๊ฒฐ๋๋ ์ด๋ฆ.
์์
User ์ํฐํฐ์ ์ฐ๊ฒฐ๋ ๋๋ฉ์ธ ์ด๋ฒคํธ UserCreated๋ฅผ ์์ฑํ๋ฉด,
์์คํ
์ ์๋์ผ๋ก UserCreatedDomainEvent๋ผ๋ ์ด๋ฆ์ ์ด๋ฒคํธ๋ฅผ ์์ฑํฉ๋๋ค.
์ด ์ด๋ฆ์ ์ด๋ฒคํธ๋ฅผ ์๋นํ๋ ์์คํ
์ ์ด๋ ๋ถ๋ถ์์๋ ์ฌ์ฉ์ ์์ฑ ์์
์ด ์ด๋ฏธ ์๋ฃ๋์์์ ๋ช
ํํ ๋ณด์ฌ์ค๋๋ค.
Lino๊ฐ ์์ฑํ ๊ตฌ์กฐ:
MyApp/
โโโ src/
โโโ Services/
โโโ MyService/
โโโ Domain/
โโโ MyApp.MyService.Domain.csproj
โโโ Aggregates/
โโโ Users/
โโโ User.cs
โโโ Errors/
โโโ Events/
โ โโโ UserCreatedDomainEvent.cs
โโโ Repositories/
โโโ Resources/
๋๋ฉ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ
Domain Event Handler๋ ๋๋ฉ์ธ ์ด๋ฒคํธ์ ๋ฐ์ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ด๋ถ ์ํ์ ๊ด๋ จ๋ ์์ ์ ์ํํ๋ ํด๋์ค์ด๋ฉฐ, ํญ์ ๋์ผํ ํธ๋์ญ์ ์ปจํ ์คํธ ๋ด์์ ์คํ๋ฉ๋๋ค.
์ด๋ฌํ ํธ๋ค๋ฌ์ ์ฃผ์ ๋ชฉ์ ์ ์์คํ ์ ์์ง๋ ฅ ์๊ณ ๋์จํ๊ฒ ๊ฒฐํฉ๋ ์ํ๋ก ์ ์งํ์ฌ ์ํฐํฐ๋ ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ์ ํต์ฌ ๋ก์ง์ ๊ณผ๋ถํํ์ง ์๊ณ ์ถ๊ฐ ๊ท์น์ ์ ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด User๋ฅผ ์์ฑํ ํ ํต๊ณ๋ฅผ ์
๋ฐ์ดํธํ๊ฑฐ๋ ๋ด๋ถ ๋ก๊ทธ๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ์ ์๋ฆผ์ ๋ณด๋ด์ผ ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์์
์ ๋๋ฉ์ธ ๋ด์์ ์๋ฏธ๊ฐ ์์ผ๋ฉฐ ๋๊ธฐ์ ์ผ๋ก ์ํ๋ ์ ์์ด ์ฆ๊ฐ์ ์ธ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ธ๋ถ ๋ฆฌ์์ค์ ์์กดํ๋ ์์ โ ์ด๋ฉ์ผ ์ ์ก ๋๋ ์๋ํํฐ API ํธ์ถ ๋ฑ โ ์ ๋๋ฉ์ธ ์ด๋ฒคํธ์์ ์ง์ ์ํํด์๋ ์ ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํธ๋์ญ์ ์ด ๋๋ฆฌ๊ฑฐ๋ ๋ถ์์ ํ ์์ ์ ๋ฌถ์ด๊ฒ ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๊ฒฝ์ฐ ๋๋ฉ์ธ์ ํตํฉ ์ด๋ฒคํธ(Outbox์ ๊ธฐ๋ก)๋ฅผ ์์ฑํ๊ณ ๋์ค์ ๋น๋๊ธฐ์ ์ด๊ณ ํ๋ณต๋ ฅ ์๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค.
์ฃผ์ ํน์ง:
- ์ด๋ฒคํธ์ ๋ฐ์ํ์ง๋ง ์ ๋ ์์ ํ์ง ์์ต๋๋ค.
- ๋๋ฉ์ธ ์ผ๊ด์ฑ๊ณผ ๊ด๋ จ๋ ์ธํ๋ก์ธ์ค ์์ ๋ง ์ํํฉ๋๋ค.
- ๋ชจ๋ ์์ ์ด ๋์ผํ ํธ๋์ญ์ ๋ด์์ ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
์๋ก์ด ๋๋ฉ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์:
lino event-handler new
CLI ๋ง๋ฒ์ฌ๊ฐ ๋ค์์ ์์ฒญํฉ๋๋ค:
- ์๋น์ค โ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์์ฑ๋ ์๋น์ค.
- ๋ชจ๋ โ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์์ฑ๋ ๋ชจ๋(๋ชจ๋ํ ์๋น์ค์์๋ง ํด๋น).
- ์ํฐํฐ โ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์์ฑ๋ ์ํฐํฐ.
- ์ด๋ฒคํธ ์ ํ โ ๋๋ฉ์ธ ์ด๋ฒคํธ ๋๋ ํตํฉ ์ด๋ฒคํธ.
- ์ด๋ฒคํธ โ ์๋น๋ ์ด๋ฒคํธ.
- ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ด๋ฆ โ ์ํฐํฐ ๋ฐ ๋๋ฉ์ธ ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ์ด๋ฆ.
์์
User ์ํฐํฐ์ UserCreatedDomainEvent ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ๋๋ฉ์ธ ์ด๋ฒคํธ ํธ๋ค๋ฌ UserCreated๋ฅผ ์์ฑํ๋ฉด, ์์คํ
์ ์๋์ผ๋ก UserCreatedDomainEventHandler๋ผ๋ ์ด๋ฆ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์์ฑํฉ๋๋ค.
Lino๊ฐ ์์ฑํ ๊ตฌ์กฐ:
MyApp/
โโโ src/
โโโ Services/
โโโ MyService/
โโโ Application/
โโโ MyApp.MyService.Application.csproj
โโโ UseCases/
โโโ Users/
โโโ Commands/
โโโ EventHandlers/
โ โโโ Domain/
โ โโโ UserCreatedDomainEventHandler.cs
โโโ Logging/
โโโ Queries/
โโโ Resources/
ํตํฉ ์ด๋ฒคํธ
ํตํฉ ์ด๋ฒคํธ๋ ์ค์ํ ์ผ์ด ๋ฐ์ํ์์ ์๋ฆฌ๋ ๋ฉ์์ง์ด๋ฉฐ, ์ธ๋ถ ์์คํ ์ด๋ ๋ค๋ฅธ ๋ง์ดํฌ๋ก์๋น์ค์ ๊ณต์ ํด์ผ ํฉ๋๋ค.
๋๋ฉ์ธ ์ด๋ฒคํธ์ ๋ฌ๋ฆฌ, ์ฌ๊ธฐ์์ ๋ชฉ์ ์ ์์คํ ๊ฐ ํต์ ๋ฐ ์ํ ๋๊ธฐํ์ ๋๋ค.
ํตํฉ ์ด๋ฒคํธ๋ฅผ ์์ฑํ ๋:
- ์์คํ ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค๋ฅธ ์์คํ ์ ๋ฐ์ํด์ผ ํ ๋.
- ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฒ์ํ์ฌ ๋ค๋ฅธ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ๋ฐ์ํด์ผ ํ ๋.
๋๋ฉ์ธ ์ด๋ฒคํธ์ ํตํฉ ์ด๋ฒคํธ์ ์ฃผ์ ์ฐจ์ด์ :
| ํญ๋ชฉ | ๋๋ฉ์ธ ์ด๋ฒคํธ | ํตํฉ ์ด๋ฒคํธ |
|---|---|---|
| ๋์ | ๋ด๋ถ | ์ธ๋ถ |
| ๊ฒฐํฉ๋ | ๋ฎ์ (๋ด๋ถ) | ํ์ (์์คํ ๊ฐ) |
| ์ฒ๋ฆฌ ์๊ฐ | ์ฆ์ | ๋น๋๊ธฐ์ผ ์ ์์ผ๋ฉฐ, ์ ๋ฌ ๋ณด์ฅ ํฌํจ |
| ์์์ฑ ํ์ ์ฌ๋ถ | ํ์ ์๋ | ์ (์ ๋ขฐ์ฑ๊ณผ ๋ณต์๋ ฅ ํ๋ณด๋ฅผ ์ํด) |
Lino์์๋ ์ ํตํฉ ์ด๋ฒคํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค. ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ธ์:
lino event new
CLI ๋ง๋ฒ์ฌ๊ฐ ์์ฒญํ๋ ํญ๋ชฉ:
- ์๋น์ค โ ์ด๋ฒคํธ๋ฅผ ์์ฑํ ์๋น์ค.
- ๋ชจ๋ โ ์ด๋ฒคํธ๋ฅผ ์์ฑํ ๋ชจ๋ (๋ชจ๋ํ ์๋น์ค์์๋ง).
- ์ํฐํฐ โ ์ด๋ฒคํธ๋ฅผ ์์ฑ/์ฐ๊ฒฐํ ์ํฐํฐ.
- ์ด๋ฒคํธ ์ ํ โ ๋๋ฉ์ธ ์ด๋ฒคํธ ๋๋ ํตํฉ ์ด๋ฒคํธ.
- ์ด๋ฒคํธ ์ด๋ฆ โ ์ํฐํฐ์ ์ฐ๊ฒฐ๋ ํตํฉ ์ด๋ฒคํธ ์ด๋ฆ.
์์
User ์ํฐํฐ์ ์ฐ๊ฒฐ๋ ํตํฉ ์ด๋ฒคํธ UserCreated๋ฅผ ์์ฑํ๋ฉด, ์์คํ
์ ์๋์ผ๋ก UserCreatedIntegrationEvent๋ผ๋ ์ด๋ฆ์ ์ด๋ฒคํธ๋ฅผ ์์ฑํฉ๋๋ค.
์ด ์ด๋ฆ์ ์ด๋ฒคํธ๋ฅผ ์๋นํ๋ ์์คํ
์ ๋ชจ๋ ๋ถ๋ถ์์ ์ฌ์ฉ์ ์์ฑ ์์
์ด ์ด๋ฏธ ์๋ฃ๋์์์ ๋ช
ํํ๊ฒ ๋ํ๋
๋๋ค.
Lino๊ฐ ์์ฑํ ๊ตฌ์กฐ:
MyApp/
โโโ src/
โโโ Services/
โโโ MyService/
โโโ IntegrationEvents/
โโโ MyApp.MyService.IntegrationEvents.csproj
โโโ Users/
โโโ UserCreatedIntegrationEvent.cs
ํตํฉ ์ด๋ฒคํธ ํธ๋ค๋ฌ
Integration Event Handler ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ์๋น์ค๋ ์ปจํ ์คํธ์์ ๋ฐํ๋ Integration Event ๋ฅผ ์๋นํ๊ณ , ์์ ์ ๋๋ฉ์ธ ๋ด์์ ํน์ ์์ ์ ์ํํ๋ ํด๋์ค์ ๋๋ค.
์ด๋ฌํ ํธ๋ค๋ฌ๋ RabbitMQ, Kafka, Azure Service Bus ๋ฑ๊ณผ ๊ฐ์ ๋ฉ์์ง ๋ฉ์ปค๋์ฆ์ ํตํด ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก Outbox ํจํด๊ณผ ํจ๊ป ์ฌ์ฉ๋์ด ์์ ์ ์ธ ์ ๋ฌ๊ณผ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ณด์ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด, Identity ์๋น์ค์์ UserCreated ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ฉด, ๋ค๋ฅธ ์ปจํ
์คํธ์ ํด๋น ํธ๋ค๋ฌ๋
ํ์ ์ด๋ฉ์ผ์ ๋ณด๋ด๊ฑฐ๋ ์ธ๋ถ API๋ฅผ ํธ์ถํ๋ ๋ฑ์ ๋ฐ์์ ์ํํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์์
์ ๋๋ฆฌ๊ฑฐ๋ ์คํจํ ์ ์์ง๋ง, ๋ฉ์ธ ํธ๋์ญ์
์ธ๋ถ์์ ์ฒ๋ฆฌ๋๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋ด๋ถ ์ผ๊ด์ฑ์๋ ์ํฅ์ ์ฃผ์ง ์์ต๋๋ค.
์ฃผ์ ํน์ง:
- ๋ค๋ฅธ ์ปจํ ์คํธ์ ๊ด๋ จ๋ ๋น์ฆ๋์ค ์ฌ์ค์ ๋ํ๋ด๋ ์ด๋ฒคํธ์ ๋ฐ์ํฉ๋๋ค.
- ๋๋ฆฌ๊ฑฐ๋ ์ธ๋ถ ์์ (์: ์ด๋ฉ์ผ ๋ฐ์ก, API ํธ์ถ)์ ์ํํฉ๋๋ค.
- ๋น๋๊ธฐ์ ์ด๊ณ ๋ณต์๋ ฅ ์๊ฒ ์ฒ๋ฆฌ๋๋ฉฐ, ์ข ์ข ์ฌ์๋ ๋ฐ ๋ชจ๋ํฐ๋ง์ด ํฌํจ๋ฉ๋๋ค.
- ์ธ๋ถ ์คํจ๊ฐ ์๋ ๋๋ฉ์ธ ํธ๋์ญ์ ์ ์ํฅ์ ์ฃผ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ๋ฐ์ด๋๋ ์ปจํ ์คํธ ๋ฐ ๋ถ์ฐ ์์คํ ๊ฐ์ ํตํฉ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
์ ํตํฉ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํ์ธ์:
lino event-handler
CLI ๋ง๋ฒ์ฌ๊ฐ ์์ฒญํ๋ ํญ๋ชฉ:
- ์๋น์ค โ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์์ฑ๋ ์๋น์ค.
- ๋ชจ๋ โ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์์ฑ๋ ๋ชจ๋(๋ชจ๋ํ ์๋น์ค๋ง ํด๋น).
- ์ํฐํฐ โ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ์์ฑ๋ ์ํฐํฐ.
- ์ด๋ฒคํธ ์ ํ โ ๋๋ฉ์ธ ์ด๋ฒคํธ ๋๋ ํตํฉ ์ด๋ฒคํธ.
- ์๋น์ค โ ์๋นํ ์ด๋ฒคํธ๊ฐ ์กด์ฌํ๋ ์๋น์ค.
- ๋ชจ๋ โ ์๋นํ ์ด๋ฒคํธ๊ฐ ์กด์ฌํ๋ ๋ชจ๋(๋ชจ๋ํ ์๋น์ค๋ง ํด๋น).
- ์ํฐํฐ โ ์๋นํ ์ด๋ฒคํธ๊ฐ ์กด์ฌํ๋ ์ํฐํฐ.
- ์ด๋ฒคํธ โ ์๋นํ ์ด๋ฒคํธ.
- ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ด๋ฆ โ ์ํฐํฐ ๋ฐ ํตํฉ ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ์ด๋ฆ.
์์
User ์ํฐํฐ ๋ฐ UserCreatedIntegrationEvent ์ด๋ฒคํธ์ ์ฐ๊ฒฐ๋ ํตํฉ ์ด๋ฒคํธ ํธ๋ค๋ฌ
SendEmailOnUserCreated ๋ฅผ ์์ฑํ๋ฉด, ์์คํ
์ ์๋์ผ๋ก SendEmailOnUserCreatedIntegrationEventHandler ๋ผ๋ ์ด๋ฆ์ ํธ๋ค๋ฌ๋ฅผ ์์ฑํฉ๋๋ค.
Lino๊ฐ ์์ฑํ ๊ตฌ์กฐ:
MyApp/
โโโ src/
โโโ Services/
โโโ MyService/
โโโ Application/
โโโ MyApp.MyService.Application.csproj
โโโ UseCases/
โโโ Users/
โโโ Commands/
โโโ EventHandlers/
โ โโโ Integration/
โ โโโ SendEmailOnUserCreatedIntegrationEventHandler.cs
โโโ Logging/
โโโ Queries/
โโโ Resources/
