작성
·
372
0
안녕하십니까 영한님
복습하면서 강사님 책을 보다가 임베디드 타입은 기본 생성자가 필수다 라는 말씀을 하셨습니다.
그래서 임베디드 클래스도 persistent class인가 생각해보았습니다.
제 생각에는 persistent class는 db 테이블에 객체를 저장하는 클래스? 라고 생각하고 있었습니다.
그래서 임베디드 타입도 persistent class라고 생각이 들었고(엔티티 클래스가 저장이 될 때 임베디드 타입도 결국 같이 저장되므로), 이 생각이 맞다면 persistent class의 조건인 기본 생성자가 있어야해서 임베디드 타입에 기본 생성자가 필수라고 말씀하신건가요?
그리고 JPA에 관한 공식 문서는 hibernate를 보면 되는건가요,,?? 해당 부분을 공식문서로 찾아보고 싶습니다..
답변 2
1
안녕하세요. gusdn85554님, 공식 서포터즈 David입니다.
.
먼저, 아래 글 답변과 블로그를 참고해주세요.
https://www.inflearn.com/questions/105043
https://1-7171771.tistory.com/123
임베디드 타입은 그냥 값 타입일 뿐입니다. (책 p321 참고)
값 타입은 엔티티와는 다릅니다.
JPA에서는 엔티티에 기본 생성자를 포함하라고 명시해두었습니다. (JPA 스펙문서 - The Entity Class 참고)
이유는 구현체에서 동적으로 객체를 생성하기 위해 리플렉션이라는 기술을 사용하기 때문입니다. 엔티티 뿐만 아니라 임베디드 타입도 객체로 생성되어야 하기 때문에 기본 생성자를 필요로 합니다.
JPA 스펙 문서는 위에 링크를 걸어드렸고 구현체에 대한 내용이 궁금하시다면 하이버네이트 문서를 참고하시면 됩니다.
.
감사합니다.
0
안녕하세요 David님 답변 감사드립니다.
제가 계속 생각해봤는데 어떤 말씀을 하시는지 이해는 됐습니다.
제가 생각한 점은 이러한 이유도 있다고 생각이 들어서 말씀드려봅니다.
맞는지 확인해보고 싶습니다!
https://newbedev.com/why-does-jpa-require-a-no-arg-constructor-for-domain-objects
Your local changes would be overwritten by merge. Commit, stash or revert them to proceed
JPA 공급자가 도메인 개체를 동적으로 인스턴스화해야 하는 경우가 많다. no-args constructor가 없으면 그렇게 할 수없다. - 어떤 인수가 되어야하는지 추측할 수 없다.
이 말은 처음에 엔티티를 생성할 때, JPA에서는 table을 생성할 때, 특정 필드에 어떤 값이 올 지 모르기 때문에 처음에 생성하기 위해서는 no-args constructor가 필요하기 때문이라 생각한다.
이렇게 생각이 드는데 혹시 맞을까요?
그리고 값 타입이 확실히 이해됐습니다.
처음 질문드릴 때, embedded가 어떻게 table에 저장되지?
List처럼 table에 저장이 안되지 않나라는 생각을 했었습니다.
복습을 하면서 db table에 다른 필드와 똑같이 저장되는 것을 보고 다시 한 번 느꼈습니다!!
테이블의 특정 필드와는 관계가 없습니다.
쉽게 말해 그냥 객체를 만들 때라고 생각하시면 됩니다.