티스토리 뷰

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

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함