개요

스프링 공부를 하면서 JPA를 사용했고 여기서 DB의 pk에 해당하는 자바의 자료형으로 Long혹은 Integer를 사용하곤 했다.
어느 곳을 보면 Integer를 사용하고 다른 곳에서는 Long을 사용했다.

개인적으로 long을 사용하지 않는 이유와 Integer를 사용하지 않는 이유가 궁금해서 정리해보려한다.

Integer VS Long

우선 엔티티의 id의 타입으로 Integer가 아니라 Long을 사용하는 이유가 뭘까?

엔티티에서 id라고 하면 PK값을 의미한다. PK는 기본키로 테이블 내에서 유일하게 식별이 가능해야한다. 그게 기본키의 정의이다.

그래서 id값을 정할 때 Auto_increment라는 전략을 사용하곤하는데 이는 테이블에 데이터가 생성될 때마다 하나씩 증가하는 정수를 사용하는 것이다. 예를 들어 첫 번째 등록된 튜플은 1이라는 아이디를 갖고 그 다음 등록된 튜플은 2라는 아이디를 갖는식이다. 이렇게 하면 중복될 가능성 없이 DB에 데이터를 넣고 삭제하고 관리할 수 있다.

자바의 Integer 자료형은 SQL의 int 타입과 매핑되고 int 타입은 최대 2,147,483,647까지 저장이 가능하다.
게시글이라고 하면 최대 21억건의 게시글 데이터를 저장할 수 있는 것이다.
SQL의 bigint 타입은 최대 9,223,372,036,854,775,807까지 저장이 가능하다 우리가 사용하는 단위로는 약 9경이 넘는 숫자다.
그렇다면 Integer만으로도 충분한 것 아닌가 싶은 생각이 들 수 있다.

데이터베이스에 이 만큼의 큰 데이터가 저장되어있는 일이 없을지라도 Auto_increment의 방식을 생각해보면 더 큰 자료형이 좋다. Auto_increment는 무조건 1씩 증가한다. 따라서 이전의 데이터가 삭제되더라도 그 값이 채워지지 않고 않고 새로운 데이터가 들어오면 무조건 이전의 id값에서 1이 증가되어 저장된다.
그러니 저장되어있어 남아있는 데이터와 상관없이 삽입 삭제가 빈번하게 일어난다면 Long 타입으로 설정하는 것이 유리할 것이다.

그래서 Long타입을 선언하는 편이 추후에 불편한 추가 작업을 하지 않을 수 있다는 장점이 있다.

long VS Long

자바에서 큰 정수를 담는 자료형은 long타입이고 자바에선 long타입을 두 가지 방법으로 사용할 수 있도록 제공하고있다.

long과 Long.
long은 원시 타입이라고 하고 Long은 참조 타입이라고 한다.

원시 타입은 실제 메모리에 데이터 값을 직접 저장하는 방식으로 long뿐만 아니라 int, boolean등, 소문자로 시작하는 자료형이 여기에 해당한다.

참조타입은 객체의 주소를 저장하는 타입으로 메모리 주소 값을 통해 객체를 참조하는 타입으로 Long, Integer, Boolean과 같이 대문자로 시작한다.

여러가지 차이점이 있지만 실제 사용하면서 느낄 수 있는 차이점은 원시 타입은 null이 올 수 없고 대신 참조 타입은 null이 올 수 있다는 점이다.

자바에서 엔티티의 id로 Long 타입을 사용하는 이유는 이렇다.

long(원시형)의 경우 null이 올 수 없지만 Long 타입의 경우 null이 올 수 있다.
영속성 컨텍스트의 작동 방식을 생각해보면 insert의 경우 먼저 데이터베이스에 삽입을 한뒤 나온 pk값을 객체에 할당한다. 그렇다면 자바의 객체는 이미 만들어진 후 pk값을 할당해주어야한다는 말인데 원시 타입은 값을 지정해주지 않으면 기본 값인 0이 들어간다. 그러나 데이터베이스에 삽입되기 전까지 이 필드는 값이 할당되지 않은 상태를 표현하는 것이 정확하다.

그렇기 때문에 null이 올 수 있는 참조 타입을 사용하는 것이다.