JPA의 데이터 타입 - 값 타입, 엔티티 타입(1)

2022. 3. 26. 20:05JPA 기초

jpa는 데이터 타입을 두가지로 분류한다.
1) 엔티티 타입
-@Entity로 정의하는 클래스 객체
-데이터가 변해도 식별자로 지속해서 추적이 가능하다. ex) 회원 엔티티의 키, 나이 값이 변경해도 식별자의 값으로 인식 가능하다.

2) 값 타입
- int, integer, string처럼 단순히 값으로 사용하는 자바 기본 타입이나 객체
- 식별자가 없고, 값만 있으므로 변경 시 당연히 추적 불가능하다. 
숫자 100을 200으로 변경하면 완전히 다른값으로 대체된다..

값 타입은 크게 세가지로 분류된다.


2-1) 기본값 타입: primitive type이라고 생각하면 쉽다. 자바가 기본적으로 제공하는 기본타입, 래퍼클래스, String등이 여기에 해당한다.

생명주기는 당연히 엔티티에 의존한다. 회원엔티티를 삭제하면 해당 회원의 이름, 나이 필드도 함께 삭제된다.

값 타입은 공유되면 안된다. 예를들어 a회원의 이름이나 나이가 변경되었을때 b회원의 이름이나 나이가 변경되면 큰일이다..(side effect가 발생하면 망한다.)

기본 타입(int, double)은 알고 있듯 절대 공유가 안된다. 기본 타입은 항상 값을 복사해 사용하기 때문이다.

Integer같은 래퍼 클래스나 String 등 특수한 클래스는 공유 가능한 객체이다(참조값을 넘기니까!). 하지만 이들은 변경이 불가능한 객체임을 잊지 말자.
예를 들어

Integer a = new Integer(10);
Integer b = a;


둘은 값을 공유하는 상태이다.
a = 20; 으로 값을 변경하는 것은
a = Integer.parseInt(20); 으로 새로운 Integer 객체가 생성되며 이 객체는 b와는 관계가 없는 객체이다. 

따라서 a의 값이 바뀌어도 b의 값은 그대로 10을 유지한다.

만약 a.setValue라는 가상의 메서드가 존재해 값을 바꾼다면 b 역시 값이 바뀔 것이다. 근데 이런 메서드 없다.

Integer는 불변객체니까~

 

2-2) 임베디드 타입(복합 값 타입)
2-3) 컬렉션 값 타입

다음 포스팅