프로젝트 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의 경우 자바에서 제공하는 대표적인 불변 객체
자바에서 불변객체로 만드는 방법
- 모든 필드에 final 키워드를 추가한다.(생성자에서만 값을 할당할 수 있도록 한다.)
- 모든 setter 메소드를 제거한다.
- 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 |