부트모아

[V1] 엔티티에 기본 생성자가 반드시 필요한 이유

승무_ 2024. 9. 28. 14:40

게시글 entity를 만들던 중 다음과 같은 오류를 만났다.

 

Article 클래스는 [public, protected] 기본 생성자가 필요하다는 오류였는데, 사용하지 않을 생성자가 왜 반드시 필요한지 궁금하여 이유를 찾아보았다.

 

엔티티에 기본 생성자가 필요한 이유

JPA는 엔티티에 기본 생성자를 만드는 것을 강제하고 있는데 그 이유는 DB에서 데이터를 조회해 온 뒤 객체를 생성할 때 Reflection을 사용하기 때문이다. Reflection은 클래스 이름만 알면 생성자, 필드, 메서드 등 클래스의 모든 정보에 접근이 가능하다는 특징이 있다. 하지만 생성자의 매개변수 정보는 가져오지 못해 기본 생성자로 객체를 생성하고 필드 값을 매핑하는 특징이 있다.

 

그렇다면 Reflection을 사용하는 이유가 무엇인가?

이는 우리가 엔티티로 어떤 타입을 생성할 지 JPA가 알 수 없기 때문이다. 때문에 어떤 타입으로 만들더라도 해당 엔티티를 생성하기 위해 Reflection을 사용한다.

 

기본 생성자는 꼭 public이어야 하는가?

JPA에서 엔티티를 매핑하는 방식으로 조회 시 연관 엔티티의 정보도 즉시 가져오는 즉시 로딩(Eager Loading)과 연관 엔티티를 바로 가져오지 않고 프록시 객체를 생성 후 사용 시 가져오는 지연 로딩(Lazy Loading)이 있다. 여기서 지연 로딩을 사용할 경우 생성자가 private이면 안된다.

 

왜 지연 로딩일 경우 private이 안되는가?

엔티티의 프록시는 원본 엔티티를 상속해서 만드는데 기본 생성자가 private으로 선언되어 있다면 해당 엔티티를 상속한 프록시를 만들 수 없기 때문이다.