Web/JPA

엔티티의 컬럼은 어떤 타입을 써야할까?

_sparrow 2023. 5. 30. 23:26
반응형

개요

@Entity
@Table(name = "USER")
public class User {
    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "user_name")
    private String name;
    
    @Column(name = "phone_number")
    private Integer phoneNumber;
}

엔티티를 작성하다가 문득 컬럼 타입을 원시형으로 쓰지않고 참조형으로 사용하는지 궁금증이 생겼다.

단순한 생각으로는 참조형으로 사용할때 Null이 허용된다는 점인데 각각의 특징을 간략하게 알아보고 타입 선택 전략에 대해 생각해보았다.

 

요약

불리언, 숫자형 자료형 대해서 어떤 타입을 쓸 것인지 고려하면 된다.

- Not null 이어야한다면 원시형 타입을 사용하자. 그게 아니라면 @Column 어노테이션에서 nullable 옵션을 활용하자.

- nullable이라면 참조형 타입을 사용하자.

그 외의 자료형에 대해서는 참조형 타입을 쓸 수 밖에 없다.

추가적으로 hibernate 문서에서는 참조형 타입을 쓰는 것을 권장한다.

 

 

원시형 타입 [ Primitive Type ]

- 원시형은 null 을 저장할 수 없다.

만약 null을 저장하려고 하면 컴파일 오류가 발생한다.

 

- 원시형은 값을 저장한다.

쓰레드 별로 할당받는 Stack 메모리에 직접 값을 저장한다.

그리고 이는 참조형(객체)보다 메모리를 조금 아낄 수 있고 메모리 소비를 최소화 할 수 있다.

 

- 원시형은 불변성을 가지고 있다.

한 번 생성된 값은 변경할 수 없다. 변수에 다른 값을 할당하면 새로운 값이 할당되고 이전의 값은 사리진다.

 

참조형 타입 [ Reference Type ]

- 참조형은 값으로 null을 가질 수 있다.

null은 아무런 객체를 참조하지 않는 상태를 나타내며, 참조형 변수가 null 값을 가지면 해당 변수는 어떠한 객체도 참조하지 않는 것을 의미한다.

 

- 참조형은 객체를 저장한다.

공통 Heap 메모리를 사용한다. 참조형은 데이터를 직접 저장하는 것이 아니라, 객체의 메모리 주소를 저장하여 해당 객체에 접근한다.

 

 

부가 정보

각 타입별 기본값

참조형 타입인 Long, Integer, Boolean의 기본값은 null이다.

하지만 원시형 타입인 long, Int의 기본값은 0이고, boolean은 false이다.

 

이를 바탕으로 원치않는 기본 값 초기화가 될 수 있으니, 값 자체를 진짜로 초기화 하지않았다라는 용도로 null을 사용할 수 있겠고 Not null 컬럼에 대해서는 원시형 타입을 사용하는 것이 좋겠다. 혹은 @Column 어노테이션의 nullable 옵션을 통해 null 허용 여부를 제어할 수 있다.

@Entity
@Table(name = "USER")
public class User {
   ...
	// null 금지 설정
    @Column(name = "phone_number", nullable = false)
    private Integer phoneNumber;
}

주의 해야할 점은 원시형 null 값에 대한 에러가 발생하니 null을 저장하지않도록 조심해야한다.

 

 

hibernate 문서에서는 nullable 타입(Reference Type)을 사용하라고 한다.

We recommend that you declare consistently-named identifier attributes on persistent classes and that you use a nullable (i.e., non-primitive) type.

 

결론

hibernate 문서대로 컬럼 타입을 참조형으로 해도 되고, null 허용되지않는 요소에 대해서는 원시형을 쓰거나 @Column nullable 옵션으로 제어를 하는게 좋다고 생각이 든다.

결론적으로 숫자형 자료형과 불리언 자료형에 대해서  어떤 타입을 사용할지 회사 규칙에 따라서 혹은 비즈니스 로직에 적합한 타입을 선택하면 될듯하다.

 

반응형