JPA 에서 사용하는 대표적인 두 가지 타입으로 엔티티 타입과 값 타입이 있다.
- 엔티티 타입
- @Entity 로 정의하는 객체
- 데이터가 변해도 식별자(identify) 로 지속해서 추적 가능
- 값 타입
- int, Long, String 처럼 단순히 값으로 사용하는 기본 타입 혹은 객체
- 식별자가 없으므로 변경시 추적 불가능
기본값 타입
기본 값 타입은 생명주기를 엔티티에 의존한다. 회원에 존재하는 String name 값은 회원[엔티티] 을 삭제해버리면 같이 삭제 된다.
또한 값 타입은 공유할 수 없다.
memberA 와 memberB의 String name 값은 공유되지 않아야 하기 때문이다.
임베디드 타입
- 새로운 값 타입을 직접 정의할 수 있다.
- JPA는 임베디드 타입이라고 한다.
- 주로 기본 값 타입을 모아 만들어 복합 값 타입이라고도 한다.
ex) Member 엔티티의 여러 속성(Column)들 중, 묶거나 응집해서 사용 가능한 컬럼들을 따로 값 타입을 지정하여 사용하면
그것이 임베디드 타입!
[Member] ---> [Member] , [Address]
@Embedded @Embedable
ID(PK) ID(PK) CITY
NAME NAME STREET
CITY ZIPCODE
STREET
ZIPCODE
- 장점 :
- 재사용성과 높은 응집도.
- 특정 임베디드 타입의 값 타입만을 사용하는 메소드를 만들 수 있다.
- 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존한다.
@Embedded : 값 타입을 사용하는 곳에 표시
@Embedable : 값 타입을 정의하는 곳에 사용
@AttributeOverride 를 통하여 임베디드 타입을 한 엔티티에서 여러가지로 재정의하여 사용 가능하다.
값 타입의 공유와 참조
임베디드 타입과 같은 값 타입을 여러 엔티티에서 공유하게 되면 위험할 수 있다. (side effect) 부작용이 발생할 수 있다.
ex) Member1 과 Member2 에서 같은 Address 값 타입을 공유하다가, Member1 의 Address 를 수정하게 되면
Member2 도 함께 수정된다.
객체 타입의 한계 : 자바에서 제공하는 기본 타입과 다르게 객체 타입은 참조를 전달하고 공유하기 때문에 이러한 문제가 발생한다.
따라서, 생성 시점 이후에 절대로 값을 변경 할 수 없는 불변 객체를 생성해야 한다.
[ 생성자로만 값을 설정하고, 그 후에는 수정이 불가하게 Setter를 생성하지 않는다. ]
'JPA with 김영한' 카테고리의 다른 글
JPQL (0) | 2021.09.27 |
---|---|
영속성 전이와 고아객체 (0) | 2021.09.13 |
즉시로딩 과 지연로딩 (0) | 2021.09.10 |
프록시(Proxy) (0) | 2021.09.09 |
상속관계의 매핑 (0) | 2021.09.08 |