회사에서 프로젝트를 시작하면서 엔티티를 구성할 때, Long타입과 long타입 중 어떤것을 id로 가지고 갈 것인지 논의가 있었다.
처음 내 생각은 어차피 DB에 저장될 때 auto increament를 설정한다면 애초에 null이 들어갈 일이 없으니 p타입(=프리미티브 타입)long을 사용하다가 null값이 들어올 가능성이 있는 데이터만 래퍼 클래스로 감싸면 효율적일 것 이라고 생각했다.
그런데, 나와 비슷한 생각을 한 어떤 수강생(?)의 글을 읽게 되었고 거기에 백기선님이 답글을 달아주신 것을 보고 생각을 바꾸었다.
Hivernate JPA 공식문서를 살펴보면 여기서도 Wrapper타입을 권장한다.
https://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#entity-pojo-identifier
이유를 살펴보자면,
데이터베이스 애플리케이션에서 자바 원시 타입과 래퍼 클래스의 사용
자바에서 데이터베이스 엔티티를 설계할 때, 개발자들은 원시 타입과 해당하는 래퍼 클래스 중에서 선택해야 하는 결정을 자주 마주친다. 이 선택은 애플리케이션의 데이터 무결성뿐만 아니라 기반 데이터베이스 시스템과의 호환성에도 영향을 미친다. 본문에서는 식별자(ID)용으로 Long을 long 대신 사용하는 것이 왜 유리한지, 특히 Java Persistence API(JPA)와 같은 객체 관계 매핑(ORM) 프레임워크를 사용할 때 그 이유를 탐색한다.
자바에서 원시 타입의 한계
자바에서 원시 타입인 long은 기본값이 미리 정의되어 있으며, long의 경우 이 기본값은 0이다. 이러한 특성은 한 가지 문제를 제기한다
자바에서 래퍼 클래스 사용의 장점
래퍼 클래스인 Long은 이 문제에 대한 해결책을 제공한다. 원시 타입과 달리 래퍼는 null 값을 가질 수 있어 값의 부재를 표현할 수 있다. 이 특성은 "값이 없음"을 나타내는 데 NULL을 사용하는 데이터베이스와 완벽하게 일치한다.
명확한 데이터 표현을 위한 Null 가능성
데이터베이스와의 호환성 향상
- 데이터베이스가 NULL 값을 가질 수 있는 컬럼에 자바의 Long을 매핑할 경우, null 값을 자연스럽게 처리할 수 있다.