[Spring] Entity 클래스의 id를 Long으로 해야하는 이유

 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을 사용하는 것이 적합하다.

 

  메모리 사용량 추가 비용
long 8 byte 없음
Long 24 byte 객체 헤더 및 참조값 관리 비용 포함