엔티티(Entity) 기본 생성자 - Reflection API

HotFried·2023년 9월 25일
0

JPA에서 엔티티는 반드시 public 또는 protected인 기본 생성자를 가져야 한다.
자바에서 제공하는 리플렉션 API(reflection API)를 활용하여 동적으로 객체를 생성하기 때문이다.

만약, 기본 생성자가 없거나, private인 경우 리플랙션 API는 객체를 생성할 수 없게 된다.


Java Reflection API

  • 구체적인 클래스 타입을 알지 못하더라도 해당 클래스 이름을 통해 메서드, 타입, 변수 등에 접근할 수 있도록 해주는 API

  • Reflection을 활용하여 런타임 시점에 동적으로 클래스 객체를 생성할 수 있다.


Entity의 모든 필드에 setter를 사용하는 것은 객체에 대한 값 변경이 어느 곳에서든 일어날 수 있어 최대한 사용을 지양해야 한다..

Reflection는 기본 생성자를 통해 객체를 생성하여 setter를 사용하지 않고도 필드에 값을 추가할 수 있다. 또한, private 메서드에 접근할 수 있다.

따라서 JPA에서는 기본 생성자가 필요한 것이다.


private로 선언할 수 없다

기본 생성자의 접근 제어자는 public 또는 protected로 선언해야 하고, private는 선언 불가능하다.

JPA가 매핑한 엔티티를 지연로딩(LAZY)으로 객체에 접근할 경우 hibernate는 프록시(Proxy) 객체를 생성하여 사용하기 때문이다.

프록시 객체는 실제 엔티티 클래스를 상속받은 객체로 public 또는 protected인 기본 생성자가 필요하다.
-> 기본 생성자가 private인 경우 상속 받은 클래스에서 호출이 불가능하다.


Note:

  1. JPA는 Reflection API를 사용하여 객체를 생성하기 때문에 기본 생성자 필요

  2. 지연로딩(LAZY)으로 인해 생성된 프록시 객체를 사용하기 위해서는 private로 선언이 불가능

profile
꾸준하게

0개의 댓글