스프링/개념

엔티티(Entity) - 왜 기본 생성자가 필요할까?

문상휘파람 2024. 9. 10. 14:06

Entity - 기본 생성자 필요한 이유

  • 기본 생성자가 존재하지 않는다면 DB에서 조회해 온 값을 엔티티로 만들 때 객체 생성 자체가 실패합니다. -> 이유 : JPA가 엔티티를 인스턴스화할 때 리플렉션(Reflection)을 사용하기 때문입니다.

리플랙션이란? - 자바 프로그래밍 언어에서 런타임에 클래스, 인터페이스, 메서드, 필드 등의 구조를 검사하고 조작할 수 있는 기능을 의미합니다.

그래서 위와 같은 이유로 기본 생성자가 필요한데... 접근 제어자는 어떤 것을 써야 할까요?

기본 생성자의 접근 제어자는 어떤 것을 써야 할까?

  1. private 사용했을 경우 : 리플랙션 사용할 때 접근 자체가 불가능합니다. -> JPA는 프록시 기술을 사용하는데 거기서 프록시 기술을 쓸 때, jpa hibernate가 객체를 강제로 만들어야하는데 private 로 만들어보리면 막혀버립니다.
  2. public 사용했을 경우 :
    • public을 사용하면 setter 사용 가능 -> 객체의 일관성을 보장할 수 없습니다.
    • 모든 클래스가 User 엔티티를 자유롭게 인스턴스화할 수 있게 됩니다. -> 캡슐화를 위반합니다

결론

protected 를 사용하는 것이 객체의 일관성과 캡슐화 관점에서 보았을 때 안전합니다.

  • lombok 의 @NoArgsConstructor(access = AccessLevel.PROTECTED)를 엔티티 클래스 위에 선언함으로 간단하게 생성자를 사용 가능합니다!

 


이런 것을 보면, 스프링이 정말 흥미로운 것 같습니다. 정말 하나의 기능을 사용하더라도 알고 사용하여야 하고, 여러 가지 개념으로 이어지는 것이 복잡하면서도 재밌습니다 ㅋㅋㅋ 어렵지만 모두 화이팅 하셨으면 좋겠습니다 !!