엔티티 클래스에서 테이블 PK 값에 해당하는 ID 변수만 기본형 타입(primitive type)이 아닌, Wrapper 클래스 타입으로 변수를 선언하였다.
왜?🤔
일반형인 long
으로 작성해도 큰 문제가 없어보였는데 굳이 wrapper 클래스 타입을 쓴 것이 의문스러웠다.
Wrapper 클래스부터 학습 해보자고🤓
Java는 완전한 객체지향 언어가 아니라는 이야기를 듣는다! 그 이유 중 하나가 바로 8개의 기본형(primitive type)을 객체로 다룰 수 없다는 점이 있다.
(객체로 다룰 수 없지만 높은 성능을 가진다)
그렇지만 우리는 기본형을 객체로 만들어 사용해야 할 때가 있는데, 이때 사용하는 것이 Wrapper 클래스이다.
: 8개의 기본형 타입(primitive type)에 해당하는 데이터를 객체로 포장해주는 클래스를 말한다. 메서드의 파라미터로 객체 타입을 요구할 때,(ex. Map<String, Integer>) 해당 클래스를 사용하여 객체로 변환해 사용할 수 있다.
기본형 | 래퍼 클래스 | 생성자 |
---|---|---|
boolean | Boolean | Boolean(boolean value) Boolean(String s) |
char | Character | Character(char value) |
byte | Byte | Byte(byte value) Byte(String s) |
short | Short | Short(short value) Short(String s) |
int | Integer | Integer(int value Integer(String s) |
long | Long | Long(long value) Long(String s) |
float | Float | Float(double value) Float(float value) Float(String s) |
double | Double | Double(double value) Double(String s) |
ID는 null을 허용해서는 안된다. 그런데도 왜? Wrapper 클래스를 쓰는거지?🤔
사실 기본형 타입을 사용하여도 큰 문제는 발생하지 않는다. PK로 지정된 변수에는 @Id
애터테이션이 추가되어 있고 해당 애너테이션은 기본키의 유형을 Wrapper 클래스 뿐만 아니라 기본형 타입(primitive type)도 허용하고 있기 때문이다.
그럼에도 Wrapper 클래스를 사용하는 이유는! null 값의 허용 여부이다.
hibernate 공식문서를 확인하면 null를 허용하는 유형의 타입으로 기본키를 선언하는 것을 권장하고 있다.
We recommend that you declare consistently-named identifier attributes on persistent classes and that you use a nullable (i.e., non-primitive) type.
식별자는 null를 허용하는(기본 타입이 아닌) 유형을 사용하는 것이 좋다.
기본키, 즉 식별자는 다양한 방법의 자동 생성 전략을 사용한다. 이때, null 값을 허용하지 않는다면 생성 직전에 NullpointerException
이 발생하게 된다. 하지만 null 값을 허용한다면 식별자 값에 아예 값이 없는 것이 아닌 null로 값이 채워져 있기 때문에 식별자가 아직 생성되어 있지 않다고 내부적으로 판단을 해 Exception을 발생시키지 않는다.
참고 자료
Java의 정석 기초편
TCP School
hibernate 공식문서
개인 학습 내용이기 때문에 잘못된 정보가 있을 수 있습니다.
잘못된 정보는 댓글로 알려주시면 바로 수정할 수 있도록 하겠습니다. 🙇