프로그래밍/Kotlin

data class와 BeanPropertyRowMapper 오류 (feat. Java Records)

seungdols 2025. 5. 20. 16:38

JdbcCursorItemReader 를 이용해, db 쿼리를 한 뒤에, 조인 된 데이터를 가져와서 DTO data class에 담아 처리를 해야 할 일이 있었습니다.

기존

 return JdbcCursorItemReaderBuilder<WithRewardAmountDto>()
            .name("xxxStepItemReader")
            .dataSource(secondaryDataSource)
            .sql(
                """
                    SELECT .. xxx 비밀 ^^
                """.trimIndent(),
            )
            .fetchSize(BatchConstant.STEP_CHUNK_SIZE)
            .rowMapper(BeanPropertyRowMapper(WithRewardAmountDto::class.java))
            .build()   

위 처럼 쓰고 있는데, 오류가 발생 합니다.

오류 상황

Caused by: java.lang.IllegalArgumentException: No argument provided for a required parameter: parameter #0 id of fun `<init>`(kotlin.Long, kotlin.String, kotlin.Long, java.math.BigDecimal, java.time.OffsetDateTime): com.seungdols.company.dto.WithRewardAmountDto
org.springframework.beans.BeanInstantiationException: Failed to instantiate [WithRewardAmountDto]: Illegal arguments for constructor

확인을 해보니, 호환성 문제가 있었고 해결 방법은 간단하게는 3가지가 있습니다. 물론, 위 이슈는 Java의 Record 타입을 쓰더라도 발생합니다.

해결방안

  1. data class를 class 로 변경한다.
  2. BeanPropertyRowMapper 대신 DataClassRowMapper 사용한다.
  3. Custom으로 RowMapper를 구현한다. (성능이 주요하다면, !?) - ref. docs

쉬운 방법으로 변경 하게 됐는데, 2번을 택했습니다.

반응형