본문 바로가기
Spring/관련 지식

생성자를 구현했는데도 @NoArgsConstructor를 쓰는 이유

by 정구정구 2026. 7. 4.

@NoArgsConstructor란?

Lombok에서 제공하는 어노테이션으로, 매개 변수가 없는 생성자를 자동으로 생성해준다.

만약 Schedule 이라는 클래스가 있다면,

public Schedule() { }

 

위의 코드를 자동으로 추가해주는 어노테이션인 것이다.

 

 

발생한 상황

프로젝트를 진행하던 중, 아래와 같이 Entity를 만들었다.

@Getter
@Entity
@Table(name = "schedules")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Schedule extends BaseEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 30, nullable = false)
    private String title;

    @Column(length = 200, nullable = false)
    private String contents;

    @Column(length = 12, nullable = false)
    private String authorName;

    @Column(length = 60, nullable = false)
    private String pw;

    public Schedule(String title, String contents, String authorName, String pw) {
        this.title = title;
        this.contents = contents;
        this.authorName = authorName;
        this.pw = pw;
    }
}

 

리펙토링을 위해 코드를 보던 중, 생성자가 있는데 굳이 @NoArgsConstructor를 쓸 필요가 없을 것 같아서 제거 했더니 

클래스 'Schedule'에는 [public, protected] no-arg 생성자가 포함되어야 합니다.

 

라는 에러가 발생했다.

 

 

왜 생성자가 있는데도 no-arg 생성자가 필요할까?

이유는 JPA의 Entity 클래스 이기 때문

 Schedule 클래스는 @Entity 어노테이션을 통해 JPA의 Entity로 선언된 클래스이다. 그리고 JPA의 Entity 클래스에는 반드시 no-arg 생성자(파라미터가 없는 생성자)가 필요하다. 그 이유는 JPA가 Entity 객체를 생성할 때 직접 new를 사용하지 않고Java Reflection API 기능을 사용하기 때문이다. (따라서 @Entity를 지우면, @NoArgsConstructor를 지워도 에러가 발생하지 않는다.)

 

Java Reflection API란 무엇인가?

  •  프로그램이 런타임 중에도 클래스의 구조에 접근하고 조작할 수 있게 해주는 기능을 제공
  • ( = 컴파일한 클래스를 동적으로 프로그램이 가능 )
  • 프레임워크나 라이브러리는 사용자가 어떤 클래스를 만들지 예측할 수 없기 때문에 동적으로 해결해주기 위해서 사용
  • 직접 실무에 사용하면 가독성도 떨어지고 성능도 떨어짐

즉, JPA에선 일단 Entity를 기본 생성자(no-arg 생성자)로 생성한 뒤, 프로그램이 진행되면서 동적으로 이를 채우기 때문에, 반드시 기본 생성자가 필요하다고 할 수 있다.