새소식

back/spring

JPA - 엔티티 기본 생성자

  • -

 

 

 

 

- Entity는 반드시 파라미터가 없는 생성자(기본 생성자)가 있어야 함 (public 또는 protected)

- 기본 생성자가 필요한 이유는 스프링 데이터 JPA 에서 엔티티에 동적으로 객체 생성시 JAVA Reflection API를 활용하기 때문

(JPA는 DB 값을 객체 필드에 주입할 때 기본 생성자로 객체를 생성한 후 Reflection API를 사용하여 값을 매핑

>>

기본 생성자가 없다면 Reflection은 해당 객체를 생성 할 수 없음)

 

 

- setter는 사용하지 말아야 함!!

>>

1.  Entity의 모든 필드에 public setter 메소드를 생성하면 객체의 값의 변경이 개방되어 있기에 일관성을 보장할 수 없음

 setter 메소드를 제공하는 것 보단 확실한 비즈니스가 드러나는 메소드를 제공하는 것이 더욱 바람직함

메소드 이름을 사용하면 좀 더 직관적으로 해당 메소드의 역할을 확인할 수 있게 됨

(그저 setter라는 이름으로는 역할이 무엇인지 한눈에 파악이 어려움)

 

2. 객체의 일관성 유지를 위해서 객체 생성 시점에 값들을 세팅함으로써 setter의 사용을 줄일 수 있음

(ex: 정적 팩토리 메서드, JAVA Reflection API, 프록시 객체)

 

정적 팩토리 메서드는 이름을 가질 수 있으며, 호출 될 때마다 인스턴스를 새로 생성하지 않아도 되고, 반환 타입의 하위 타입 객체를 반환할 수 있으며, 입력한 매개변수에 따라 다른 클래스의 객체를 반환할 수도 있고, 작성 시점에는 반환할 클래스가 존재하지 않아도 됨

- private 생성자를 작성하고 정적 팩토리 메서드에서 반환값으로 'new 생성자명(파라미터)'를 작성해 외부에서의 생성을 제한 

 

 

2-1. JAVA Reflection API

 

- 자바에서는 JVM이 실행되면 작성된 자바 코드가 static 영역에 저장

- Reflection API는 이 정보를 활용하여 구체적인 클래스 타입을 알지 못해도 클래스 이름을 통해 static 영역에서 그 클래스의 정보(메서드, 타입, 변수 등등)에 접근할 수 있게 함

- 단, Reflection API가 생성자의 인자 정보는 가져올 수 없음 >> 그래서 기본 생성자가 있어야 객체를 생성할 수 있고, 생성된 객체를 통해 Reflection API가 필드 값등을 넣을 수 있음

 

 

- JPA의 구현체인 hibernate에서 제공하는 다양한 기능을 활용하기 위해서는 public이나 protected 기본 생성자가 필요

(private로 생성자를 만들게 되면 이러한 기능들을 사용하는데 제약이 되기 때문, public보다 protected 추천)

 

- JPA가 매핑한 Entity를 조회할 때 hibernate가 생성한 proxy 객체를 사용하여 연관된 데이터를 실제 사용하는 시점에 조회할 수 있음

 

- proxy 객체는 직접 만든 객체 class를 상속하기 때문에 public 혹은 protected 기본 생성자가 필요

( private로 생성자를 만들게 되면 파생 클래스로부터의 상속 형태가 접근 불가가 되어버리기 때문에 제약이 생김, JpaSystemException  발생)

 

- JPA는 매핑한 Entity를 조회할 때 두 가지 전략을 사용

- 조회 시점에 함께 가져오는 EAGER와 매핑한 Entity를 사용할 때 조회하는 LAZY가 있음

- 지연로딩(LAZY)을 사용할 경우 임시로 hibernate가 생성한 proxy 객체를 생성하고 가리키게 됨

- proxy 객체는 직접 만든 class 를 상속하기 때문에 public, protected 기본 생성자를 필요로 하게 됨

( 만약 public, protected 생성자가 없다면 proxy 객체를 사용할 수 없게 되는 것 )

 

 

 

(참고글)

 

https://hyeonic.tistory.com/191

 

[JPA] 왜 JPA의 Entity는 기본 생성자를 가져야 하는가?

왜 JPA의 Entity는 기본 생성자를 가져야 하는가? 정확히 이야기하면 Entity는 반드시 파라미터가 없는 생성자가 있어야 하고, 이것은 public 또는 protected 이어야 한다. 이러한 궁금증을 가지게 된 이

hyeonic.tistory.com

 

https://velog.io/@yyy96/JPA-%EA%B8%B0%EB%B3%B8%EC%83%9D%EC%84%B1%EC%9E%90

 

JPA Entity 생성자에 관하여

JPA 에서 기본 생성자가 필요한 이유와 private 으로 선언하면 안되는 이유에 관하여

velog.io

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.