자바는 생성자가 없으면 자동으로 No-Args-Constructor를 생성하기 때문에, 생성자가 없다면 문제가 발생하지 않는다.
하지만 생성자를 따로 정의해준다면 No-Args-Constructor는 생성되지 않는다.
@Entity,@Embeddable 어노테이션을 사용하게 되면 어떤 클래스를 테이블과 맵핑할지 지정해줄 수 있다.
문제는 Entity나 Embeddable을 사용하게 될 때인데, 클래스 내에 생성자를 정의하여 테이블과 맵핑하게 된다. JPA의 Entity 클래스는 No-Args-Constructor를 필수로 요구하기 때문에 특별한 방법을 사용하지 않으면 컴파일 에러가 발생한다.
자바의 경우는 두 개의 해결책이 있는데
@Entity
public class Ant {
private String head;
private String body;
private String leg;
public Ant (String head, String body, String leg) {
this.head = head;
this.body = body;
this.leg = leg;
}
}
@Entity
@NoArgsConstructor
public class Ant {
private String head;
private String body;
private String leg;
public Ant(){}
}
사실 이 글을 적는 이유는 코틀린에서 제목의 에러가 발생했기 때문이다.
kotlin-jpa plugin을 사용하면 된다. 해당 플러그인은 기본 생성자를 알아서 생성해주기 때문에, 자바와 같은 방법을 사용하지 않아도 된다.
추가하는 방법은 먼저 프로젝트 내 build.gradle로 접근한 후에 아래 코드
plugins {
kotlin("plugin.jpa") version "1.8.0"
}
를 추가해 주면 된다.
위의 코드를 코틀린으로 바꿔보면
@Entity
public class Ant (
var head : String,
var body : String,
var leg : String
)
{
code....
}
어떤 버전을 적용할지는 아래 링크를 확인해보면 될 듯
https://spring.io/guides/tutorials/spring-boot-kotlin/
https://velog.io/@haeyon098/kotlin-JPA-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0