JPA Entity 는 왜 빈(empty) 생성자를 필요로 하는가?

jpa를 이용하여 엔티티를 작성하는 경우 간혹 비어있는 생성자를 만들어야 하는 경우가 있다.여기서 말하는 “간혹”이라는 경우는, 사용자가 자바에서 제공하는 기본 생성자를 사용하지 않고,생성자를 재정의 하는 경우인데, 이 때 재 정의하는 생성자가 파라미터를 필요로 하는 경우이다.


public Member(long memberId) {

this.memberId = memberId;
....
}

이렇게 생성자를 재정의 해 놓게 되면, 하이버네이트 등의 프레임워크에서 리플렉션을 이용해 해당 객체를 생성할 때 해당 객체(엔티티)의 기본 생성자를 호출하게 되는데 위와 같이 파라미터가 필요한 생성자로 재정의 한다면

Class<T>.newInstance

를 이용해서 해당 엔티티의 객체를 만들어 낼 수 없게 된다.

그래서, 사용자가 파라미터가 필요한 생성자를 재정의 하는 경우에는 반드시 파라미터가 없는 기본 생성자를 제공해 주어야 한다.

참고로 스프링 데이터를 사용하는 경우라면 위와 같은 파라미터가 필요한 생성자를 재정의하더라도 @PersistenceConstructor 어노테이션을 재정의한 생성자에 붙이게 되면 굳이 비어있는 생성자를 호출하지 않아도 된다.

@PersistenceConstructor
public Member(Long memberId) {
this.memberId = memberId;

….
}
참고로 jpa 2.0 스펙에 다음과 같이 명시되어 있다.

“엔티티는 반드시 파라미터가 없는 (no-arg) public 또는 protected 생성자가 있어야 한다.”

댓글 남기기