Spring JPA를 사용하면서 @NoArgsConstructor(access = AccessLevel.PRIVATE)
어노테이션을 사용한 경우, 'Class 'StoreEntity' should have [public, protected] no-arg constructor' 에러가 발생할 수 있다. 이 문제는 JPA가 엔티티 클래스를 프록시로 생성할 때 매개변수가 없는 생성자의 접근 레벨이 public 또는 protected여야 하기 때문이다.
import lombok.NoArgsConstructor;
import lombok.AccessLevel;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class StoreEntity {
@Id
private Long id;
private String name;
}
JPA는 엔티티 클래스를 프록시로 생성할 때 기본 생성자를 사용한다. 그러나 기본 생성자의 접근 레벨이 private인 경우, JPA는 해당 생성자에 접근할 수 없어 에러가 발생한다. 따라서 기본 생성자의 접근 레벨을 public 또는 protected로 설정해야 한다.
기본 생성자의 접근 레벨을 private에서 protected로 변경한다. 이렇게 하면 JPA가 엔티티 클래스를 프록시로 생성할 수 있다.
import lombok.NoArgsConstructor;
import lombok.AccessLevel;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class StoreEntity {
@Id
private Long id;
private String name;
}
이렇게 수정하면 JPA가 엔티티 클래스를 프록시로 생성할 때 문제가 발생하지 않는다. 엔티티 클래스는 매개변수가 없는 생성자의 접근 레벨이 public 또는 protected로 해야 한다는 점을 기억하자.