이벤트 다루기

ํ˜„๋Œ€ ์‹œ์Šคํ…œ์—์„œ 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/
처리되지 않은 오류가 발생했습니다. 새로 고침 ๐Ÿ—™