[JPA] 값 타입과 불변객체

19·2022년 10월 18일
0

JPA

목록 보기
15/18

값 타입

기본값 타입은 공유되지 않기 때문에 안전하다.
하지만, 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험하다.
-> 부작용 발생 가능성이 있다.

  • 주소를 변경하면, 회원1, 회원2가 참조하는 주소가 같이 변경되버린다.

때문에 값을 복사해서 사용한다.

Address address = new Address("city", "street", "10000");

// 복사해서 사용
Address newAddress = new Address(address.getCity(), address.getStreet(), address.getZipcode());

항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용을 피할 수 있다.
하지만, 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입이다.
객체타입은 참조 값을 직접 대입하기 때문에 객체의 공유 참조로 인해 발생하는 부작용은 언제든지 발생 가능하다.

-> 객체 타입을 수정할 수 없게 만들면 된다.
수정할 수 없게 만들면 공유 참조로 인해 발생하는 부작용을 차단할 수 있다.

따라서, 값 타입은 불변 객체로 설계해야 한다.

  • 불변 객체 : 생성 시점 이후, 절대 값을 변경할 수 없는 객체
    • 생성자로 값을 설정하고 수정자(Setter)를 만들지 않으면 됨
    • EX) Integer, String등

데이터 수정 예시)

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()));
  • set을 사용해서 수정하면 안된다.
    • 값 타입은 불변이어야 하기 때문!
    • 아예 새로운 값으로 갈아 끼워야 한다



참고

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 김영한

profile
하나씩 차근차근

0개의 댓글