### ๐Ÿš€ step1 - ํ˜„์žฌ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ ํ•˜๋ฉด์„œ ์–ด๋–ค ์ ์„ ๊ณ ์น˜๊ณ  ์‹ถ์€์ง€ ๋‹ˆ์ฆˆ๋ฅผ ํŒŒ์•…ํ•ด๋ณธ๋‹ค. ### ๐Ÿš€ step2 - ์ƒ์† ๊ธฐ๋ฐ˜์˜ ์ด๋ฒคํŠธ๋กœ ๋ณ€๊ฒฝ ํ•ด๋ณธ๋‹ค. - ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ApplicationEvent ๋ฅผ ์ƒ์† ๋ฐ›์•„ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋ณธ๋‹ค. - ์ด๋ฒคํŠธ ๊ฐ์ฒด๋กœ ๋ถ€ํ„ฐ ์ „๋‹ฌ ๋ฐ›์„ EventListener ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด๋ณธ๋‹ค. - ApplicationEventPublisher ๋ฅผ ์ฃผ์ž… ๋ฐ›์•„์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ ์‹œํ‚จ๋‹ค. - ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ > Mockito ํ™œ์šฉ ### ๐Ÿ“– ์‚ดํŽด๋ณผ ๊ฐ์ฒด - `AbstractApplicationContext` ๋ฅผ intellij ์˜ diagram ์„ ํ†ตํ•ด์„œ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ณด๋ฉด `ApplicationEventPublisher` ๋ฅผ ์ƒ์† ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. - `AbstractApplicationContext`::publishEvent ๋ฉ”์†Œ๋“œ๋ฅผ ๋ณด๋ฉด ์ด๋ฒคํŠธ์˜ ๋ฐœํ–‰์ด ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. > ์กฐ๊ธˆ ์„ค๋ช…์„ ๋“œ๋ฆฌ๋ฉด ์œ„์˜ ๋ฉ”์†Œ๋“œ ์•ˆ์—์„œ ApplicationEventMulticaster ๋ฅผ ์ฃผ์ž… ๋ฐ›์•„ ์ด๋ฒคํŠธ๋ฅผ ์‹คํ–‰ ์‹œํ‚ค๋Š”๋ฐ ๊ตฌํ˜„์ฒด ์ค‘ `SimpleApplicationEventMulticater` ๋ฅผ ์‚ดํŽด๋ณด๋ฉด (์œ„์™€ ๊ฐ™์ด ๋‹ค์ด์–ด๊ทธ๋žจ์œผ๋กœ ํ‘œํ˜„) multicastEvent ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ ์ด๋ฒคํŠธ ๊ฐ์ฒด๋ฅผ ์‹คํ–‰์„ ํ•ฉ๋‹ˆ๋‹ค ### ๐Ÿš€ step3 - ์ถ”๊ฐ€ ๊ธฐ๋Šฅ(์–ด๋“œ๋ฏผ์—์„œ ์ฟ ํฐ ๋ฐ ํ™˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.) - `@EventListener` ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝ ํ•ด๋ณด์ž. - > ์Šคํ”„๋ง 4.2 ๋ถ€ํ„ฐ ApplicationEvent ๋ฅผ ์ƒ์† ๋ฐ›์•„ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ์ด๋ฒคํŠธ ๊ฐ์ฒด ์ฒ˜๋Ÿผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. `ApplicationListenerMethodAdapter` ๊ฐ์ฒด์—์„œ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ฐพ์•„์„œ ์‹คํ–‰ - ์–ด๋“œ๋ฏผ์— ์•Œ๋žŒ์„ ๋ณด๋‚ด๋Š” ์ค‘์— ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ณด์ž - > `@TransactionalEventListener` ๋ฅผ ํ™œ์šฉํ•ด ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋ฅผ ์ œ์–ดํ•ด๋ณด์ž. - ๋น„๋™๊ธฐ ํ™œ์šฉ - > `@EnableAsync` ์™€ `@Async` ๋ฅผ ํ™œ์šฉํ•ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ณด์ž. ### ๐Ÿš€ step4 - Domain Event - > AbstractAggregateRoot ๋ฅผ ์ƒ์† ๋ฐ›์•„ ์ด๋ฒคํŠธ๋ฅผ ์ œ๊ณต - > registerEvent ๋ฅผ ํ†ตํ•ด jpa์˜ save ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ํ•  ๋•Œ ๋งˆ๋‹ค ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ --- #### ์ถœ์ฒ˜ : https://github.com/tongnamuu/SpringEvent