반응형
- Entity는 반드시 `기본 생성자`를 가져야한다.
- 기본 생성자의 접근 제어자는 `public`, `protected`이어야한다.
JPA를 학습할 때 위와 같은 원칙을 본적이 있을 겁니다. 무심코 넘어갔던 개념을 되짚어보기 위해 JPA Entity의 기본 생성자에 대해 포스팅 해보겠습니다.
기본 생성자가 있어야하는 이유?
리플렉션(Reflection)을 통한 객체 생성:
JPA는 데이터베이스로부터 엔티티 객체를 생성하여 값을 주입할 때 `Reflection API`를 이용합니다. Reflection API를 통해 객체를 생성하려면 `기본 생성자`가 반드시 필요합니다. JPA는 Entity의 기본 생성자로 객체를 생성한후 Reflection API를 사용하여 값을 매핑합니다. 따라서 Entity에는 기본 생성자가 필수이며 기본 생성자가 없다면 예외가 발생합니다.
프록시(Proxy) 생성을 위해 필요:
JPA에서는 지연 로딩을 위해 프록시 객체를 사용합니다. 이때 프록시를 생성하려면 기본 생성자가 있어야 합니다.
기본 생성자가 public, protected 이어야 하는 이유?
기본 생성자의 접근 제어자를 private로할 경우, 지연 로딩으로 설정시 Proxy 관련 오류가 발생합니다.
지연 로딩(LAZY)인 경우 프록시를 생성을 합니다. 프록시를 생성하는 과정에 대해 간단하게 설명하겠습니다.
- 객체 생성:
프록시 객체를 생성하기 위해 엔티티 클래스의 인스턴스를 만들어야합니다. 이때 `Reflection API`를 통해 기본 생성자로 클래스의 인스턴스를 만듭니다. - 상속:
프록시 클래스는 원본 엔티티 클래스의 상속을 받습니다. 자바의 상속 구조에선 상위 클래스의 생성자가 호출되기 때문에, 기본 생성자가 상위 클래스에 정의되어 있어야 합니다. - 접근 제어자(public, protected):
프록시 객체를 생성하기 위해선 원본 엔티티 클래스에 접근할 수 있어야합니다. 때문 기본 생성자가 public 또는 protected로 선언되어 있지 않으면 프록시 객체를 생성할 수 없습니다.
반응형
'Spring Data > JPA' 카테고리의 다른 글
JPA Spring Data JPA: 스프링 프레임워크에서 JPA 편리하게 사용하기 (0) | 2023.08.25 |
---|---|
JPA JPQL(객체 지향 쿼리 언어)를 완벽히 이해해보자 (0) | 2023.08.23 |
JPA '값 타입'의 선언과 활용, @AttributeOverride와 @ElementCollection, @CollectionTable 역할 (1) | 2023.08.23 |
JPA 영속성 전이(CASCADE)와 고아 객체 제거: 데이터 일관성과 관리 효율 높이는 전략(방법) (0) | 2023.08.23 |
JPA 프록시와 지연로딩: 성능 최적화를 위한 기술(방법) (0) | 2023.08.22 |