본문 바로가기
Back-end/Spring Boot

Entity의 PK은 Wrapper Type? Primitive Type?

by whatamigonnabe 2023. 1. 29.

결론: Wrapper Type으로 해야한다.

이유: null을 표현해야하기 때문이다.

Wrapper와 Primitive의 대표적인 차이점은 1) Stack 메모리에 무엇이 저장되느냐 2) null을 표현할 수 있는가입니다.

 

Primitive type은 Stack 메모리에 할당된 실제 값이 저장됩니다. 그렇기 때문에 메서드에 인자로 primitive type을 넘겨주게 되면, 항상 실제 값이 복사되어 넘어가기 때문에 공유가 되지 않습니다. 반면 Wrapper type의 실제 값은 Heap 메모리 영역에 저장이되고, Stack에는 실제 값이 저장된 주소를 가리킵니다.. 따라서, 메서드에 인자로 넘겨주게되면 주소값을 넘겨주게 됨으로 공유가 됩니다.

 

두 번째 차이점은 Null 표현 여부이다. Primitive type은 원천적으로 null 값이 할당이 안되고, 초기화를 하게 되면 0 등의 기본 값이 할당된다. 따라서 nullpointer exception을 원천 차단할 수 있습니다. 반면 Wrapper는 null값을 할당할 수 없기 때문에, nullpointer가 발생할 수 있습니다.

 

이 Null 표현 때문에 Entity의 PK는 Long(Wrapper)로 표현해야합니다. 왜냐하면, 아직 값이 정해지지않은 null인 상태를 표현할 수 있어야하기 때문입니다. primative로 설정하게 되면 초기 값으로 0이 할당되는데, 이는 PK가 0인 것을 가리키는 것인지 아직 정해지지 않은 상태인지를 구분할 수 없기 때문입니다.

 

참조

https://www.geeksforgeeks.org/java-i-o-operation-wrapper-class-vs-primitive-class-variables/