작성
·
1.8K
답변 3
0
안녕하세요. 최태훈님
과거 JPA 스펙을 처음 만드는 시점에는 지금처럼 프록시를 처리하는 기술들이 발달하지 않았습니다.
그래서 여러 구현체들이 이런 부분을 편리하게 구현할 수 있게 기본 생성자를 들어둔 것입니다.
감사합니다.
0
죄송하지만 질문의의도는 필요한것은 알겠는데
왜 개발자가 항상 그코드를 작성하게끔 강제하냐는 것이 질문입니다.
@entity를 스캔하여 어노테이션프로세싱으로 기본생성자가없는경우 생성자를 컴파일타임위빙했으면 개발자에게 강제하지 않아도 처리가 됬을거같아서요..
하이브네이트 팀에 대한 푸념(?)이기도 하거나와
아니면 그렇게 할 수 밖에없었던 사유가 궁금합니다.
옛날에 같은 궁금증을 가지고, 직접 찾아본 내용을 공유해드립니다😀
1. 표준 스펙에 명시되어있습니다.
JPA 2.0 스펙 (37.1.1 Requirements for Entity Classes)과
하이버네이트 스펙에는 기본 생성자를 구현해라고 명시되어 있습니다.
2. 강제되긴 하지만, 사실 하이버네이트에서 기본생성자가 없더라도 JPA 구현체를 못만드는건 아닙니다.
- 물론 사용자가 기본생성자를 사용하는게 제일 쉽고 깔끔한 방법이긴 합니다.
3. 궁금하면 하이버네이트 구현체를 까보시면 되지만, 사실 이는 버전에 따라 구현방법이 조금씩 달라져서 큰 의미는 없을겁니다.
4. 그럼 '왜 강제했냐?'라고 물어본다면, 추측은 가능하겠지만 공식적인 명확한 이유는 없습니다.
- 사실 hibernate.interceptor 처럼 기본생성자 없이도 만들 수 있게 규칙을 정할 수 있었지만, 그들은 그러지 않았죠.
- 초창기 하이버네이트에는 이 기능이 없어서 그랬을 수 도 있습니다. 또는 버전간 호환성 때문에 유지할수도 있죠
- 아마 JPA 제작자가 무지한 Java 개발자들이 사용할 마법 같은 도구를 보여주기위해 그랬을 수도 있습니다. 이러는게 멋져보이니까요 (농담입니다.)
5. 참고로 어노테이션 프로세서, 컴파일타임 위빙은 좋은 해결책이 아닙니다.
- 어노테이션 프로세서는 기존 코드를 수정할 수 없습니다. (@lombok은 수정하지만, 이는 컴파일러 해킹입니다)
- 컴파일타임 위빙은 특별한 컴파일러가 설치 & 복잡한 설정이 필요로 합니다. 이는 유지보수와 버전호환성이 끔찍합니다.
- 로드타임 위빙(전용컴파일러 없이 JVM classLoader로 조작)은 객체를 읽어들일 때 위빙이 발생해서, 앱 성능을 하락시킬 수 있습니다.
참고하면 좋은 링크
https://stackoverflow.com/questions/2935826/why-does-hibernate-require-no-argument-constructor?fbclid=IwAR0sOCDbtTzmjs3sfJOSToJPoylWO0VUm5BrIPfTCBgsUfBPvq8Fe58DsaU
0
안녕하세요. 최태훈님, 공식 서포터즈 OMG입니다.
JPA에서 no args constructor (기본생성자)가 필요한 이유에 대한 질문으로 이해하였습니다.
관련하여 아래 정리글을 참고해주세요.
감사합니다.