[JPA] Entity Field Wrapper class or Primitive type

chiyongs·2023년 4월 8일
3
post-thumbnail

JPA의 Entity Field에 Wrapper class를 사용해야만 할까?

JPA를 사용하는 것을 계획하고 계시다면 한번쯤 고민이 되실만한 문제입니다.

그동안 JPA를 공부해오면서 Entity의 필드들에 거의 당연하게 Wrapper class를 사용해왔습니다.
하지만, 왜 Wrapper class를 사용하는지에 대한 이유는 모른 채 그저 사용하였죠.

Wrapper class

Wrapper class는 Primitive type을 객체로 다루기 위해서 사용하는 클래스입니다.
따라서, null이 들어갈 수 있습니다.
ex) Integer, Long, Boolean...

개발을 하다보면 null에 대해 항상 경각심을 가지고 코드를 작성하게 됩니다.
JPA Entity의 필드를 Wrapper class로 사용하면 해당 필드들에서 발생할 null들도 고려해야 합니다.

Primitive type을 사용하는 것이 null을 원천 차단하기 때문에 Wrapper class보다 null로부터 비교적 안전해질 수 있죠.

그렇다면, 왜 많은 책이나 강의들에서는 Wrapper class를 자연스럽게 사용하고 있는지, JPA Entity 필드에 Primitive type을 사용할 수 있을지 궁금했습니다.

Entity의 Id값에 주로 Long을 선언하여 사용하는데요.

Primitive type을 사용해보자

Id값에 Primitive type을 사용해보겠습니다.

위와 같이 primivite type인 long으로 Id값을 선언했습니다.
이제 테스트를 진행해보겠습니다.

테스트 결과는 통과입니다!

Id값에 primitive type을 사용해도 오류가 발생하지 않았습니다.
따라서, 왜 Wrapper class를 많이 사용하는 지에 대한 호기심이 생겼습니다.

Why Wrapper class?

JPA의 구현체인 Hibernate의 공식문서를 살펴보면,

null이 들어갈 수 있는 non-primitive type을 사용할 것을 권장하고 있습니다.
그 이유로는 우리가 대부분 사용하는 int, long Primitive type의 기본 값은 0입니다.
만약, 매핑된 값이 0일 때 실제 데이터가 정말로 존재하는지 여부를 알기 어렵기 때문입니다.
따라서, 데이터가 존재하지 않는다면 null을 사용하여 표현해 구분하는 것이 Hibernate의 방식입니다.

Id값이 아닌 다른 필드들에도 Wrapper class가 아닌 Primitive type을 사용할 수 있습니다.
하지만, Id값이 아닌 다른 필드들에는 Hibernate가 어떤 방식을 추천하는지는 찾을 수 없었습니다.

그래서 Wrapper class? Primitive type?

Id값은 Hibernate의 공식문서대로 Wrapper class를 사용하는 것이 좋은 것 같습니다.
Hibernate가 염려하는 실제 데이터의 존재 여부에 대해 파악할 수 있는 방법이기 때문입니다.

Entity 내 다른 필드들은 JPA를 사용하는 개발자의 의사결정이 중요한 것 같습니다.
개인적으로 Primitive type을 사용할 수 있다면 사용하는 것이 좋다고 생각합니다.
Wrapper class를 사용하게 되면 null 데이터의 존재로 의도하지 않은 실수가 발생하여 장애로 이어질 수 있기 때문입니다.

하지만, 실제 서비스를 하다보면 데이터베이스에 값이 존재하지 않는 경우도 존재합니다.
일부러 null이 들어가있는 컬럼들처럼요.

이런 경우는 Primitive type을 사용할 수 없습니다.
Wrapper class를 사용해야 합니다.
따라서, JPA를 사용하신다면 팀 내 의사결정을 통해 하나의 방식으로 통일성을 맞춰 사용하면 될 것 같습니다.

이번 호기심을 해결하면서 Hibernate의 공식문서를 통해 왜 Id값에 Wrapper class를 추천하는지 알게 되었고 이유를 제대로 알지 않고 사용해왔던 Entity 내 Wrapper class 사용에 대해 한번 더 뒤돌아볼 수 있는 기회였습니다.
짧은 글 읽어주셔서 감사합니다.

0개의 댓글