DEV-STUDY/Spring

[Spring] entity field에 wrapper class를 사용하는 이유

HwangJerry 2023. 7. 20. 11:43

많은 이들이 김영한님의 JPA 강의를 시작으로 스프링 첫걸음을 떼기 때문에, 자연스럽게 엔티티 모델링을 진행할 때 wrapper class를 사용하는 것이 익숙할 겁니다.

 

하지만 한번쯤은 고민해볼 필요가 있는 것이 wrapper class 사용의 이유 입니다.

 

왜 우리는 지금까지 wrapper class로 필드를 구성해온 것일까요?

 

Wrapper class

wrapper class는 자바가 기본적으로 제공하는 원시 타입의 자료형을 '객체'로서 사용하기 위해 고안된 클래스입니다. 여기서 우리가 주목해야 할 차이점은 wrapper class는 초기화하지 않으면 null이 되지만, 원시 타입은 0과 같이 기입된다는 점입니다. 즉, 원시 타입으로 엔티티 필드를 구성하면 null 가능성이 아예 차단되는데, wrapper class로 필드를 구성하면 nullalble하게 처리할 수 있습니다.

 

Primitive type field

원시 타입으로 필드를 구성할 수도 있습니다. 만약 id 값을 Long이 아닌 long으로 설정하게 되어도 전혀 문제될 게 없을까요?

우선 빌드나 실행은 원활하게 됩니다. 하지만 Hibernate의 공식 문서에서는 Wrapper class와 같이 nullalble한 non-primitive type 사용을 권장하고 있습니다.

 

Hibernate ORM 5.3.30.Final User Guide

Fetching, essentially, is the process of grabbing data from the database and making it available to the application. Tuning how an application does fetching is one of the biggest factors in determining how an application will perform. Fetching too much dat

docs.jboss.org

 

데이터는 정확해야 합니다. 만약 원시 타입을 사용하게 되면 null 가능성이 없기 때문에 실제로 데이터가 존재하지 않아도 0과 같은 데이터가 자동으로 기입됩니다. 하지만 없으면 없다고(null) 표기하는게 당연히 더 정확한 표기일 겁니다. 그리고 런타임에서 조회하는 데이터가 DB에 존재하지 않으면 NPE을 유발시키고, 이를 핸들링하는게 더 맞는 프로세스라고 생각합니다. 하이버네이트에서도 이러한 이유로 nullable한 타입을 사용하길 권장하는 거라고 생각합니다(뇌피셜). 하물며, null이여서는 안되는 필드가 있다면 애초부터 nullable=false를 이용하여 처리하면 되기 때문에 원시 타입을 사용할 이유가 없다고 생각합니다.