🙋 Spring Data JPA에서 Entity에 기본 생성자가 필요한 이유?

필요한 이유는 동적으로 객체 생성 시 Reflection API 를 활용하기 때문이다.

JPA는 DB 값을 객체 필드에 주입할 때 기본 생성자로 객체를 생성한 후 Reflection API를 사용하여 값을 매핑한다.

때문에 기본 생성자가 없다면 Reflection은 해당 객체를 생성 할 수 없기 때문에 JPA의 Entity에는 기본 생성자가 필요하다.

 

👀 Reflection API :

🙋 기본 생성자를 'public', 'protected'로 선언해야하는 이유?

Entity 기본 생성자의 접근 제어자는 private로 선언할 수 없다.

그 이유는, JPA의 Entity 조회 방식 중 하나인 '지연로딩' '프록시 객체'와 관련이 있다.

지연로딩 시 사용되는 프록시 객체는 원본 Entity를 상속해서 만들기때문에 원본 Entity의 기본생성자가 private일 수 없는것이다. 

 

👀 지연로딩, 즉시로딩 :

더보기

지연로딩 (Lazy Loading) :

지연 로딩은 연관된 엔티티를 실제로 사용할 때 쿼리를 실행하는 방식이다.

부모 엔티티를 조회할 때 연관된 자식 엔티티는 초기에는 로딩되지 않고, 필요한 순간에 쿼리를 실행하여 데이터를 가져온다.

이를 통해 불필요한 데이터 로딩을 최소화할 수 있다.

(*프록시 객체 : 실제 사용될 때까지 조회를 지연하기위해 가짜 객체가 필요하다. 이때 프록시 객체를 사용한다.)

 

즉시로딩 (Eager Loading):

부모 엔티티를 조회할 때 연관된 자식 엔티티도 함께 조회된다.

이 경우, 쿼리는 부모 엔티티를 조회할 때 실행된다.

 

 

+ Recent posts