jvnlee / catch-dining

๋ง›์ง‘ ๊ฒ€์ƒ‰ ๋ฐ ์˜ˆ์•ฝ ์„œ๋น„์Šค
0 stars 0 forks source link

feature/#43 cqrs application #44

Closed jvnlee closed 2 months ago

jvnlee commented 3 months ago

๊ตฌํ˜„ ๋‚ด์šฉ

๐Ÿ“Œ ์‹๋‹น ์กฐํšŒ API์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ„๋ฆฌ

DataSource๋ฅผ ํ•˜๋‚˜๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๊ธฐ์กด ๊ตฌ์กฐ์—์„œ, READ์šฉ๊ณผ WRITE์šฉ 2๊ฐœ๋ฅผ ๊ฐ€์ง€๋„๋ก ๋ณ€๊ฒฝํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ Routing ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•จ.

CQRS ํŒจํ„ด ๋„์ž…์ด๋ผ๊ณ  ํ‘œํ˜„ํ–ˆ์œผ๋‚˜, ์—„๋ฐ€ํ•˜๊ฒŒ๋Š” ์•„๋‹˜. CQRS ํŒจํ„ด์€ READ์šฉ DB๋กœ๋งŒ READ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , WRITE์šฉ DB๋กœ๋งŒ CREATE/UPDATE/DELETE๋ฅผ ์ง„ํ–‰ํ•˜์ง€๋งŒ, ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋„์ž… ์ทจ์ง€ ์ƒ ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜๋Š” ํŠน์ • ์กฐํšŒ API์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์ดˆ์ ์„ ๋‘๊ณ  ์žˆ์–ด ๋‹น์žฅ์œผ๋กœ์„œ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ Command์™€ Query์˜ ๋ถ„๋ฆฌ๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜์ง€ ์•Š์Œ.

๋”ฐ๋ผ์„œ ํ˜„์žฌ๋Š” ์‹๋‹น ์กฐํšŒ API์˜ ๊ฒฝ์šฐ์—๋งŒ READ DB๋กœ๋ถ€ํ„ฐ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ์ผ๋ฐ˜ ์กฐํšŒ API์˜ ๊ฒฝ์šฐ๋Š” WRITE DB์—์„œ ์กฐํšŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•จ.

์ด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•œ ๋ฐฐ๊ฒฝ๋„ ๊ฒฐ๊ตญ์€ ์‹๋‹น ์ •๋ ฌ ์กฐํšŒ API์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•ด๋ณด๊ธฐ ์œ„ํ•จ์ด์—ˆ์Œ

์‹๋‹น์— ๊ด€๋ จ๋œ avgRating์ด๋‚˜ reviewCount ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ ์ง‘๊ณ„๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ READ DB์— ์ €์žฅํ•ด๋‘๊ณ  ์กฐํšŒ ์‹œ์ ์— ๋ณ„๋„์˜ ์ง‘๊ณ„ ํ•จ์ˆ˜ ์‹คํ–‰ ์—†์ด ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ์ด๋Œ์–ด๋‚ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•จ.

 

docker-compose.yml

 

DataSourceRouter

 

DataSourceConfig

 

EntityManagerFactoryConfig

(dev์™€ prod ํ”„๋กœํ•„์šฉ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ์Œ)

 

TransactionManagerConfig

 

@AggregatedData

@Transactional(readOnly = true)๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๊ฒƒ๊ณผ ๋ณ„๊ฐœ๋กœ, @AggregatedData๋ผ๋Š” ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์–ด์žˆ์–ด์•ผ๋งŒ READ_ONLY ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ผ์šฐํŒ…๋จ.

 

DataSourceRoutingAspect

Spring AOP๋ฅผ ์ด์šฉํ•˜์—ฌ @AggregatedData ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ, DataSourceRouter๊ฐ€ ํƒ€๊ฒŸ์„ READ_ONLY๋กœ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•จ.

 

DataSourceRouterCleanerInterceptor

DataSourceRouter๊ฐ€ ๊ฐ€์ง„ ThreadLocal ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ณธ๊ฐ’์ธ WRITE_ONLY๋กœ ์ดˆ๊ธฐํ™”์‹œํ‚ด

์ดˆ๊ธฐํ™” ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ž”์กด ๊ฐ’์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ๋ฅผ ๋ฐฉ์ง€

 

๐Ÿ“Œ ์ด๋ฒคํŠธ๋กœ ์กฐํšŒ์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”

Spring์˜ ApplicationEventPublisher๋กœ ํŠน์ • WRITE DB ์ž‘์—… ํ›„ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ , ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์ž‘์—…์„ READ DB์—๋„ ๋ฐ˜์˜ํ•˜๋Š” ๊ตฌ์กฐ

RestaurantReviewStat

avgRating์ด๋‚˜ reviewCount ๊ฐ™์€ ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ์‹๋‹น ์—”ํ‹ฐํ‹ฐ.

READ DB์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ, WRITE DB์—์„œ ๊ด€๋ฆฌํ•˜๋Š” Restaurant ์—”ํ‹ฐํ‹ฐ์˜ ์กฐํšŒ์šฉ ๋ฒ„์ „์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ.

์—ฌ๋Ÿฌ ๊ฐœ์˜ ReviewCreatedEvent ํ•ธ๋“ค๋ง์— ์˜ํ•ด ๋™์‹œ์— ์ง‘๊ณ„ ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ, ์ •ํ•ฉ์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์†Œ์ง€๊ฐ€ ์žˆ์–ด ๋‚™๊ด€์  ๋ฝ์„ ์ ์šฉ

๋‚™๊ด€์  ๋ฝ์„ ์ ์šฉํ•œ ์ด์œ 

  • ์‹๋‹น ๋ฆฌ๋ทฐ ๋“ฑ๋ก์€ ์˜ˆ์•ฝ ๊ธฐ๋Šฅ๊ณผ ๋‹ฌ๋ฆฌ ํ•œ๋‚  ํ•œ์‹œ์— ๋™์‹œ๋‹ค๋ฐœ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์‹œ์„ฑ ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋‚ฎ์Œ

  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋ง์€ ์–ด์ฐจํ”ผ ๋ณธ ์š”์ฒญ๊ณผ ๋ณ„๊ฐœ๋กœ ๋น„๋™๊ธฐ๋กœ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ ์‹œ ์žฌ์‹œ๋„ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๋ฐ์— ์„ฑ๋Šฅ์  ๋ถ€๋‹ด์ด ์—†์Œ

 

RestaurantReviewStatService

 

RestaurantEventHandler

RestaurantCreatedEvent, RestaurantUpdatedEvent, RestaurantDeletedEvent๋ฅผ ๊ฐ์ง€ํ•ด์„œ ๋น„๋™๊ธฐ ํ•ธ๋“ค๋ง. RestaurantReviewStatService์˜ register(), update(), delete() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ READ-DB์— ๋ฐ˜์˜

 

ReviewCreatedEventHandler

ReviewCreatedEvent๋ฅผ ๊ฐ์ง€ํ•ด์„œ ๋น„๋™๊ธฐ ํ•ธ๋“ค๋ง. RestaurantReviewStatService์˜ updateReviewData() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ READ-DB์— ๋ฐ˜์˜

 

๐Ÿ“Œ Testcontainers๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์— DB ๋ถ„๋ฆฌ ๋ฐ˜์˜

TestcontainersContext

๊ธฐ์กด์˜ TestContextInitializer ๋Œ€์‹ , ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•˜๋Š” ์—ญํ• 

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ TC๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

RestaurantReviewStatIntegrationTest

Restaurant์™€ ๊ด€๋ จ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด READ-DB์˜ RestaurantReviewStat์— ์ •์ƒ์ ์œผ๋กœ ๋ฐ˜์˜๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜๋Š” ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค