Everyday Dev System

JPA의 엔티티는 왜 기본 생성자가 있어야 할까? 본문

나의 호기심

JPA의 엔티티는 왜 기본 생성자가 있어야 할까?

chaeyoung- 2023. 7. 18. 15:15
All persistent classes must have a default constructor (which can be non-public) so that Hibernate can instantiate them using Constructor.newInstance(). It is recommended that you have a default constructor with at least package visibility for runtime proxy generation in Hibernate.

 

한번 빈 생성자를 없애고 실행해봤다. 

역시나 안됐다!

 

JPA(Java Persistence API)에서 @Entity 어노테이션을 사용하여 엔티티 클래스를 정의할 때, 기본 생성자(빈 생성자)가 꼭 필요한 이유가 있습니다.


JPA는 엔티티 객체를 생성하고 관리하기 위해 Java Reflection을 사용합니다. Reflection은 클래스의 인스턴스를 생성하고 속성에 접근하는 등의 동적인 작업을 수행할 수 있는 기능을 제공합니다.


JPA에서 엔티티 객체를 생성할 때, 빈 생성자가 필요한 이유는 다음과 같습니다:

  1. 프록시(Proxy) 객체 생성: JPA는 지연 로딩(Lazy Loading)과 같은 성능 최적화를 위해 프록시 객체를 사용합니다. 프록시 객체는 실제 엔티티 객체를 대신하여 로딩을 지연시키고, 필요한 시점에 실제 객체를 로딩합니다. 프록시 객체를 생성하기 위해서는 기본 생성자가 필요합니다.
  2. 엔티티 객체 초기화: JPA는 엔티티 객체를 생성한 후 필요한 초기화 작업을 수행합니다. 예를 들어, JPA 구현체는 엔티티 클래스의 필드 값을 초기화하거나 관계를 설정하는 등의 작업을 수행할 수 있습니다. 이러한 초기화 작업을 위해서는 빈 생성자가 필요합니다.
  3. ORM 매핑: JPA는 객체와 데이터베이스 간의 매핑을 수행합니다. 엔티티 클래스의 필드와 데이터베이스 테이블의 컬럼을 매핑하기 위해, JPA는 리플렉션을 사용하여 엔티티 객체를 생성하고 값을 설정합니다. 이를 위해서는 빈 생성자가 필요합니다.

따라서 JPA에서 @Entity 어노테이션이 적용된 클래스는 기본 생성자(빈 생성자)를 가져야 합니다. 기본 생성자를 직접 정의하지 않을 경우에는, Java 컴파일러가 자동으로 매개변수가 없는 기본 생성자를 생성합니다. 그러나 엔티티 클래스에 다른 생성자가 정의되어 있는 경우에는, 명시적으로 기본 생성자를 추가해야 합니다.


기본 생성자는 JPA에서 엔티티 객체의 생성과 초기화에 필요한 중요한 역할을 수행하므로, 엔티티 클래스에 빈 생성자를 추가해야 합니다.

 

 

 

 

 


references : 

https://prolog.techcourse.co.kr/studylogs/2489

 

우아한테크코스 학습로그 저장소

우아한테크코스 크루들이 배운 내용을 기록하는 학습로그 저장소입니다.

prolog.techcourse.co.kr