값 타입과 불변 객체
임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.
member1.setHomeAddress(new Address("OldCity"));
Address address = member1.getHomeAddress();
address.setCity("NewCity");
member2.setHomeAddress(address);
우리는 회원2의 주소만 NewCity로 변경되길 기대했지만 회원1의 주소도 NewCity로 변경되어 버린다.
이렇게 값 타입의 실제 인스턴스 값을 공유하는 것은 위험하다. 대신에 값을 복사해서 사용해야 한다.
따라서 부작용 없이 안전하게 사용하기 위해서는, 값 타입은 불변하게 설정한다. 즉, 불변 객체로 설계해야 한다.
- 동일성 비교: 인스턴스의 참조 값을 비교, == 사용(주소 비교)
- 동등성 비교: 인스턴스의 값을 비교, equals() 사용(내용 비교)
엔티티 타입의 특징
- 식별자(@Id)가 있다.
- 엔티티 타입은 식별자가 있고 식별자로 구별할 수 있다.
- 생명 주기가 있다.
- 생성하고, 영속화하고, 소멸하는 생명 주기가 있다.
- em.persist(entity)로 영속화한다.
- em.remove(entity)로 제거한다.
- 공유할 수 있다.
- 참조 값을 공유할 수 있다. 이것을 공유 참조라 한다.
- 예를 들어 회원 엔티티가 있다면 다른 엔티티에서 얼마든지 회원 엔티티를 참조할 수 있다.
값 타입의 특징
- 식별자가 없다.
- 생명 주기를 엔티티에 의존한다.
- 스스로 생명주기를 가지지 않고 엔티티에 의존한다. 의존하는 엔티티를 제거하면 같이 제거된다.
- 공유하지 않는 것이 안전하다.
- 엔티티 타입과는 다르게 공유하지 않는 것이 안전하다. 대신에 값을 복사해서 사용해야 한다.
- 오직 하나의 주인만이 관리해야 한다.
- 불변 객체로 만드는 것이 안전하다.
'자바 ORM 표준 JPA 프로그래밍' 카테고리의 다른 글
8장_프록시와 연관관계 정리 (0) | 2022.01.11 |
---|---|
7장_고급 매핑 (0) | 2022.01.10 |
6장_다양한 연관관계 매핑 (0) | 2022.01.10 |
5장_연관관계 매핑 기초 (0) | 2022.01.10 |
4장_엔티티 매핑 (0) | 2022.01.06 |