object는 참조될 수 있다. 다시 말해, 이곳저곳에서 공유될 수 있다.
그런데, 참조되고 있는 object의 상태가 바뀐다면?
문제가 발생하는 경우: 그 object는 Value object
문제 없고 오히려 의도에 부합하는 경우: 그 object는 Entity
object a를 다른 object들이 참조하고 있을 때,
a의 상태를 변경하면 a를 참조하고 있는 모든 object들이 영향을 받는다.
예를 들어,
object a가 사람의 주소를 나타낸다고 해보자.
세 사람이 한 가족이라 a를 참조하게 했다.
그런데 한 사람이 이사가서 x의 값을 변경했다.
그랬더니 그대로 살고 있던 나머지 두 사람의 주소도 같이 바뀌어버렸다.
이렇게 문제가 발생한다면 먼저 복사해야 한다. object a를 복사해서 object a2와 a3를 만들어 각각 다른 가족들이 참조하도록 했어야 했다.
이런 식으로 다루게 되는 object를 Value object라고 한다.
참고로, 위 object들은 생성 이후에 변하지 않기 때문에 불변이라고 표현한다.
(안전성을 위해 불변을 활용한 또 다른 예로는 Primitive wrapper class가 있다.)
반면, object a가 모임 장소의 주소를 나타낸다고 해보자.
세 사람이 모이기로 해서 a를 참조하게 했다.
그런데 모임 장소가 바뀌어서 a의 값을 변경했다.
문제 없이 세 사람 모두의 모임 장소가 잘 변경되었다.
이렇게 공유되는 object를 Entity라고 한다.
개념은 그러한데, 실무적(JPA 기준)으로는 그대로 구현하기에 몇 가지 문제가 있다.