kotlin JPA 에러 해결

위 에러 메시지는 Hibernate와 관련이 있으며, 특히 JPA에서 @Embeddable 클래스에 대한 기본 생성자를 찾을 수 없을 때 발생합니다. Kotlin의 data class는 자동으로 기본 생성자를 제공하지만, 기본 생성자에 디폴트 값을 명시하지 않으면 JPA에서 요구하는 기본 생성자로 인식되지 않을 수 있습니다.

해결 방안

  1. 디폴트 값 추가
    JPA는 기본 생성자를 요구하므로, data class에 기본 생성자를 명시적으로 추가하고 디폴트 값을 제공해야 합니다.

    kotlin
    @Embeddable data class IaasAccessId( val projectId: String = "", val regionCode: RegionCode = RegionCode.DEFAULT ) : Serializable

    여기서 RegionCode.DEFAULTRegionCode 클래스에 정의된 기본 값으로, 필요에 따라 적절히 설정해야 합니다.

  2. 기본 생성자를 제공하기 위해 클래스에 @JvmOverloads 사용 (선택 사항)
    기본 생성자에 디폴트 값을 제공할 경우 @JvmOverloads 어노테이션을 추가하여 생성자 오버로드를 생성할 수 있습니다. 이는 JPA가 호출할 기본 생성자를 명시적으로 제공하게 만듭니다.

    kotlin
    @Embeddable data class IaasAccessId @JvmOverloads constructor( val projectId: String = "", val regionCode: RegionCode = RegionCode.DEFAULT ) : Serializable
  3. @Embeddable 명시
    JPA가 클래스가 임베디드 타입임을 인식하려면 @Embeddable 어노테이션이 필요합니다. IaasAccessId 클래스에 추가해야 합니다.

  4. Kotlin에서 val 또는 var 프로퍼티 사용
    JPA는 클래스의 필드 접근자 메서드를 활용하므로 모든 필드는 val 또는 var 키워드로 선언해야 합니다. val은 읽기 전용이지만, JPA는 프록시 객체 생성을 위해 리플렉션을 사용하기 때문에 문제 없이 동작합니다.

  5. Hibernate 설정 확인
    Hibernate가 Kotlin의 클래스와 잘 호환되도록 하기 위해 hibernate-enhance-maven-plugin 또는 Gradle용 Hibernate Kotlin 확장 모듈을 사용하는 것이 좋습니다.


최종 코드 예시

kotlin
import java.io.Serializable import jakarta.persistence.Embeddable @Embeddable data class IaasAccessId( val projectId: String = "", val regionCode: RegionCode = RegionCode.DEFAULT ) : Serializable enum class RegionCode { DEFAULT, REGION_1, REGION_2 }

이렇게 하면 JPA가 IaasAccessId@Embeddable 타입으로 인식하고 기본 생성자 문제 없이 동작할 것입니다.

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다