JPA Entity Class 에서 Primitive Type 을 써야할까 Wrapper Class 를 사용해야할까

Sorbet·2021년 11월 25일
2

Java 언어에서 Primitive Type VS Wrapper Class 차이

  • Primitive Type : 변수를 선언하면 Stack 저장공간에 데이터가 저장됨,
    • 변수명은 Stack 저장공간 이자 값 그 자체를 담고있음 (메타포 : 금괴를 손에 쥐고 있음)
  • Wrapper Class : 변수를 선언하면 Stack 저장공간 Heap 영역의 주소를 알고있는 레퍼런스 (포인터 비스무리한것)가 Stack 에 생김
    • 실제 데이터는 Heap 영역에 따로 저장해놓고 JVM & GC 의 관리를 받음
    • 변수명은 데이터를 담고있지 않음 오직 레퍼런스 뿐
    • 레퍼런스값은 바로 데이터가 존재하는 Heap 메모리공간의 주소임 (메타포 : 금괴의 위치가 표시된 지도만 있음)
  • 차이점
    • 메서드 호출시 : Primitive Type 은 값을 매번 복사하기 때문에 서로 영향을 주지 않지만, Wrapper Class 는 레퍼런스만 복사하기 때문에 서로 공유됨
    • 재귀함수(Recursive Method) 사용시 : Primitive Type은 StackFrame 에 데이터가 계속 생성되면서 서로 영향을 주고받지 않음
    • Immutable : Wrapper Classes 는 근본적으로 Immutable (변경 불가능한) 객체이고 Object 이므로 +1, ++ 같은 사칙연산이 안되는게 원칙이지만, 이걸 인식하지 않고 쓸수 있는 이유는 Java 에서 AutoBoxing/Unboxing 이 지원되고 Equals, HashCode를 재정의해놓았기 때문
    @Test
    public void test() {
        Integer i = 5;
        assertThat(i).isEqualTo(5); // i는 5이지만
        assertThat(System.identityHashCode(i)).isNotEqualTo(5); // 메모리 관점에서는 다르다
    }

Primitive Type 의 장점

  • 공유참조문제가 없다 (하지만 Wrapper Class 도 이뮤터블 객체이다 )
  • 성능이 조금이라도 더 좋다 (아니 좋을것같다)
  • nullPointException 발생이 원천봉쇄된다

Wrapper Class 사용의 장점

  • 멀티스레드에서 사용할 수 있다
  • nullPointException 이 발생할수는 있지만
    • null 임을 표시할수 있다. 숫자0이 의미를 갖는 경우도 분명히 있기때문
  • 하지만 명시적으로 vaildataion 을 사용할 수 있다
    • @NonNull, @NotNull.. 등등

결론

  • PK에는 Long(Wrapper Class) 을 사용한다

    • Wrapper Class 를 사용함으로써 Null을 대입해놓을 수 있는데, 명시적으로 PK가 아직 할당되지 않았음을 의미할수 있다. 반면 primivite type은 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을 원천봉쇄 하느냐 아니냐의 차이인데, 일부 필드에서 primitive Type 도 사용하고 있다.

    • 지금 코드에서는 PK 가 아닌 일부 필드에서 primitive Type을 사용하는 경우를 살펴보면
    • Item의 재고 수량 필드(stockCount)가 대표적인데, Null 이 필요한 경우도 없고, 따로 입력해 주지 않으면 기본값을 0으로 지정해도 문제가 없기 때문
  • original from : Link

profile
Sorbet is good...!

4개의 댓글

comment-user-thumbnail
2022년 8월 1일

와 정리 해주신 내용 잘봤습니다!! 감사합니다 👍

답글 달기
comment-user-thumbnail
2024년 4월 23일

Immutable : Wrapper Classes 는 근본적으로 Immutable (변경 불가능한) 객체이고 Object 이므로 +1, ++ 같은 사칙연산이 안되는게 원칙이지만, 이걸 인식하지 않고 쓸수 있는 이유는 Java 에서 AutoBoxing/Unboxing 이 지원되고 Equals, HashCode를 재정의해놓았기 때문

이 말의 의미가 잘 이해가 되지 않는데요. Wrapper Class가 근본적으로 immutable하다는 것은 혹시 어떤 의미일까요?

답글 달기
comment-user-thumbnail
2024년 4월 23일

Immutable : Wrapper Classes 는 근본적으로 Immutable (변경 불가능한) 객체이고 Object 이므로 +1, ++ 같은 사칙연산이 안되는게 원칙이지만, 이걸 인식하지 않고 쓸수 있는 이유는 Java 에서 AutoBoxing/Unboxing 이 지원되고 Equals, HashCode를 재정의해놓았기 때문

이 말의 의미가 잘 이해가 되지 않는데요. Wrapper Class가 근본적으로 immutable하다는 것은 혹시 어떤 의미일까요?

답글 달기
comment-user-thumbnail
2024년 4월 23일

Immutable : Wrapper Classes 는 근본적으로 Immutable (변경 불가능한) 객체이고 Object 이므로 +1, ++ 같은 사칙연산이 안되는게 원칙이지만, 이걸 인식하지 않고 쓸수 있는 이유는 Java 에서 AutoBoxing/Unboxing 이 지원되고 Equals, HashCode를 재정의해놓았기 때문

이 말의 의미가 잘 이해가 되지 않는데요. Wrapper Class가 근본적으로 immutable하다는 것은 혹시 어떤 의미일까요?

답글 달기