JPA에서 데이터 타입의 분류는 엔티티 타입, 값 타입(기본값 타입, 임베디드 타입, 컬렉션 값 타입)으로 나타낼 수 있다.
01. JPA의 데이터 타입 분류
엔티티 타입
엔티티 타입이란 @Entity
로 정의하는 객체이다. 데이터가 변해도 식별자로 지속해서 추적이 가능하다.
예를 들어, 회원 엔티티의 키나 나이 값을 변경해도 식별자로 인식이 가능하다.
값 타입
값 타입이란 int, Integer, String 처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체이다. 식별자가 없고 값만 있으므로 변경 시 추적이 불가능하다.
예를 들어, 숫자 100을 200으로 변경하면 완전히 다른 값을 대체된다.
추적 가능하다는 말이 중요하다.
02. 값 타입 분류
기본값 타입
자바가 기본적으로 제공하는 것들이다.
자바 기본 타입(int, double), 래퍼 클래스(Integer, Long), String이 있다.
임베디드 타입(embedded type, 복합 값 타입), 컬렉션 값 타입(collection value type)
임베디드 타입과 컬렉션 값 타입은 JPA에서 정의해서 사용하는 것이다.
컬렉션 값 타입은 자바 컬렉션에 기본값 타입이나 임베디드 타입을 넣는 것을 말한다.
예를 들어, x,y 좌표를 묶어서 사용하고 싶다면 position이라는 클래스를 만들 수 있다. (커스텀이 가능하다는 뜻이다.)
03. 참고 : 자바의 기본 타입은 절대 공유되지 않는다.
기본 타입
기본 타입은 절대 공유되지 않는다. 따라서 값 타입으로 썼을 때 안전하다.
아래 코드의 결과로 a는 10이, b는 20이 나온다.
int a = 10;
int b = a; // a는 복사가 되어서 b로 넘어감
b = 20;
sout("a = " + a);
sout("b = " + b);
a와 b 변수는 저장 공간을 따로 갖고 있기 때문에 공유가 안된다.
side effect가 없다.
클래스
하지만 클래스는 레퍼런스를 끌고 가기 때문에 공유가 된다.
아래 코드의 결과로 a와 b 모두 10이 나온다.
Integer a = new Integer(10);
Integer b = a; // 레퍼런스가 넘어감
sout("a = " + a);
sout("b = " + b);
a.setValue(20);
a에 20을 넣고 출력하면 a와 b 모두 20으로 된다. 레퍼런스가 넘어가서 같은 인스턴스를 공유하기 때문이다.
'JPA' 카테고리의 다른 글
값 타입과 불변 객체 (2) | 2024.01.15 |
---|---|
임베디드 타입 (0) | 2024.01.15 |
영속성 전이(CASCADE)와 고아 객체 (0) | 2024.01.14 |
즉시 로딩과 지연 로딩 (2) | 2024.01.12 |
프록시 (0) | 2024.01.12 |