소공전 457

컴개론·2024년 8월 2일

이슈 정의

Spring JPA를 사용하여 엔티티 클래스를 정의할 때, @NoArgsConstructor(access = AccessLevel.PRIVATE)를 사용하면 'Class 'StoreEntity' should have [public, protected] no-arg constructor' 에러가 발생할 수 있다. 이 문제는 JPA가 엔티티 클래스를 프록시로 생성할 때 기본 생성자에 접근할 수 없기 때문에 발생한다.

issue example code

import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
@NoArgsConstructor(access = AccessLevel.PRIVATE) // 여기서 문제가 발생
public class StoreEntity {
    @Id
    private Long id;
    private String name;
}

원인 추론

JPA는 엔티티 객체를 프록시로 생성할 때 기본 생성자에 접근해야 한다. 하지만 @NoArgsConstructor(access = AccessLevel.PRIVATE)를 사용하면 기본 생성자의 접근 레벨이 private으로 설정되어 JPA가 이를 사용할 수 없게 된다. 따라서 JPA는 기본 생성자의 접근 레벨이 public 또는 protected여야 한다.

해결 방법

기본 생성자의 접근 레벨을 public 또는 protected로 변경해야 한다. 이를 위해 @NoArgsConstructor(access = AccessLevel.PROTECTED)를 사용하면 된다. 이렇게 하면 JPA가 엔티티 객체를 프록시로 생성할 때 기본 생성자에 접근할 수 있게 된다.

solution example code

import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 접근 레벨을 protected로 변경
public class StoreEntity {
    @Id
    private Long id;
    private String name;
}

이렇게 수정하면 JPA가 엔티티 객체를 프록시로 생성할 때 기본 생성자에 접근할 수 있어 'Class 'StoreEntity' should have [public, protected] no-arg constructor' 에러가 발생하지 않는다.

0개의 댓글