[JPA] 값 타입과 불변 객체

값 타입?

  • 엔티티의 상태를 표현하는 데 사용되는 데이터
  • 일반적으로 불변의 상태를 가짐
    • 부작용을 방지하고 보다 안전한 프로그래밍이 가능함
  • 보통 숫자, 날짜 , 복합 값을 포함

값 타입 공유 참조 문제

  • 임베디드 타입 등의 값 타입이 여러 엔티티 간에 공유되는 경우 문제가 발생함
  • 예시
    • 두 개의 회원 엔티티가 동일한 주소의 인스턴스를 참조하는 경우
    • 한 회원의 주소가 변경되면 참조를 공유하는 다른 회원의 주소도 영향
  • 문제 예시
member1.setHomeAddress(new Address("OldCity"));
Address address = member1.getHomeAddress();
address.setCity("NewCity"); // 회원1의 주소 값을 공유해서 사용
member2.setHomeAddress(address);
  • 문제의 해결
    • 값 타입을 공유하면 X
    • 대신 복사를 해서 사용해야합니다.
      • 복사는 당연 깊은 복사입니다. -⇒ 새로운 인스턴스를 생성해야함
  • 불변 객체로 만드는 방법
    • 생성자에서만 상태를 설정해야함
    • setter 메서드 제공 X
    • 필요하다면 값을 변경하는 메서드를 제공해야함
      • 기존 인스턴스를 반환하는게 아니라
      • 새로운 인스턴스를 반환해야함!
// Address 클래스가 불변 객체라고 가정할 때
member1.setHomeAddress(new Address("OldCity"));
Address newAddress = member1.getHomeAddress().withCity("NewCity");
member2.setHomeAddress(newAddress); // 새로운 인스턴스를 할당


Uploaded by N2T

'자바 > JPA' 카테고리의 다른 글

[JPA] 서브 쿼리 ( Subqueries )  (0) 2023.11.10
[JPA] 조건식  (0) 2023.11.10
[JPA] 값 타입 컬렉션  (0) 2023.11.09
[JPA] 값 타입 컬렉션 개요  (0) 2023.11.09
[JPA] 값 타입 컬렉션 제약사항과 대안적 접근 방법  (0) 2023.11.09