프레임워크(Framework)/JPA

[JPA] 엔티티(Entity) 기본 생성자 사용 이유 - Reflection API

잇트루 2023. 1. 14. 03:45
반응형

Intro

JPA에서 엔티티는 반드시 public 또는 protected인 기본 생성자를 가져야 한다.

이 것이 가능한 이유는 자바에서 제공하는 리플렉션 API(reflection API)를 활용하여 동적으로 객체를 생성하기 때문이다.

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

 

 

Java Reflection API

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

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

 

일반적으로 객체에 데이터를 넣기 위해서는 new 생성자 또는 setter 등이 필요하며, 접근 제어자에 따라 데이터를 넣지 못할 수도 있다. 하지만, Entity의 모든 필드에 setter를 사용하는 것은 객체에 대한 값 변경이 어느 곳에서든 일어날 수 있어 최대한 사용을 피한다.

 

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

 

Spring Data JPA에서는 이러한 Reflection API를 사용하기 때문에 기본 생성자가 필요로 하는 것이다.

 

 

기본 생성자가 private로 선언할 수 없는 이유

Spring Data JPA 엔티티의 기본 생성자의 접근 제어자는 public 또는 protected로 선언해야 하며, private는 선언 불가능하다.

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

프록시 객체는 실제 엔티티 클래스를 상속받은 객체로 public 또는 protected인 기본 생성자가 필요하다.

  • 기본 생성자가 private인 경우 상속 받은 클래스에서 호출이 불가능

 

정리

위 내용을 정리하면, JPA는 Reflection API를 사용하여 객체를 생성하기 때문에 기본 생성자가 필요하고, 지연로딩(LAZY)으로 인해 생성된 프록시 객체를 사용하기 위해서는 private로 선언이 불가능하기 때문이다.

반응형