[JPA] Entity와 기본생성자, Proxy

2022. 1. 4. 15:47[ 백엔드 개발 ]/[ Spring ]

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 기본 생성자로 만들어도 생성됨