@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 생성자)로 생성한 뒤, 프로그램이 진행되면서 동적으로 이를 채우기 때문에, 반드시 기본 생성자가 필요하다고 할 수 있다.
'Spring > 관련 지식' 카테고리의 다른 글
| JPA에서 Enum 활용 방법 (ORDINAL vs STRING 등) (0) | 2026.07.21 |
|---|---|
| N+1 문제의 개념과 해결 방법 (0) | 2026.07.09 |
| IoC/DI, 스프링 컨테이너와 Bean의 개념 (0) | 2026.07.07 |
| Spring에서의 예외 처리 (+ 커스텀 에러 구현) (0) | 2026.07.02 |
| JPA(Java Persistence API)에 대한 간단한 정리 (0) | 2026.05.13 |