[SPRING] Entity 클래스 기본생성자는 왜 필수죠?

wannabeing·2025년 4월 2일
4

SPRING

목록 보기
4/12
post-thumbnail
No default constructor for entity 'org.example.spartascheduleplus.entity.Schedule'

엔티티 클래스에 기본 생성자를 생성안했더니 에러가 발생했다..

다른 생성자 있으면 되는거 아니야? 🙄

@NoArgConstructor가 없어도
다른 생성자가 있으면 자동으로 Jackson 라이브러리가 설정해줄텐데
위와 같이 꼭 기본생성자를 만들라고 한다.


JPA가 리플렉션을 써서 그렇다! 👀

JPA는 DB 값으로 엔티티 객체를 생성할 때 리플렉션(Reflection)이라는 기술을 사용한다.

💡 리플렉션(Reflection)이란?

  • 구체적인 클래스 타입을 알지 못하더라도 클래스 이름을 통해
    메서드, 타입, 변수 등에 접근할 수 있도록 해주는 API이다.
  • 리플렉션은 런타임 시점에 동적으로 클래스 객체를 생성한다.
  • Jackson 라이브러리도 값을 주입할 때, 리플렉션을 사용한다.

❗️ 원래 객체를 생성하고, 필드에 값을 넣기 위해서는

  • new 또는 setter 등이 필요하며,
    접근 제어자에 따라 데이터를 넣지 못할 수도 있다.
  • 하지만 엔티티 모든 필드에 setter를 사용하는 것은
    값 변경이 너무 쉬워지므로 지양해야 된다.

💡 리플렉션은 기본 생성자를 통해 객체를 생성한다.

setter가 따로 없어도 필드에 값을 넣는다!
또한, protected 생성자에도 접근 할 수 있다.


✅ 그래서 엔티티에는 기본 생성자가 필수다!

❓ 나는 안써도 되던뎅?

하이버네이트가 도와준것임ㅋ
따라서 JPA에서 가이드한 것처럼 기본 생성자를 제발 넣자!

❓ 왜 기본 생성자는 private을 붙이면 안되나용?

  • JPA가 엔티티에 지연로딩(lazy)으로 접근할 때,
    하이버네이트가 프록시(가짜) 객체를 생성해서 사용하기 때문이라고 한다.
  • 프록시 객체는 실제 엔티티 객체를 상속받은 객체이기 때문에
    상속하기 위해 public 또는 protected 이어야 한다.

정적 팩토리 메서드 패턴을 사용하는 곳도 있다고 한다..


출처

profile
wannabe---ing

0개의 댓글