1. 값 타입 공유 참조와 불변객체
값 타입은 복잡한 객체 세상을 조금이라도 단순화하려고 만든 개념입니다. 따라서 값 타입은 단순하고 안전하게 다룰 수 있어합니다. 개발할 때는 값을 복사하는 것에 대해서 신경을 잘 쓰지 않습니다. 왜냐하면 자바세상에서 단순하고 안전하게 설계가 되있기 때문입니다.
임베디드 타입과 같은 값 타입은 여러 엔티티에서 공유할 수 있습니다. 하지만 임베디드 타입 같은 값 타입을 여러 엔티티에서 공유하면 위험합니다. 사이드 이펙트가 발생합니다. 회원1과 회원2과 같은 주소를 바라보고 있을 때 city값을 NewCity로 바꾸어 버리면 둘다 바뀝니다. 이런 버그는 정말 찾기 힘듭니다.
Address address = new Address("city', "street", "10000");
Member member = new Member();
member.setUsername("member1");
member.setHomeAddress(address);
em.persist(member);
Member member2 = new Member();
member2.setUsername("member2");
member2.setHomeAddress(address);
em.persist(member);
member.getHomeAddress().setCity("newCity");
위의 코드처럼 사용하면 안됩니다. 값을 복사해서 사용해야합니다.
Address address = new Address("city', "street", "10000");
Member member = new Member();
member.setUsername("member1");
member.setHomeAddress(address);
em.persist(member);
Address copyAddress = new Address(address.getCity(), address.getStreet(), address.getZipcode());
Member member2 = new Member();
member2.setUsername("member2");
member2.setHomeAddress(copyAddress);
em.persist(member2);
member.getHomeAddress().setCity("newCity");
값 타입을 복사해서 사용해야합니다. 그런데 복사해서 써야하는걸 그냥 넣는걸 컴파일레밸에서 잡을 방법이 없습니다. 문제는 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입입니다. 객체 타입은 참조값을 직접 대입하는 것을 막을 방법이 없습니다. 결론은 객체의 공유 참조는 피할 수 없습니다.
2. 객체 타입의 한계
- 항상 값을 복사해서 사용하면 공유 참조로 인해 발생하는 부작용 을 피할 수 있다.
- 문제는 임베디드 타입처럼 직접 정의한 값 타입은 자바의 기본 타입이 아니라 객체 타입이다.
- 자바 기본 타입에 값을 대입하면 값을 복사한다.
- 객체 타입은 참조 값을 직접 대입하는 것을 막을 방법이 없다.
- 객체의 공유 참조는 피할 수 없다.
'='(참조)를 전달하는걸 막을 방법이 없습니다. 그래서 객체타입을 수정할 수 없게 만들면 부작용을 원천 차단합니다.
그래서 값 타입은 불변 객체로 설계해야합니다. 생성자로만 값을 설정하고 수정자를 만들지 않으면 됩니다. 이런걸 불변 객체라고 합니다. 참고로 Integer나 String은 자바가 제공하는 대표적인 불변 객체입니다. 이처럼 값타입은 다 불변으로 만들도록 하세요! setter를 만들지 않고 객체의 생성자로 만들면 됩니다.
REFERENCE
https://www.inflearn.com/course/ORM-JPA-Basic
'JPA' 카테고리의 다른 글
[JPA] JPQL(Java Persistence Query Language) 문법(1) (0) | 2020.04.30 |
---|---|
[JPA] 값 타입 컬렉션 (0) | 2020.04.26 |
[JPA] 임베디드 타입(복합 값 타입) (0) | 2020.04.26 |
[JPA] 고아객체 (0) | 2020.04.22 |
[JPA] 영속성전이(CASCADE)와 고아 객체 (0) | 2020.04.22 |