보통 많이 쓰는 생성자 어노테이션으로는
@AllArgsConstructor
@RequiredArgsConstructor
@NoArgsConstructor
세가지 정도가 있다.
여기서 @NoArgsConstructor 는 엔티티에 꼭 들어가는 어노테이션이다.
그 이유는 Java에서는 생성자가 없을 경우 자동으로 No-Args-Constructor 를 만들어주는데 정의되어 있는 생성자가 있을 경우 No-Args-Constructor를 자동으로 생성하지 않기 때문이다.
따라서 엔티티에 생성자를 만들면 No-Args-Constructor를 직접 정의해주어야 하는데 이를 @NoArgsConstructor 통해 하는 것이다.
이유는 Proxy 패턴 때문이다.
Jpa에서는 자주 Lazy Loading을 통해서, 객체를 프록시 형태로 조회한다.
프록시가 적용되는 방식
엔티티를 상속하는 프록시 객체를 정의.
이 프록시 객체를 초기화하기 위해 부모 객체,
즉 엔티티의 NoArgsConstructor를 호출.
그래서 NoArgsConstructor가 필요한 것!!
위에서 설명한 것 처럼 자식 객체가 부모 객체의 생성자를 호출해야 하기 때문이다.
private으로 설정된 경우, 자식 객체는 부모 객체의 생성자에 접근할 수 없기 때문에 에러가 발생한다.
좋은 글이네요. 공유해주셔서 감사합니다.