- Spring Data JPA는 자바에서 제공하는 Reflection API를 사용하여 동적으로 객체를 생성하기 때문이다.
Java Reflection API
- 구체적인 클래스 타입을 알지 못하더라도 해당 클래스 이름을 통해 메서드, 타입, 변수등에 접근 할 수 있도록 해주는 API
- 런타임 시점에 동적으로 클래스 객체 생성 가능
- 일반적을로 객체에 데이터를 넣기 위해선 new, setter 등이 필요하나, entity의 모든 필드에 setter를 사용하는것은 객체의 값 변경이 어디에서든 일어날 수 있어 사용을 피하는게 좋음
- Reflection은 기본 생성자를 통해 객체를 생성 → setter없이도 데이터 넣을 수 있다.
- Java Reflection API에 대한 상세설명 //!!!
그런데 왜 public 이나 protected로 선언해야 하나?
- JPA가 매핑한 엔티티를 지연로딩(LAZY)으로 객체에 접근할 경우 hibernate는 프록시(Proxy) 객체를 생성하여 사용하기 때문
- 프록시 객체는 실제 엔티티 클래스를 상속받은 객체인데, 기본 생성자가 private이면 상속받은 클래스에서 호출이 불가능
REFERENCE
https://ittrue.tistory.com/298