티스토리 뷰
Entity가 기본생성자를 필요로 하는 이유
- JPA는 DB 값을 자바 객체로 직렬화할 때 Reflection을 이용함
- Reflection이란 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 Java API
- JPA에서는 자바 객체로 직렬화할 때 기본생성자를 통해 먼저 객체를 만들고나서, Reflection을 통해 필드 값을 주입함
- 따라서 Entity에는 기본생성자가 필요하고 기본생성자가 없다면 예외가 발생함(InstantiationException)
Proxy
- '상속'을 이용해 특정 객체를 한 번 감싸 이전, 이후에 특정 로직을 추가하도록 하는 개념
- JPA의 fetch 타입을 LAZY(지연로딩)으로 할 경우, Proxy로 해당 객체를 한 번 감싸기 때문에 기본생성자를 protected, default, public 중 하나로 지정해야 함
- private로 생성자를 만들 경우, Proxy에서 해당 객체를 생성 및 직렬화할 수 없음
- 객체의 무분별한 생성을 막기 위해서(대체로 프록시에서만 객체를 생성하도록 함) 기본생성자 타입을 protected로 하는 것이 좋음
cf. LAZY fetch가 아닌 엔티티에서도 protected 생성자가 먹히는 이유(수정중)
- Hibernate Proxy는 Entity를 감싸고 적절한 시점에 Initialize 하여 Entity 정보를 설정하고 getImplementation로 Entity에 접근 할 수 있어야 하기 때문에 프록시를 사용함
- LAZY fetch와 상관없이 entity 자체도 Proxy로 관리되기 때문에 entity 자체에 protected 기본 생성자로 만들어도 생성됨
'[ 백엔드 개발 ] > [ Spring ]' 카테고리의 다른 글
<추천글>[JPA] CascadeType.REMOVE vs orphanRemoval true (0) | 2022.01.10 |
---|---|
<추천글>[JPA] 연관관계 핵심 정리 (JPA의 근본적인 문제) (0) | 2022.01.04 |
[spring] Bean 생성 순서와 Bean Life Cycle (빈 생명주기) (0) | 2021.12.14 |
[test] Test Double과 Mockito, BDDMockito 프레임워크 (0) | 2021.12.08 |
[spring] Spring MVC, Dispatcher Servlet (0) | 2021.10.18 |
- Total
- Today
- Yesterday
- Kotlin
- Stream
- ubuntu
- Non-Blocking
- CICD
- 컨트롤러
- Controller
- kafka
- jvm
- ci/cd
- K8s
- GitOps
- Kubernetes
- Java
- 우분투
- github actions
- RDB
- LFCS
- rolling update
- golang
- go
- 쿠버네티스
- argocd
- 코틀린
- docker
- 카프카
- db
- container
- spring
- Linux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |