기본값 타입은 공유되지 않기 때문에 안전하다.
하지만, 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.
-> 부작용 발생 가능성이 있다.
때문에 값을 복사해서 사용한다.
Address address = new Address("city", "street", "10000");
// 복사해서 사용
Address newAddress = new Address(address.getCity(), address.getStreet(), address.getZipcode());
항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있다.
하지만, 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입이다.
객체타입은 참조 값을 직접 대입하기 때문에 객체의 공유 참조로 인해 발생하는 부작용은 언제든지 발생 가능하다.
-> 객체 타입을 수정할 수 없게 만들면 된다.
수정할 수 없게 만들면 공유 참조로 인해 발생하는 부작용을 차단할 수 있다.
따라서, 값 타입은 불변 객체
로 설계해야 한다.
데이터 수정
예시)
Member member = new Member();
member.setName("member1");
member.setHomeAddress(new Address("homeCity", "street", "10000"));
// homeCity -> newCity
// findMember.getHomeAddress().setCity("newCity"); X, 값 타입은 불변이어야 한다.
Address a = findMember.getHomeAddress();
findMember.setHomeAddress(new Address("newCity", a.getStreet(), a.getZipcode()));