프로젝트를 진행하면서 Entity에 모두 @Getter, @Setter를 부여했었다. 피드백으로 @Setter는 중요한 Entity에 사용했을 때, 부작용이 생길 수 있으니 주의하라는 피드백을 받았었는데 JPA를 공부하면서 한번 더 정리해보려 한다.
값타입은 단순하고 안전하게 다룰 수 있어야 한다.
Address address = new Address("city", "street", "10000")
Member member = new Member();
member.setUsername("member1");
member.setHomeAddress(address);
Member member2 = new Member();
member2.setUsername("member2");
member2.setHomeAddress(address);
member.getHomeAddress.setCity("newCity");
위와 같이 공유하는 값타입을 Setter로 변경할 경우 member1과 member2의 address가 모두 변하는 결과를 초래한다.
이 문제를 해결하는 방법은 @Setter를 사용하는 한 완전히 예방할 수가 없다. 그래서 값타입을 @Setter를 사용하지 않는 불변객체(immutable object)로 설계해야 한다. 또한, 불변객체는 값타입 컬렉션을 사용할 때에도 적용하는 것이 좋다.
Address address = new Address("city", "street", "10000")
Member member = new Member();
member.setUsername("member1");
member.setHomeAddress(address);
Address address2 = new Address("newCity", address.getStreet(), address.getZipcode());
Member member2 = new Member();
member2.setUsername("member2");
member2.setHomeAddress(address2);
member.setHomeAddress(Address);
불변객체로 Setter를 대신하려면 여러 방법이 있지만 객체를 새로 만들어서 넣어주는 방법이 유효하다.