Closed jvnlee closed 2 months ago
DataSource๋ฅผ ํ๋๋ง ๊ฐ์ง๊ณ ์๋ ๊ธฐ์กด ๊ตฌ์กฐ์์, READ์ฉ๊ณผ WRITE์ฉ 2๊ฐ๋ฅผ ๊ฐ์ง๋๋ก ๋ณ๊ฒฝํ๊ณ ํ์์ ๋ฐ๋ผ Routing ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํจ.
DataSource
CQRS ํจํด ๋์ ์ด๋ผ๊ณ ํํํ์ผ๋, ์๋ฐํ๊ฒ๋ ์๋. CQRS ํจํด์ READ์ฉ DB๋ก๋ง READ๋ฅผ ์ํํ๊ณ , WRITE์ฉ DB๋ก๋ง CREATE/UPDATE/DELETE๋ฅผ ์งํํ์ง๋ง, ํ์ฌ ํ๋ก์ ํธ์์๋ ๋์ ์ทจ์ง ์ ์ง๊ณ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋๋ ํน์ ์กฐํ API์ ์ฑ๋ฅ ํฅ์์ ์ด์ ์ ๋๊ณ ์์ด ๋น์ฅ์ผ๋ก์๋ ์๋ฒฝํ๊ฒ Command์ Query์ ๋ถ๋ฆฌ๋ฅผ ๋ชฉํ๋ก ํ์ง ์์.
๋ฐ๋ผ์ ํ์ฌ๋ ์๋น ์กฐํ API์ ๊ฒฝ์ฐ์๋ง READ DB๋ก๋ถํฐ ์กฐํ๋ฅผ ์ํํ๊ณ , ๋๋จธ์ง ์ผ๋ฐ ์กฐํ API์ ๊ฒฝ์ฐ๋ WRITE DB์์ ์กฐํ๋ฅผ ์ํํ๋๋ก ํจ.
์ด ๊ธฐ๋ฅ์ ๋์ ํ ๋ฐฐ๊ฒฝ๋ ๊ฒฐ๊ตญ์ ์๋น ์ ๋ ฌ ์กฐํ API์ ์ฑ๋ฅ์ ๊ฐ์ ํด๋ณด๊ธฐ ์ํจ์ด์์ ์๋น์ ๊ด๋ จ๋ avgRating์ด๋ reviewCount ๊ฐ์ ๋๊ท๋ชจ ์ง๊ณ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ READ DB์ ์ ์ฅํด๋๊ณ ์กฐํ ์์ ์ ๋ณ๋์ ์ง๊ณ ํจ์ ์คํ ์์ด ๋น ๋ฅธ ์ฑ๋ฅ์ ์ด๋์ด๋ด๋ ๊ฒ์ ๋ชฉํ๋ก ํจ.
์ด ๊ธฐ๋ฅ์ ๋์ ํ ๋ฐฐ๊ฒฝ๋ ๊ฒฐ๊ตญ์ ์๋น ์ ๋ ฌ ์กฐํ API์ ์ฑ๋ฅ์ ๊ฐ์ ํด๋ณด๊ธฐ ์ํจ์ด์์
์๋น์ ๊ด๋ จ๋ avgRating์ด๋ reviewCount ๊ฐ์ ๋๊ท๋ชจ ์ง๊ณ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ READ DB์ ์ ์ฅํด๋๊ณ ์กฐํ ์์ ์ ๋ณ๋์ ์ง๊ณ ํจ์ ์คํ ์์ด ๋น ๋ฅธ ์ฑ๋ฅ์ ์ด๋์ด๋ด๋ ๊ฒ์ ๋ชฉํ๋ก ํจ.
avgRating
reviewCount
yml ํ์ผ์ dev์ prod ํ๋กํ๋ณ๋ก ๊ตฌ๋ถํ์ฌ ๋น๋ ๋ฐฉ์๊ณผ ํ๊ฒฝ ๋ณ์ ์ธํ ์ ๋ค๋ฅด๊ฒ ์งํ
mysql์ด๋ผ๋ ์ด๋ฆ์ ๋จ์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ํ๊ฒฝ์์, read-db์ write-db 2๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ
health check condition์ ์ถ๊ฐํ์ฌ 2๊ฐ์ DB ์ปจํ ์ด๋๊ฐ ๋ชจ๋ ์ ์์ ์ผ๋ก ์คํ๋ ๊ฒฝ์ฐ์๋ง app ์ปจํ ์ด๋๋ฅผ ์คํํ๋๋ก ํจ
app ์ปจํ ์ด๋ ์์ ์, Spring Boot๊ฐ DB ์ด๊ธฐํ ์ ์ Application Context๋ฅผ ์ด๊ธฐํํ์ฌ ์คํจํ๋ ๋ฌธ์ ๋ฐฉ์ง
Git์ ๊ณต๊ฐํ์ง ์์ init.sql ํ์ผ ์คํํ๋ ์ต์ ์ถ๊ฐ
init.sql: DB ์ฌ์ฉ์ ๊ถํ ์ค์ ๊ณผ DDL ์คํ
AbstractRoutingDataSource๋ฅผ ๊ตฌํํ์ฌ ํ์ฌ DataSourceType์ ๋ณด๊ณ ์ ์ ํ DataSource๋ก ์ฐพ์๊ฐ๋๋ก ์๋ดํ๋ ์ญํ
AbstractRoutingDataSource
DataSourceType
ThreadLocal ๋ณ์๋ก ํ์ฌ DataSourceType์ ๋ณด๊ด
ThreadLocal
determineCurrentLookupKey(): currentDataSource ํ๋๋ก๋ถํฐ ํ์ฌ ํ๊ฒ์ผ๋ก ํ๋ DataSourceType์ ์ฝ์ด์ ๋ก๊ทธ๋ก ๋จ๊ธฐ๊ณ ๋ฐํ
determineCurrentLookupKey()
currentDataSource
writeDataSource() & readDataSource(): ๊ฐ๊ฐ ์ฐ๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฝ๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํ DataSource Bean ์ด๊ธฐํ
writeDataSource()
readDataSource()
dataSourceRouter(): DataSourceRouter๋ฅผ Bean์ ๋ง๋ค๊ณ , 2๊ฐ์ DataSource๋ฅผ Map์ ๋ฃ์ด ํ๊ฒ์ผ๋ก ์ง์ ํจ.
dataSourceRouter()
DataSourceRouter
lazyDataSource(): DataSourceRouter๋ฅผ ํ๋ก์๋ก ๊ฐ์ธ์ ์ปค๋ฅ์ ํ๋์ ์ง์ฐ์ํค๋ LazyConnectionDataSourceProxy Bean ์ด๊ธฐํ
lazyDataSource()
LazyConnectionDataSourceProxy
(dev์ prod ํ๋กํ์ฉ์ผ๋ก ๊ตฌ๋ถ๋์ด ์์)
~entityManagerFactory()
EntityManagerFactory
transactionManager()
JpaTransactionManager
@Transactional(readOnly = true)๊ฐ ๋ถ์ด์๋ ๊ฒ๊ณผ ๋ณ๊ฐ๋ก, @AggregatedData๋ผ๋ ์ปค์คํ ์ด๋ ธํ ์ด์ ์ด ๋ถ์ด์์ด์ผ๋ง READ_ONLY ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๋ผ์ฐํ ๋จ.
@Transactional(readOnly = true)
@AggregatedData
Spring AOP๋ฅผ ์ด์ฉํ์ฌ @AggregatedData ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋, DataSourceRouter๊ฐ ํ๊ฒ์ READ_ONLY๋ก ๋ณ๊ฒฝํ๋๋ก ํจ.
READ_ONLY
DataSourceRouter๊ฐ ๊ฐ์ง ThreadLocal ๋ณ์๋ฅผ ๊ธฐ๋ณธ๊ฐ์ธ WRITE_ONLY๋ก ์ด๊ธฐํ์ํด
WRITE_ONLY
์ด๊ธฐํ ํ์ง ์๋ ๊ฒฝ์ฐ ์์กด ๊ฐ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์ง
Spring์ ApplicationEventPublisher๋ก ํน์ WRITE DB ์์ ํ ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๊ณ , ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํตํด ํด๋น ์์ ์ READ DB์๋ ๋ฐ์ํ๋ ๊ตฌ์กฐ
ApplicationEventPublisher
avgRating์ด๋ reviewCount ๊ฐ์ ์ง๊ณ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์๋น ์ํฐํฐ.
READ DB์์ ๊ด๋ฆฌํ๋ฉฐ, WRITE DB์์ ๊ด๋ฆฌํ๋ Restaurant ์ํฐํฐ์ ์กฐํ์ฉ ๋ฒ์ ์ด๋ผ๊ณ ๋ณผ ์ ์์.
Restaurant
์ฌ๋ฌ ๊ฐ์ ReviewCreatedEvent ํธ๋ค๋ง์ ์ํด ๋์์ ์ง๊ณ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ ๋ ๋, ์ ํฉ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์์ง๊ฐ ์์ด ๋๊ด์ ๋ฝ์ ์ ์ฉ
๋๊ด์ ๋ฝ์ ์ ์ฉํ ์ด์ ์๋น ๋ฆฌ๋ทฐ ๋ฑ๋ก์ ์์ฝ ๊ธฐ๋ฅ๊ณผ ๋ฌ๋ฆฌ ํ๋ ํ์์ ๋์๋ค๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋์์ฑ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋ฎ์ ์ด๋ฒคํธ ํธ๋ค๋ง์ ์ด์ฐจํผ ๋ณธ ์์ฒญ๊ณผ ๋ณ๊ฐ๋ก ๋น๋๊ธฐ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ถฉ๋ ์ ์ฌ์๋ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ฐ์ ์ฑ๋ฅ์ ๋ถ๋ด์ด ์์
๋๊ด์ ๋ฝ์ ์ ์ฉํ ์ด์
์๋น ๋ฆฌ๋ทฐ ๋ฑ๋ก์ ์์ฝ ๊ธฐ๋ฅ๊ณผ ๋ฌ๋ฆฌ ํ๋ ํ์์ ๋์๋ค๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ธฐ๋ฅ์ด ์๋๊ธฐ ๋๋ฌธ์ ๋์์ฑ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ๋ฎ์
์ด๋ฒคํธ ํธ๋ค๋ง์ ์ด์ฐจํผ ๋ณธ ์์ฒญ๊ณผ ๋ณ๊ฐ๋ก ๋น๋๊ธฐ๋ก ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ถฉ๋ ์ ์ฌ์๋ ์ฒ๋ฆฌ๋ฅผ ํ๋๋ฐ์ ์ฑ๋ฅ์ ๋ถ๋ด์ด ์์
search(), view(): ๊ธฐ์กด์ RestaurantService์ ์๋ ์กฐํ ๊ธฐ๋ฅ์ ์ฎ๊ฒจ์ด.
search()
view()
RestaurantService
READ DB๋ก๋ถํฐ ์ง๊ณ ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ฝ์ด์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ฆฌ ์ ์ ๊ธฐ์กด ๋ฐฉ์์ ๋นํด ํฐ ์ฑ๋ฅ ํฅ์์ ๊ธฐ๋ํ ์ ์๋ ์ง์
register(), update(), delete(): ๊ฐ๊ฐ WRITE DB์์ ๋ฐ์ํ Restaurant์ ์์ฑ, ์์ , ์ญ์ ์์ ์ READ DB์ RestaurantReviewStat์ ๋ฐ์
register()
update()
delete()
RestaurantReviewStat
RestaurantCreatedEvent, RestaurantUpdatedEvent, RestaurantDeletedEvent ํธ๋ค๋ง ๊ณผ์ ์์ ํธ์ถ๋จ
RestaurantCreatedEvent
RestaurantUpdatedEvent
RestaurantDeletedEvent
updateReviewData(): WRITE DB์ ์์ฑ๋ Review๋ก ์ธํ ํ๊ท ๋ณ์ ๊ณผ ์ ์ฒด ๋ฆฌ๋ทฐ ๊ฐ์ ๋ณํ๋ฅผ READ DB์ RestaurantReviewStat์ ๋ฐ์
updateReviewData()
Review
ReviewCreatedEvent ํธ๋ค๋ง ๊ณผ์ ์์ ํธ์ถ๋จ
ReviewCreatedEvent
RestaurantCreatedEvent, RestaurantUpdatedEvent, RestaurantDeletedEvent๋ฅผ ๊ฐ์งํด์ ๋น๋๊ธฐ ํธ๋ค๋ง. RestaurantReviewStatService์ register(), update(), delete() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ READ-DB์ ๋ฐ์
RestaurantReviewStatService
ReviewCreatedEvent๋ฅผ ๊ฐ์งํด์ ๋น๋๊ธฐ ํธ๋ค๋ง. RestaurantReviewStatService์ updateReviewData() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ READ-DB์ ๋ฐ์
๊ธฐ์กด์ TestContextInitializer ๋์ , ํตํฉ ํ ์คํธ๋ฅผ ์ํ ์ปจํ ์ด๋ ํ๊ฒฝ์ ์ธํ ํ๋ ์ญํ
TestContextInitializer
ํตํฉ ํ ์คํธ ํด๋์ค์์ ํด๋น ํด๋์ค๋ฅผ ์์ํ์ฌ TC๋ฅผ ์ฌ์ฉํ ์ ์์
Restaurant์ ๊ด๋ จ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ํตํด READ-DB์ RestaurantReviewStat์ ์ ์์ ์ผ๋ก ๋ฐ์๋๋์ง ํ ์คํธํ๋ ํตํฉ ํ ์คํธ ํด๋์ค
๊ตฌํ ๋ด์ฉ
๐ ์๋น ์กฐํ 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์์ ์กฐํ๋ฅผ ์ํํ๋๋ก ํจ.
docker-compose.yml
yml ํ์ผ์ dev์ prod ํ๋กํ๋ณ๋ก ๊ตฌ๋ถํ์ฌ ๋น๋ ๋ฐฉ์๊ณผ ํ๊ฒฝ ๋ณ์ ์ธํ ์ ๋ค๋ฅด๊ฒ ์งํ
mysql์ด๋ผ๋ ์ด๋ฆ์ ๋จ์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ ํ๊ฒฝ์์, read-db์ write-db 2๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ
health check condition์ ์ถ๊ฐํ์ฌ 2๊ฐ์ DB ์ปจํ ์ด๋๊ฐ ๋ชจ๋ ์ ์์ ์ผ๋ก ์คํ๋ ๊ฒฝ์ฐ์๋ง app ์ปจํ ์ด๋๋ฅผ ์คํํ๋๋ก ํจ
Git์ ๊ณต๊ฐํ์ง ์์ init.sql ํ์ผ ์คํํ๋ ์ต์ ์ถ๊ฐ
DataSourceRouter
AbstractRoutingDataSource
๋ฅผ ๊ตฌํํ์ฌ ํ์ฌDataSourceType
์ ๋ณด๊ณ ์ ์ ํDataSource
๋ก ์ฐพ์๊ฐ๋๋ก ์๋ดํ๋ ์ญํdetermineCurrentLookupKey()
:currentDataSource
ํ๋๋ก๋ถํฐ ํ์ฌ ํ๊ฒ์ผ๋ก ํ๋DataSourceType
์ ์ฝ์ด์ ๋ก๊ทธ๋ก ๋จ๊ธฐ๊ณ ๋ฐํDataSourceConfig
writeDataSource()
&readDataSource()
: ๊ฐ๊ฐ ์ฐ๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฝ๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํDataSource
Bean ์ด๊ธฐํdataSourceRouter()
:DataSourceRouter
๋ฅผ Bean์ ๋ง๋ค๊ณ , 2๊ฐ์DataSource
๋ฅผ Map์ ๋ฃ์ด ํ๊ฒ์ผ๋ก ์ง์ ํจ.lazyDataSource()
:DataSourceRouter
๋ฅผ ํ๋ก์๋ก ๊ฐ์ธ์ ์ปค๋ฅ์ ํ๋์ ์ง์ฐ์ํค๋LazyConnectionDataSourceProxy
Bean ์ด๊ธฐํEntityManagerFactoryConfig
(dev์ prod ํ๋กํ์ฉ์ผ๋ก ๊ตฌ๋ถ๋์ด ์์)
~entityManagerFactory()
:LazyConnectionDataSourceProxy
๋ฅผ DataSource๋ก ์ฌ์ฉํ๋ ์ปค์คํ EntityManagerFactory
๋ฅผ ์์ฑTransactionManagerConfig
transactionManager()
: ์ปค์คํ EntityManagerFactory
๋ฅผ ์ ์ฉํ ์ปค์คํ JpaTransactionManager
๋ฅผ ์์ฑ@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
๊ฐ์ ์ง๊ณ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์๋น ์ํฐํฐ.์ฌ๋ฌ ๊ฐ์ ReviewCreatedEvent ํธ๋ค๋ง์ ์ํด ๋์์ ์ง๊ณ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ ๋ ๋, ์ ํฉ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์์ง๊ฐ ์์ด ๋๊ด์ ๋ฝ์ ์ ์ฉ
RestaurantReviewStatService
search()
,view()
: ๊ธฐ์กด์RestaurantService
์ ์๋ ์กฐํ ๊ธฐ๋ฅ์ ์ฎ๊ฒจ์ด.register()
,update()
,delete()
: ๊ฐ๊ฐ WRITE DB์์ ๋ฐ์ํRestaurant
์ ์์ฑ, ์์ , ์ญ์ ์์ ์ READ DB์RestaurantReviewStat
์ ๋ฐ์updateReviewData()
: WRITE DB์ ์์ฑ๋Review
๋ก ์ธํ ํ๊ท ๋ณ์ ๊ณผ ์ ์ฒด ๋ฆฌ๋ทฐ ๊ฐ์ ๋ณํ๋ฅผ READ DB์RestaurantReviewStat
์ ๋ฐ์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
์ ์ ์์ ์ผ๋ก ๋ฐ์๋๋์ง ํ ์คํธํ๋ ํตํฉ ํ ์คํธ ํด๋์ค