[JAVA] 엔티티를 작성할 때 long이 아닌 Long으로 작성하는 이유?

박두팔이·2024년 4월 24일
0

자바 엔티티 설계에서 Long과 long 사용의 이해: 데이터베이스 호환성과 데이터 무결성 향상

🚨 Long vs long?

회사에서 프로젝트를 시작하면서 엔티티를 구성할 때, 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 필드가 0 값을 가질 경우, 그 값이 진정으로 0인지, 아니면 초기화되지 않아 기본값 0을 가지는지 알 수 없다. 이러한 모호성은 데이터 처리 시 혼란과 오류를 야기할 수 있으며, "값 없음(null)"과 "0"을 구분해야 하는 데이터베이스와 인터페이스할 때 특히 그렇다.

자바에서 래퍼 클래스 사용의 장점

래퍼 클래스인 Long은 이 문제에 대한 해결책을 제공한다. 원시 타입과 달리 래퍼는 null 값을 가질 수 있어 값의 부재를 표현할 수 있다. 이 특성은 "값이 없음"을 나타내는 데 NULL을 사용하는 데이터베이스와 완벽하게 일치한다.

  1. 명확한 데이터 표현을 위한 Null 가능성

    • Long을 사용함으로써, 필드가 값을 가지고 있지 않음을 명확하게 표현할 수 있다. 이는 특히 ORM을 통해 데이터베이스와의 상호 작용 시 중요하다.
  2. 데이터베이스와의 호환성 향상
    - 데이터베이스가 NULL 값을 가질 수 있는 컬럼에 자바의 Long을 매핑할 경우, null 값을 자연스럽게 처리할 수 있다.


    결론: 래퍼 클래스를 사용하자

profile
기억을 위한 기록 :>

0개의 댓글