๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ตœ๊ทผ ํ”„๋กœ์ ํŠธ์—์„œ Spring Event์™€ ๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค. 

๋น„๋™๊ธฐ๋ฅผ ๊ณต๋ถ€ํ•˜๋Š” ๊น€์— ๋ณต์Šต์‚ผ์•„ ์Šคํ”„๋ง ์ด๋ฒคํŠธ๋„ ๊ฐ™์ด ์ ์šฉํ•ด๋ณด์•˜๋‹ค.

 

์Šคํ”„๋ง ์ด๋ฒคํŠธ๋ž€?

Spring Event๋ž€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

์Šคํ”„๋ง ๋‚ด๋ถ€์—์„œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ (publish) ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋Š”(listen) ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์Šคํ”„๋ง ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

- ์Šคํ”„๋ง์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์˜์กด์„ฑ์ด ๋‚ฎ์•„์ง„๋‹ค.

- ํ•ต์‹ฌ๋กœ์ง๊ณผ ์ด์™ธ์˜ ๊ด€๋ จ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด 

์‚ฌ์šฉ์ž์˜ ์ƒํ’ˆ ์ฃผ๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” api๊ฐ€ ์žˆ๋‹ค. ํ•ด๋‹น api์˜ ์„œ๋น„์Šค ๋‹จ์—๋Š”

1. ์ฃผ๋ฌธํ•œ ์ƒํ’ˆ DB์— ์ €์žฅ

2. ํ‘ธ์‰ฌ ๋ฉ”์‹œ์ง€, ๋ฉ”์ผ ์ „์†ก

๊ณผ ๊ฐ™์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

 

์—ฌ๊ธฐ์„œ ํ‘ธ์‰ฌ๋ฉ”์‹œ์ง€, ๋ฉ”์ผ ์ „์†ก์€ ์ค‘์š”ํ•œ ๋กœ์ง์ด ์•„๋‹ˆ๋‹ค.

์ฃผ๋ฌธ์ด ๋“ค์–ด์™”์„ ๋•Œ ํ•ต์‹ฌ ๋กœ์ง๊ณผ ์ด์™ธ์˜ ์—ฐ๊ด€๋œ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ

์ด์™ธ์˜ ์—ฐ๊ด€๋œ ์ฝ”๋“œ๋Š” ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” event ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๋น„๋™๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

Spring Event๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๋•Œ๋ฌธ์— ํ˜„์žฌ ์“ฐ๋ ˆ๋“œ์—์„œ ํ•ต์‹ฌ๋กœ์ง๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•ต์‹ฌ์ด ์•„๋‹Œ ๋กœ์ง์ธ ์ด๋ฒคํŠธ๋„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ

์ „์ฒด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

๋•Œ๋ฌธ์— ์ด๋ฒคํŠธ๋ฅผ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—๊ฒŒ ์œ„์ž„ํ•˜๊ฒŒ ๋˜๋ฉด

์ „์ฒด ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ตฌํ˜„

์Šคํ”„๋ง ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ

OrdersService.java

@Async

@EventListener

 

OrdersEventListener.java

publisher.publish(์ด๋ฒคํŠธ ๊ฐ์ฒด)

AsyncApplication.java

 

 

๋Š๋‚€์ 

1. Transactional์ด ๊ฑธ๋ฆฐ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•ด์„œ 

- ์ฃผ๋ฌธ์ƒํ’ˆ DB์— ์ €์žฅ

- ์ด๋ฒคํŠธ ๋ฐœ์ƒ

- Exception ๋ฐœ์ƒ

์˜ ๊ฒฝ์šฐ ์ฃผ๋ฌธ์ƒํ’ˆ DB์— ์ €์žฅ์€ ๋กค๋ฐฑ์ด ๋˜์ง€๋งŒ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์€ ๋กค๋ฐฑ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ž˜์„œ ์ฐพ์•„๋ณด๋‹ˆ๊นŒ @TransactionalEventListener๋ผ๋Š”๊ฒŒ ์žˆ๋‹ค. Transaction์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ๋กค๋ฐฑ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ด์ฃผ๋Š” ๋…€์„์ธ๋“ฏ ํ•˜๋‹ค. 

 

2. Async ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ณ„๋„๋กœ ์ƒ์„ฑ์ด ๋œ๋‹ค.

ํŠธ๋ž˜ํ”ฝ์ด ๋ชฐ๋ฆด ๊ฒฝ์šฐ ์“ฐ๋ ˆ๋“œ๋Š” ๊ณผ๋„ํ•˜๊ฒŒ ์ƒ์„ฑ์ด ๋˜๋Š”๋ฐ

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์— ๋Œ€๋น„ํ•˜์—ฌ Async ์–ด๋…ธํ…Œ์ด์…˜์„ ์ปค์Šคํ…€ํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋ณด์ž.

 

์ด์–ด์ง€๋Š” ๊ฒŒ์‹œ๊ธ€์€

TransactionalEventListener ์–ด๋…ธํ…Œ์ด์…˜ ์ ์šฉ๊ณผ

Async ์–ด๋…ธํ…Œ์ด์…˜ ์ปค์Šคํ…€์œผ๋กœ ํ•˜๊ฒ ๋‹ค.