Member 엔티티를 구현하다보니 의문점이 생겼다. 어느샌가부터 관습을 따르듯, 자연스레 id의 타입을 int가 아닌 Long으로 선언했기 때문이다. 왜 int를 사용하지 않는거지? 왜 long이 아닌 Long을 사용하는거지?
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "MEMBER_ID")
private Long id;
}
해당 의문은 아래와 같이 검색을 통해 해결할 수 있었다.
1. int가 아닌 이유
int가 아닌 long을 사용하는 이유는 더 많은 값을 저장할 수 있기 때문이다.
int
저장 공간 : 32 bit
값의 범위 : -2147483648 ~ 2147483647
long
저장 공간 : 64 bit
값의 범위 : -9223372036854775808 ~ 9223372036854775807
int와 long의 저장 공간
위처럼 int의 저장 공간은 32 비트, long의 저장 공간은 64 비트로 훨씬 더 많은 값을 저장할 수 있기 때문이다.
2. long 대신 Long을 사용하는 이유
그렇다면 long이 아닌 Long을 사용하는 이유는 무엇일까?
우선 long은 Primitive, 즉 원시 타입으로 값이 없을 경우 0으로 초기화 된다. 따라서 id에 할당된 값이 없어서 0으로 세팅된 것인지, 아니면 실제 값이 0인지 데이터만 보고 판별할 수 없다.
반면 Long은 Wrapper, 즉 포장 타입으로 값이 없을 경우 null로 초기화 된다. 따라서 값이 0이라면, id가 0으로 저장됨을 알 수 있다.
Primitive Type
Wrapper Type
boolean
Boolean
byte
Byte
char
Character
float
Float
int
Integer
long
Long
short
Short
double
Double
메모리 측면에서는 long이 더 낫지만, 앞서 살펴보았듯이 엔티티의 Id 필드에서는 Long을 사용하는 것이 적합하다.