엔티티 클래스에 NoArgsConstructor(AccessLevel.PROTECTED)의 사용 이유 - 2-7-team/user-service GitHub Wiki
엔티티 클래스에 NoArgsConstructor가 반드시 필요한 이유
1. Jpa가 DB로부터 값을 조회해 올 때 필요합니다.
JPA는 DB로부터 값을 가져올 때, 기본 생성자로 빈 객체를 우선 생성한 뒤, 해당 객체에 값을 채워 엔티티 객체를 가져옵니다. 이때 반드시 기본 생성자인 NoArgsConstructor가 필요합니다.
2. Lazy 전략 등 프록시 객체를 반환해야 할 때 필요
Lazy로 연관관계가 맺어있을 때, 연관 정보를 조회해올 때는 가상의 프록시 객체를 조회해 오도록 되어있는데, 이때 빈 객체 (Noargsconstructor)가 반드시 필요합니다.
NoArgsConstructor에 (AccessLevel.PROTECTED) 가 붙는이유
위와 같이 Lazy일 경우 프록시 객체를 조회해오는 과정에서, 프록시 객체는 조회해올 객체를 상속하는 자식 객체의 형태로 부모의 생성자를 호출하게 되는데,
이 과정에서 AccessLevel 이 private인 경우에 비어있는 생성자 호출에 실패하므로 protected가 붙게 됩니다.
ex) Team <-> Member 가 1: n 관계이고 Lazy 전략을 사용할 때
Member를 조회시에 Team 객체는 가상의 프록시 객체로 조회하게 되는데, 이때 ProxyTeam extends Team 형태의 프록시 객체를 조회해 오게 됩니다.
ProxyTeam 객체가 Team 의 noArgsConstructor 즉 빈 생성자를 호출해야 하는데, 생성자가 private인 경우 자식은 부모의 생성자에 접근 할 수 없게 되어 오류 발생합니다.