20231227 TIL

JaeYeong·2023년 12월 27일

Class should have [public, protected] no-arg constructor

1. 발생하는 이유

자바는 생성자가 없으면 자동으로 No-Args-Constructor를 생성하기 때문에, 생성자가 없다면 문제가 발생하지 않는다.
하지만 생성자를 따로 정의해준다면 No-Args-Constructor는 생성되지 않는다.

2. JPA

@Entity,@Embeddable 어노테이션을 사용하게 되면 어떤 클래스를 테이블과 맵핑할지 지정해줄 수 있다.
문제는 Entity나 Embeddable을 사용하게 될 때인데, 클래스 내에 생성자를 정의하여 테이블과 맵핑하게 된다. JPA의 Entity 클래스는 No-Args-Constructor를 필수로 요구하기 때문에 특별한 방법을 사용하지 않으면 컴파일 에러가 발생한다.
자바의 경우는 두 개의 해결책이 있는데

1. 기본 생성자 입력해주기

@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;
    }
}

2. @NoArgsConstructor 어노테이션 붙여주기

@Entity
@NoArgsConstructor
public class Ant {
	private String head;
    private String body;
    private String leg;
    
    public Ant(){}
}

3. JPA in Kotlin

사실 이 글을 적는 이유는 코틀린에서 제목의 에러가 발생했기 때문이다.

그러면 코틀린에서는?

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

https://boomrabbit.tistory.com/208

https://youtrack.jetbrains.com/issue/IDEA-275012/Java-class-xx-should-have-publicprotected-no-arg-constructor

0개의 댓글