대머리개발자

마이그레이션(MyBatis -> R2DBC) 언제나 즐겁네! 본문

개발이야기/DataBase

마이그레이션(MyBatis -> R2DBC) 언제나 즐겁네!

대머리개발자 2024. 7. 8. 13:42
728x90

MyBatis --> R2DBC로 마이그레이션 하고 있는데.. 빡치게 재미지네!

 

제일 험난했던 놈이다.

 

## 쿼리 바인딩

 <resultMap id="status" type="StatusDto">
        <id property="code" column="signal_code"/>
        <result property="category" column="category"/>
        <result property="name" column="name"/>
        <result property="price" column="price"/>
        <result property="digital" column="digital"/>
        <result property="consecutiveMovement" column="consecutive_movement"/>
</resultMap>

<resultMap id="summary" extends="status" type="SummaryDto">
    <collection property="histories" javaType="ArrayList" ofType="domain.jdbc.SummaryDto$ScoreTimeSeries">
        <id property="date" column="date"/>
        <result property="score" column="score"/>
    </collection>
</resultMap>

 

## 데이터 클래스

abstract class StatusDto (
     val category: Int = 10,
     val code: String = "",
     val name: String = "",
     val price: BigDecimal = BigDecimal.ZERO,
     val digital: Int = 1,
     val movement: Int = 0
)

data class ScoreTimeSeries(
     val date:LocalDate,
     val score:BigDecimal
)

data class SummaryDto(
      val histories :List<ScoreTimeSeries>
) : StatusDto()

 

R2DBC는 한번에 바인딩이 되지 읺기 때문에 비지니스 로직에서 처리해야 한다.

return gaugeRepository.searchMainSignals()
    .groupBy { it.code }
    .flatMap { groupedFlux ->
        val cachedGroupedFlux = groupedFlux.cache()
        cachedGroupedFlux.map {ScoreTimeSeries(it.date, it.score)}
                    .collectList()
                    .zipWith(cachedGroupedFlux.next())
                    .map{ SignalOverview.from(it.t2, it.t1)}
    }.collectList()

 

groupBy를 이용하는 것이다. data와 socre를 발라내고, 그룹된 공통 데이터를 next()로 발라내서 하나의 객체로 바인딩한다!. 여기서 cache를 안 쓰면 두번 구독한다고 오류가 발생한다..

하악하악.!

728x90