개발 일지/Spring
[Spring Data JPA] No default constructor for entity
미숫가루설탕많이
2023. 3. 13. 15:44
Spring Data JPA에서 Entity 클래스에 @NoArgsConstructor를 작성하지 않는 경우 No default constructor for entity라는 에러가 발생한다. 정확하게는 findById() 같은 API를 사용해서 데이터를 조회할 때 에러가 발생하는 것이라고 한다.
Entity 클래스에서 @NoArgsConstructor 애너테이션을 추가하는 이유를 찾아봤다.
- Spring Data JPA에서는 Entity 클래스를 사용해서 데이터베이스랑 매핑한다. 이때, 데이터베이스에서 조회한 데이터를 Entity 객체에 매핑할 때 Reflection을 통해 객체를 생성하고 getter / setter 메서드를 통해 데이터를 할당한다.
- Reflection이란 실행 중인 자바 프로그램 내부의 클래스, 필드, 메서드 등의 정보를 찾거나 수정하는 기능이다.
- 여기서 Reflection이 객체를 생성할 때는 기본 생성자를 필요로 하기 때문에 Entity 클래스에 @NoArgsConstructor 애너테이션을 추가하는 것이다.
- 기본 생성자를 필요로 하는 이유는 Reflection을 사용하는 코드(Entity 클래스의 정보를 활용하는 코드)가 Java 언어의 객체 생성 방식을 따르기 때문이다. (Java에서 객체를 생성할 때 new 키워드 뒤에 생성자를 호출해서 객체를 초기화..)
결론
- Java의 Reflection에서 객체를 생성하기 위해서는 파라미터가 없는 디폴트 생성자가 필요하다.
- 이러한 이유로 Spring Data JPA에서 사용되는 Entity 클래스에는 디폴트 생성자를 만들어줘야 한다.
Reflection의 원리를 더 공부하려 했으나 시간이 걸릴 것 같아 기존 학습을 먼저 진행하고 시간이 남으면 추가로 학습을 진행해봐야할 것 같다.
틀린 내용이 있으면 지적해주세요! 감사합니다