본문 바로가기

자바 ORM 표준 JPA 프로그래밍

9장_값 타입

값 타입과 불변 객체

임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.

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