No default constructor for entity 'org.example.spartascheduleplus.entity.Schedule'
엔티티 클래스에 기본 생성자를 생성안했더니 에러가 발생했다..
@NoArgConstructor
가 없어도
다른 생성자가 있으면 자동으로 Jackson 라이브러리가 설정해줄텐데
위와 같이 꼭 기본생성자를 만들라고 한다.
JPA는 DB 값으로 엔티티 객체를 생성할 때 리플렉션(Reflection)이라는 기술을 사용한다.
❗️ 원래 객체를 생성하고, 필드에 값을 넣기 위해서는
- new 또는 setter 등이 필요하며,
접근 제어자에 따라 데이터를 넣지 못할 수도 있다.- 하지만 엔티티 모든 필드에 setter를 사용하는 것은
값 변경이 너무 쉬워지므로 지양해야 된다.
setter가 따로 없어도 필드에 값을 넣는다!
또한, protected 생성자에도 접근 할 수 있다.
❓ 나는 안써도 되던뎅?
하이버네이트가 도와준것임ㅋ
따라서 JPA에서 가이드한 것처럼 기본 생성자를 제발 넣자!
❓ 왜 기본 생성자는 private을 붙이면 안되나용?
- JPA가 엔티티에 지연로딩(lazy)으로 접근할 때,
하이버네이트가 프록시(가짜) 객체를 생성해서 사용하기 때문이라고 한다.- 프록시 객체는 실제 엔티티 객체를 상속받은 객체이기 때문에
상속하기 위해public
또는protected
이어야 한다.
정적 팩토리 메서드 패턴을 사용하는 곳도 있다고 한다..