Entity의 변수 타입 고민해보기🤨

YeJi Kim·2023년 5월 14일
0

SPRING

목록 보기
2/2

스프링을 복습하던 중, 갑자기 의문이 들었다.
Entity의 변수는 어떤 타입을 사용해야할까? primitive type? wrapper type?

primitive type vs wrapper type 👩‍🏫

  • 기본형(primitive type)
    • boolean, char, byte, short, int, long, float, double
    • 계산을 위한 실제 값이 스택(Stack)에 저장된다.

  • 참조형(wrapper type, reference type)
    • 객체의 주소를 저장한다. 주소값을 저장하는 공간인 힙(heap) 메모리에 저장된 주소를 스택에서 참조한다.
    • null 값을 가질 수 있다.



primitive type으로 선언할 때의 이점

  • 메서드를 호출할 때마다 primitive type은 값을 매번 복사하기 때문에 서로에게 영향을 주지 않는다. 따라서, 공유참조문제가 없다.
  • null을 체크할 필요가 없으며 NullPointerException이 발생하지 않는다.
  • 속도, 메모리 효율성 측면에서 primitive type이 더 좋다.



wrapper type으로 선언할 때의 이점

  • null과 0을 구분할 수 있다.
    - Hibernate 공식문서에 따르면 식별자(id)의 경우, wrapper type을 추천하고 있다.



결론

wrapper type과 primitive type을 혼용할 경우, Boxing 및 UnBoxing을 거치게 되면서 성능이 저하될 수 있다. 따라서, JPA Entity의 변수 타입을 하나로 통일하는 것이 좋다.
Hibernate 공식 문서의 추천대로 wrapper type을 사용하는 대신, NullPointerException이 발생하지 않도록 유효성 체크를 해야겠다!



[참고자료]
https://velog.io/@d-h-k/JPA-Entity-Class-%EC%97%90%EC%84%9C-Primitive-Type-%EC%9D%84-%EC%8D%A8%EC%95%BC%ED%95%A0%EA%B9%8C-Wrapper-Class-%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC%ED%95%A0%EA%B9%8C
https://velog.io/@chiyongs/JPA-Entity-Wrapper-class-or-Primitive-type
https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html

profile
이전의 기록들 👉 https://blog.naver.com/reviewerkyj

3개의 댓글

comment-user-thumbnail
2023년 5월 15일

저는 Response를 내려줄 때 반환되는 JSON 값에서 Boolean의 is가 생략되는 문제가 생겨 Vo를 생성할때 Reference Type을 사용해서 해결한 경험이 있는데, 실제로 Reference Type을 추천하는군요! 덕분에 다시한번 정리할 수 있었습니다 :)

답글 달기
comment-user-thumbnail
2023년 5월 15일

포스팅 잘 봤습니다! Entity 변수 타입 설정에 대한 고민을 해결할 수 있겠네요
NullPointerException에 대해서도 간략하게 정리하면 좋을 것 같아요!
예를들어, NPE는 객체에 값이 할당되지 않은 상태에서 호출될 경우 발생하는데 Wrapper 타입은 Primitive 타입을 객체로 포장한 형태이므로 NPE가 발생할 수 있다. 와 같은 개념을 추가해도 좋겠네요 😃

답글 달기
comment-user-thumbnail
2023년 5월 22일

잘봤어요! 실제 프로젝트 할 때에도 참조형을 사용했지만 Hibernate에서 Reference Type을 추천한다는 것을 이번에 알았습니다. 또한 Entity의 변수 타입을 혼용할 경우 성능 저하될 수 있다는 것을 명심해야겠군요. 도움되었습니다!

답글 달기