🙋 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):
부모 엔티티를 조회할 때 연관된 자식 엔티티도 함께 조회된다.
이 경우, 쿼리는 부모 엔티티를 조회할 때 실행된다.
'Spring' 카테고리의 다른 글
[Spring AOP] @Cacheable 캐싱 적용 안 될 때 해결법 (Redis 캐시 확인) (3) | 2024.09.08 |
---|---|
[JPA] JPA 쿼리 생성 (쿼리 메소드, JPQL, QueryDSL) (1) | 2023.12.23 |
[Springboot, JPA] Springboot, JPA를 활용한 프로젝트 단계 - 참고 (0) | 2023.12.23 |
[Spring Boot] 동작 환경 - @ResponseBody, viewResolver (0) | 2023.09.15 |