개발 일지/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 애너테이션을 추가하는 이유를 찾아봤다.

 

  1. Spring Data JPA에서는 Entity 클래스를 사용해서 데이터베이스랑 매핑한다. 이때, 데이터베이스에서 조회한 데이터를 Entity 객체에 매핑할 때 Reflection을 통해 객체를 생성하고 getter / setter 메서드를 통해 데이터를 할당한다.
  2. Reflection이란 실행 중인 자바 프로그램 내부의 클래스, 필드, 메서드 등의 정보를 찾거나 수정하는 기능이다.
  3. 여기서 Reflection이 객체를 생성할 때는 기본 생성자를 필요로 하기 때문에 Entity 클래스에 @NoArgsConstructor 애너테이션을 추가하는 것이다.

  4. 기본 생성자를 필요로 하는 이유는 Reflection을 사용하는 코드(Entity 클래스의 정보를 활용하는 코드)가 Java 언어의 객체 생성 방식을 따르기 때문이다. (Java에서 객체를 생성할 때 new 키워드 뒤에 생성자를 호출해서 객체를 초기화..)

 

 결론

  • Java의 Reflection에서 객체를 생성하기 위해서는 파라미터가 없는 디폴트 생성자가 필요하다.
  • 이러한 이유로 Spring Data JPA에서 사용되는 Entity 클래스에는 디폴트 생성자를 만들어줘야 한다.

 

 Reflection의 원리를 더 공부하려 했으나 시간이 걸릴 것 같아 기존 학습을 먼저 진행하고 시간이 남으면 추가로 학습을 진행해봐야할 것 같다.

 

 틀린 내용이 있으면 지적해주세요! 감사합니다