JPA에서 엔티티를 선언할 때 private int nai와 private integer nai는 어떤 차이가 있나요?
JPA 엔티티 선언에서 private int nai와 private Integer nai는 중요한 차이점을 가지고 있습니다. 이 차이점은 주로 Java 기본형(primitive type)과 래퍼 클래스(wrapper class)의 차이에서 시작됩니다.
기본형 (primitive type) - int
- 초기값: 기본형 변수는 자동으로 기본값이 할당됩니다. int의 경우 초기값은 0입니다.
- 널 허용: 기본형 변수는 null 값을 가질 수 없습니다.
- 메모리: 기본형은 메모리 사용이 적고, 기본형 변수는 스택 메모리에 저장됩니다.
- 성능: 기본형이 더 빠릅니다. 오토박싱과 언박싱이 필요 없기 때문입니다.
래퍼 클래스 (wrapper class) - Integer
- 초기값: 래퍼 클래스 변수는 초기값이 null입니다. 초기화하지 않으면 null이 됩니다.
- 널 허용: 래퍼 클래스 변수는 null 값을 가질 수 있습니다.
- 메모리: 래퍼 클래스는 객체이기 때문에 힙 메모리에 저장됩니다. 더 많은 메모리를 사용합니다.
- 성능: 래퍼 클래스는 오토박싱과 언박싱이 필요하기 때문에 기본형보다 느립니다.
JPA 관점에서의 차이점
1) null 값 처리:
- int nai는 null 값을 가질 수 없습니다. 데이터베이스에서 이 필드가 null인 경우, int 타입으로는 이를 저장하거나 표현할 수 없습니다.
- Integer nai는 null 값을 가질 수 있습니다. 데이터베이스에서 이 필드가 null인 경우, JPA는 이를 Integer 타입으로 처리할 수 있습니다.
2) 데이터베이스 매핑:
- int nai는 기본형이므로 JPA는 이를 NOT NULL 제약 조건을 가진 컬럼으로 매핑합니다.
- Integer nai는 객체형이므로 JPA는 이를 NULL 값을 허용하는 컬럼으로 매핑할 수 있습니다.
다음은 사용 예입니다.
* 기본형 int 사용 예 -----------
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private int nai; // 나이 필드는 기본형 int로 선언
// getters and setters
}
* 래퍼 클래스 Integer 사용 예 -----------
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private Integer nai; // 나이 필드는 래퍼 클래스 Integer로 선언
// getters and setters
}
요약
- int는 null을 허용하지 않으며 초기값이 0입니다.
- Integer는 null을 허용하며 초기값이 null입니다.
그러므로 프로그래머 입장에서 JPA 엔티티에서 필드가 데이터베이스의 컬럼과 매핑될 때, 해당 필드가 null 값을 가질 수 있는지 여부에 따라 int 또는 Integer를 선택해야 합니다. null 값을 허용해야 한다면 Integer를 사용하고, 그렇지 않다면 int를 사용할 수 있습니다.