본문 바로가기

2023년/ETC💁‍♂️

JPA entity 에서 id 를 int 아닌 Long 타입으로 하는 이유 ( + Wrapper 클래스 )

Entity 의 Id 값이 Long 타입이야..

처음 개발을 배웠을때는 이렇게 만드는구나 하고 클론코딩을 진행했는데 왜 Long 타입을 사용하는지 모르고 사용했다..

나는 숫자 범위가 넓기 때문에 사용되는 줄 알았는데, 또 다른 이유가 있었다.

 


숫자 범위가 넓다.

int 일 경우 21억 정도, Long 타입은 엄청나다. ( 전 인구를 합쳐도 부족해; )

[출처 : 참고 1] JAVA 자료형
전 세계 인구를 Long 에 넣어도 부족하다.


NULL 타입을 사용하기 위해서.

엥 무슨말이지? null 타입을 사용한다니

int, long 자료형 같은 경우 원시타입 이라서 null 값을 가지지 못한다. 하지만 Wrapper 클래스인 Integer, Long 타입은 null 값을 가질 수 있다. (Wrapper 클래스란?)

long 도 아닌 Long

null 값을 가져야 하는 이유는 무엇일까?

  • 원시타입을 가져도 괜찮은데, 하이버네이트(JPA 구현체)에서는 참조타입을 사용하게끔 권장함. (Wrapper 클래스 참고)
  • JPA 에서 save 간 entity 의 id 타입에 따라 판단한다고 함 (참고 2) 

 

그리고, id 값이 만약 int 형으로 0 이라면 id가 0인 것에 대한 엔티티를 다룰때 애매할 수 있겠다는 생각도 들었다.


Wrapper 클래스란?

자바의 자료형은 2가지인데 매번 보는것이다.

[출처 : 참고 1] 기본타입과 참조타입

DATA

기본타입 : 값을 저장!

참조타입 : 값을 가리키는 주소를 저장!

 

위치

기본타입 : Stack 영역

참조타입 : Heap 영역

User user = new User();

heap 영역 : User 객체 생성

stack 영역 : user 는 그 주소값을 참조

 

Wrapper 클래스도 마찬가지!

Integer a = new Integer(1);
Long b = new Long(1L);

stack 영역이 아닌 heap 영역에 해당 데이터를 가리키는 주소값이 저장됨.

  1. 즉, 래퍼클래스란, 기본타입 데이터를 객체로 다뤄야할 때, 참조타입으로 다루기 위해 객체로 감싸는 것!

 


 

참고자료

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EA%B8%B0%EB%B3%B8-%EC%9E%90%EB%A3%8C%ED%98%95-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC-int-double-char-String

 

☕ JAVA 데이터 타입 종류 총정리 (int / double / char / String / boolean)

정수 자료형 자바의 정수를 표현하기 위한 자료형은 대표적으로 int, long 이 있다. (byte, short 도 있지만 잘 사용하지 않는다.) 정수형 타입 할당되는 메모리의 크기 데이터의 표현 범위 byte 1바이트

inpa.tistory.com

https://ttl-blog.tistory.com/807#%EC%83%88%EB%A1%9C%EC%9A%B4%20%EC%97%94%ED%8B%B0%ED%8B%B0%EB%A5%BC%20%ED%8C%90%EB%8B%A8%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95-1

 

[JPA] save()시 식별자가 존재하는 경우 어떻게 동작할까? (feat. 코틀린에서 JPA 사용하기)

저는 지금까지 일반적으로 JPA를 사용하는 경우 @Id와 @GenerateValue, 그리고 Long 타입의 id를 사용하였습니다. 항상 id는 직접 할당하지 않았기에 save()시 id의 값은 항상 null이었습니다. 그러다 코틀린

ttl-blog.tistory.com

https://thalals.tistory.com/330

 

5. JAVA 기본 타입 vs 참조 타입 (with 래퍼클래스를 사용해야할 때) ➡️ Integer(Wrapper Class) 보다 int(

저는 래퍼클래스가, Null을 처리할 수 있기 때문에, 더 범용성이 좋고, 유용하다고 생각했습니다.. 하지만, 온보딩 과제를 진행할때, 매개변수를 사용할 때 래퍼클래스보단, 기본타입을 이용하는

thalals.tistory.com