프로그래밍/Kotlin

Kotlin + JPA 의 val id 이슈

seungdols 2025. 1. 21. 21:33

kotlin을 이용해 아주 잘 쓰고 있었다. 그런데, jpa를 만나기 전까지는 그랬다.

Entity를 어떻게 구성 할까 하다 늘 고민이 있었다. 

Data class로 쓰다가, Class로 쓰다가~ 이것 저것 하다가 id만 불변으로 설정 하자. 

@Entity
@Table(name = "target")
class Target(
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column
    val id: Long = 0,
) {
  // 기타 코드
}

id를 불변으로 처리 하니, 바뀔 일은 없겠지! 하는 순간, 문제가 발생 한다. 

Jpa 관련 된 ItemReader의 경우에는 id를 정상적으로 잘 가져오지만, 

    @Bean
    @StepScope
    fun targetItemReader(
        @Value("#{jobParameters['id']}") id: Long,
    ): JdbcPagingItemReader<Target> {
        return JdbcPagingItemReaderBuilder<Target>()
            .name("targetItemReader")
            .dataSource(secondaryDataSource)
            .queryProvider(queryProvider(id))
            .rowMapper(BeanPropertyRowMapper(Target::class.java))
            .pageSize(1000)
            .build()
    }

보통 위처럼 이렇게 쓰게 될텐데, Jdbc 관련 된 ItemReader의 경우에는 id 값이 0으로 고정 된다. 

그렇기때문에, var id 로 바꿔주거나, jpa 관련 ItemReader를 쓰는게 좋겠다. 그것도 아니면, rowMapper를 Custom으로 생성 해서 활용 하는 방법이 있는데, 개발자마다 인지 하고 있어야 하는 이슈이다 보니,  var 로 통일 하는게 맞을 것 같다.

사실, 이슈 없게 하려면, var id가 맞는 것 같은데.... (아~뭔가 kotlin 느낌이 아니다)

혹시 깔끔하게 해결하는 방법을 아시는 분 계신다면, 댓글로 가르침 부탁드립니다.

반응형