JPA

[JPA] 18. 값 타입 - 불변 객체

inuma 2021. 1. 21. 22:41
프로젝트 git url github.com/rtef23/JpaStudy
필요 1. docker
2. docker-compose
프로젝트 정보 mysql : 5.7 - docker image
java : 1.8

 

값 타입 공유 참조

  • 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.(Side Effect 발생)

Address address1 = new Address("city-1", "street-1", "zipcode-1");

//member1 생성
Member member1 = new Member();

member1.setName("member-1");
member1.setHomeAddress(address1);

entityManager.persist(member1);

//member2 생성
Member member2 = new Member();

member2.setName("member-2");
member2.setHomeAddress(address1);

entityManager.persist(member2);

//member1의 city 값을 변경하고 싶은 경우
member1.getHomeAddress().setCity("new-city");

entityTransaction.commit();

  • member1, member2의 city 값이 둘다 변경되는 것을 확인할 수 있다.
  • 모두 변경되는 것을 원하는 경우, Address는 엔티티로 변경하는 것(연관 관계)이 맞다.
  • 값 타입의 실제 인스턴스 값을 공유하는 것은 위험하다.
    • 필요한 경우, 값을 복사해서 사용하는 것이 맞다.
  • 객체 타입의 경우, 참조 값을 직접 대입하는 것을 컴파일 시점에서 막을 방법이 없다.
    • 객체의 공유 참조를 피할 수 있는 방법이 없다.
      • > 불변 객체의 필요성

 

불변 객체

  • ; 생성 시점 이후 절대 값을 변경할 수 없는 객체
  • 객체 타입을 수정할 수 없게 만들면 Side Effect를 원천 차단할 수 있다.
  • 값 타입은 불변 객체로 설계해야 한다.
  • 참고 : Integer, String의 경우 자바에서 제공하는 대표적인 불변 객체

 

자바에서 불변객체로 만드는 방법

  1. 모든 필드에 final 키워드를 추가한다.(생성자에서만 값을 할당할 수 있도록 한다.)
  2. 모든 setter 메소드를 제거한다.
  3. array 또는 Collection의 경우, getter에서 클론한 array 또는 Collection 객체를 반환하도록 한다.
    (Collection의 경우, Collections.unmodifiableXXX를 사용해도 좋다.)

 

값 타입의 비교

  • 인스턴스가 달라도 내부의 값이 같으면 같은 것으로 봐야 한다.
    (동일성은 맞지 않더라도 동등성은 맞아야 한다.)
Address address1 = new Address("city1", "street1", "zipcode1");
Address address2 = new Address("city1", "street1", "zipcode1");

//address1 == address2의 결과는 false이지만
//address1.equals(address2)의 결과는 true가 되어야 한다.
  • 동일성(identity) 비교
    • 인스턴스의 참조 값을 비교, == 사용
  • 동등성(equivalence) 비교
    • 인스턴스의 값을 비교, equals() 사용
  • 값 타입은 동등성 비교를 해야 한다.
  • 값 타입의 equals() 메소드를 적절하게 재정의 해야 한다.
    (주로 모든 필드에 사용)

2021/01/21 - [JAVA] - equals()를 재정의 하면 hashCode()도 재정의 해야 할까?

 

'JPA' 카테고리의 다른 글

[JPA] 20. JPA 쿼리 방법 소개  (0) 2021.01.25
[JPA] 19. 값 타입 컬렉션  (0) 2021.01.23
[JPA] 17. 값 타입  (0) 2021.01.21
[JPA] 16. 영속성 전이(CASCADE)  (0) 2021.01.18
[JPA] 15. 즉시 로딩과 지연 로딩  (0) 2021.01.18