[SpringBoot] @NoArgsConstructor 접근 레벨

파이리·2024년 6월 7일
0

이슈 정의

Spring JPA를 사용하면서 @NoArgsConstructor(access = AccessLevel.PRIVATE) 어노테이션을 사용한 경우, 'Class 'StoreEntity' should have [public, protected] no-arg constructor' 에러가 발생할 수 있다. 이 문제는 JPA가 엔티티 클래스를 프록시로 생성할 때 매개변수가 없는 생성자의 접근 레벨이 public 또는 protected여야 하기 때문이다.

issue example code

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가 엔티티 클래스를 프록시로 생성할 수 있다.

solution example code

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로 해야 한다는 점을 기억하자.

0개의 댓글

관련 채용 정보