값 타입의 실제 인스턴스를 그대로 공유하는 것은 매우 위험하다.

 

객체를 넘기면 값 자체를 넘기는 것이 아니라 참조값을 넘기기 때문에 이런 식으로 객체를 공유하면 한 엔티티의 속성을 변경했는데 객체를 공유하던 다른 엔티티의 속성까지 함께 변해버리는 문제가 발생할 수 있다.

 

이렇게 두 엔티티가 하나의 값을 공유하도록 하는 것은 위험하다

 

만약 같은 값을 공유해야 하는 경우가 있다면 이러한 문제를 방지하기 위해 항상 값 타입의 실제 객체를 직접 공유하지 말고 값만 복사해서 사용해야 한다. 아래와 같은 모양처럼.

 

 

 

혹시라도 실수로 참조값을 공유하여 문제가 발생하는 것을 막기 위해서 항상 값 타입 객체는 불변 객체(immutable object)로 만들어야 한다.

 

뭐 대단한 건 아니고 그냥 setter를 만들지 않거나 private으로 만들어서 속성의 변경을 막아버리는 것이다.

 

그리고 만약 값을 공유하거나 혹은 일부 속성만 변경하고 싶은 경우에는 아래처럼 완전히 새로운 객체를 만들어서 갈아끼워넣는 방식이 바람직하다.

 

Address address = new Address("city", "street", "10000");
            
Member member = new Member();
member.setHomeAddress(address);
em.persist(member);
            
// city만 변경하고 싶더라도 객체 자체를 새로 갈아끼워넣는다
member.setHomeAddress(new Address("NewCity", address.getStreet(), address.getZipcode()));
            

 

+ Recent posts