![[KOTLIN] JPA - SPRINGBOOT No-arg constructor Error](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpaaWN%2FbtsCDemTSVD%2FOn698OlUxCDNDcol74SeAk%2Fimg.png)
이번 사이드 프로젝트 INIT 과의 연동을 위한 웹서버를 만들면서 에러에 봉착했다.
Kotlin 으로 Entity 클래스를 작성하고 있었는데 파라미터 없는 생성자 (no arg constructor) 관련 에러가 발생했기 때문
JPA error in kotlin : Class 'Users' should have [public, protected] no-arg constructor
위 에러를 해석해보자면
코틀린 클래스 Users 에서 JPA 에러가 발생했는데, no-arg constructor를 public 또는 protected 형태로 가지고 있어야한다.라고 한다.
no-arg constructor가 왜 있어야하는지부터 알아야 할거같다.
jpa 의 구현체인 hibernate 는 database 와 객체를 매핑하기 위해서 class 에 대해 조사해야 한다, reflection 방식을 이용하기에 클래스의 타입을 몰라도 접근 가능하지만, 생성자 인수에 어떤것들이 있는지에 대해서는 접근이 불가능하기에 no-arg constructor를 필요로 한다.
no-arg constructor 와 관련된 kotlin + spring 에서 쓰이는 내용들을 정리해보며 해결하기로 했다.
1. data class
2. @Entity @MappeSuperClass @Embeddable
3. kotlin-jpa
1. data class
data class 란
- toString()
- hashCode()
- equals()
- copy()
메소드를 기본적으로 생성해주는 코틀린의 클래스이다.
심지어 property 에 대해서 destruct 또한 가능하여 편리하게 사용할 수 있도록 해주는 코틀린의 class 이다.
data class는 기본적으로 위의 내용과 no-arg constructor 를 생성해주기에 data class 를 사용한다면 no-arg 에러가 뜨면 안된다 생각했다.
하지만 에러가 발생했다.
data class 를 사용해도 database 와 연결 맺는 hibernate 가 이 class 를 조사할 때 reflection 방식을 사용하기 때문에 반드시 no-arg constructor가 필요한데 data class 로 생성된 no-arg constructor 는 hibernate 에서 인식을 못한다. 그렇기에 다른 방식으로라도 생성을 해주어야한다.
🔥 추가적으로
hibernate 에서 사용하는 reflection 방식은 당연하게도 public 한 클래스를 필요로 한다.
하지만 kotlin 은 default 로 전부 private 한 클래스로 만들어지기에
모든 클래스를 선언할 때 open 을 붙이던
all open 플러그인을 사용하던
kotlin-spring 플러그인 ( all open 플러그인을 내장 ) 을 사용하면 된다.
그리고 또한 data class 와 Entity 조합은 지양되고 있으므로 일반 class를 사용하는 것이 좋다.
JPA Entity 심층탐구 (1) Entity에 Kotlin Data class를 써도 될까?
JPA Entity에 kotlin data class를 사용해도 될까?
velog.io
2. @Entity @MappeSuperClass @Embeddable
@Entity 와 @MappeSuperClass 은 기본적으로 no-arg constructor 를 생성해준다고 하는 글들이 있었다.
하지만 정확히는 kotlin-jpa 플러그인을 설치한뒤의 얘기이다.
kotlin-jpa 플러그인은 @Entity, @MappedSuperClass, @Embeddable 어노테이션이 붙은 클래스에 no-arg constructor 를 만들어주는 역할을 한다.
플러그인 없이는 해당 어노테이션들을 사용해도 no-arg 에러가 발생한다.
3. kotlin-jpa
위에 말했듯이 kotlin-jpa 플러그인은 특정 어노테이션이 있는 클래스에 대해서 no-arg constructor를 자동으로 포함시켜주는 고마운 플러그인이다.
결론
data class 보단 일반 class 를 사용하자
build.gradle 에 플러그인을 추가하자
id 'org.jetbrains.kotlin.plugin.jpa' version '1.9.20'
📚 참고 자료
- https://velog.io/@chodakk/KotlinSpring-Hibernate%EC%97%90-data-class-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
- https://techblog.woowahan.com/2675/
- https://kotlinlang.org/docs/no-arg-plugin.html#jpa-support
- https://velog.io/@heyday_7/JPA-Entity-%EC%8B%AC%EC%B8%B5%ED%83%90%EA%B5%AC-1-Entity%EC%97%90-Kotlin-Data-class%EB%A5%BC-%EC%8D%A8%EB%8F%84-%EB%90%A0%EA%B9%8C
'Back End > SPRING BOOT' 카테고리의 다른 글
Spring boot 부하 테스트, 나도 할 수 있을까? (0) | 2024.05.27 |
---|---|
Spring boot AWS 배포, 나도 할 수 있을까? (0) | 2024.05.25 |
[Intellij] Annotation 작동 안함 고장 비상! (0) | 2024.01.08 |
환경변수 주입하기 .with Intellij (0) | 2024.01.08 |
[KOTLIN] JPA LOGGING SPRING BOOT 3.x.x (1) | 2023.12.27 |
백엔드는 못말려
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!