인프런 커뮤니티 질문&답변

최태훈님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

영속성 컨텍스트 2

no args constructor를 개발자에게 강제하는 이유

작성

·

1.8K

1

안녕하세요. 영한님.

하이버네이트팀이 no args constructor를 개발자에게 강제하는 이유가 궁금합니다. entity 어노테이션이 있는 클래스를 annotation processor로 감지하여 생성자가 없는경우 만들어줬으면 막힘없이 컴파일이 되면서 모두가 행복하지 않을까란 생각이 계속듭니다.

왜 하이버네이트팀은 개발자에게 위 코드를 계속 강제하고 있을까요? 

답변 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 (기본생성자)가 필요한 이유에 대한 질문으로 이해하였습니다.

관련하여 아래 정리글을 참고해주세요.

Spring, JPA에 기본 생성자가 필요한 이유 (velog.io)

감사합니다.