값 타입3(값 타입과 불변 객체)

Mina Park·2022년 9월 12일
0

1. 값 타입 공유 참조

  • 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험(부작용 발생)
    • 참조값을 공유하기 때문에 변경된 값이 여러 엔티티에 전부 반영

2. 값 타입 복사

  • 값 타입의 실제 인스턴스인 값을 공유하는 것은 위험
  • 따라서, 값(인스턴스)를 복사해서 사용

3. 객체 타입의 한계

  • 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용 피할 수 있음
  • 하지만, 객체 타입의 경우 참조값을 직접 대입하는 걸 막을 방법이 없음

4. 불변 객체

  • 객체 타입의 공유 참조를 막을 수 없음 => 애초에 객체 타입의 수정을 막음
  • 불변 객체(immutable object)로 설계!!!
    • 생성 시점 이후 절대 값을 변경할 수 없는 객체
    • 생성자로만 값을 설정하고 수정자(Setter)를 만들지 않거나 수정자(Setter)를 private으로 설정
      • 컴파일러단에서 에러가 발생하도록 할 수 있음
			Address address = new Address("Seoul", "star-ro","1000");

            MemberMapping member = new MemberMapping();
            member.setUsername("member1");
            member.setHomeAddress(address);
            em.persist(member);


            //값만 복사하여 새로 생성
            Address copyAddress = new Address(address.getCity(), address.getStreet(), address.getZipcode());
            MemberMapping member2 = new MemberMapping();
            member2.setUsername("member2");
            member2.setHomeAddress(copyAddress);
            em.persist(member2);

//            member.getHomeAddress().setCity("newCity");
            //불변객체로 만들었으므로 setter 사용 불가
            //만약 변경하고 싶다면? 새로 생성하여 세팅
            Address newAddress = new Address("new city", address.getStreet(), address.getZipcode());
            member.setHomeAddress(newAddress);

            tx.commit();

0개의 댓글