no args constructor를 개발자에게 강제하는 이유
2133
작성한 질문수 2
안녕하세요. 영한님.
하이버네이트팀이 no args constructor를 개발자에게 강제하는 이유가 궁금합니다. entity 어노테이션이 있는 클래스를 annotation processor로 감지하여 생성자가 없는경우 만들어줬으면 막힘없이 컴파일이 되면서 모두가 행복하지 않을까란 생각이 계속듭니다.
왜 하이버네이트팀은 개발자에게 위 코드를 계속 강제하고 있을까요?
답변 3
0
안녕하세요. 최태훈님
과거 JPA 스펙을 처음 만드는 시점에는 지금처럼 프록시를 처리하는 기술들이 발달하지 않았습니다.
그래서 여러 구현체들이 이런 부분을 편리하게 구현할 수 있게 기본 생성자를 들어둔 것입니다.
감사합니다.
0
죄송하지만 질문의의도는 필요한것은 알겠는데
왜 개발자가 항상 그코드를 작성하게끔 강제하냐는 것이 질문입니다.
@entity를 스캔하여 어노테이션프로세싱으로 기본생성자가없는경우 생성자를 컴파일타임위빙했으면 개발자에게 강제하지 않아도 처리가 됬을거같아서요..
하이브네이트 팀에 대한 푸념(?)이기도 하거나와
아니면 그렇게 할 수 밖에없었던 사유가 궁금합니다.
0
옛날에 같은 궁금증을 가지고, 직접 찾아본 내용을 공유해드립니다😀
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 (기본생성자)가 필요한 이유에 대한 질문으로 이해하였습니다.
관련하여 아래 정리글을 참고해주세요.
실무 조언 관련 질문입니다.
0
40
1
H2데이터베이스 파일 생성
0
48
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
49
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
46
1
JPQL 메소드와 락
0
49
1
Delivery @OneToOne
0
55
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
85
2
UnsupportedOperationException 발생
0
81
3
H2 Database 연결이 안됩니다.
0
87
2
연관관계 매핑 질문드립니다.
0
79
2
h2데이터베이스 실행오류
0
103
2
persistence.xml
0
101
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
76
1
영속성 컨텍스트
0
61
1
JPA 프록시
0
87
1
Native Query와 MyBatis
0
62
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
81
1
임베디드 타입 예시 코드 관련 질문
0
110
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
89
3
인텔리제이 패키지 커서 단축키 질문
0
104
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
134
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
67
1
임베디드 타입과 MappedSuperClass의 차이점이 궁금합니다.
0
95
1
데이터베이스가 초기화되는 것 같아요
1
174
2





