vo와 entity에 대해서 정말 많이 헷갈려 했다. 그래서 이번에 정리를 하려고 한다.
처음 vo 에 대해 접하고 이를 코드에 적용하려 했을 때는 막연하게 ‘vo로 객체를 만드는 것은 절대적으로 좋은 거다’ 그리고 ‘vo로 객체를 만드려면 불변 객체로 만들고 equals와 hashCode를 재정의를 해주면 된다.’ 라고 생각했다.
이렇게 개념을 이해하려 하지 않고 외운 내용(내 마음대로 vo라고 생각한 개념)을 코드에 적용해 왔다.
그러다 보니 후에 엔티티라는 개념을 접했을 때, 정말 혼동을 많이 했다.
가변적인 것은 모두 엔티티고, 그렇지 않으면 모두 vo 객체인가? 라는 생각 부터 시작해서,
vo는 불변이기 때문에 좋은 거고 엔티티는 가변 객체라 나쁜건가? 라는 생각도 하였다.
또한 현실 세계에서 객체 지향 세계로 옮긴 특정 클래스가 엔티티로써 쓰여야하는지 vo로써 쓰여야하는지 명확하게 구분을 하지 못했다.
코드에 내가 안다고 생각한 잘 모르는 개념을 적용하려다 보니, 혼동이 너무 많았다. 따라서 이번에 확실하게 이 개념을 잡고 싶어 정리를 해두려고 한다.
우선 vo 와 entity의 개념에 대해 알아보기 전에 짚고 넘어가야 할 개념이 있다.
바로 identifier equality
와 structural equality
이다.
내용물
과 포장 방식
을 갖고 있다고 생각해보자.콜라
이고 캔
으로 포장된 음료수 A와같은 내용물인 콜라
를 가지고 있고, 캔
으로 되어 있는 음료수 객체 B는 같은 음료수라고 생각 할 수 있다.이렇게 객체를 나누는 두가지 관점에 대해 알아 보았다.
그렇다면 이제 vo와 entity에 대해 알아보자!
vo(Value Object)는 값으로서 쓰일 수 있는 객체이다. vo는 해당 객체의 주소 값이 달라도 값
(Structural Equality,구조적 동등성)이 같으면 동일하다고 생각 할 수 있다.
만약 고유 번호(프로그래밍 세계에선 저장 된 메모리 주소)가 서로 다른 50000원 짜리 지폐 2장이 있는 경우, 이 두장의 고유 번호는 서로 다르지만 50000원 이라는 값
은 동일 하다.
vo는 값 자체의 비교를 위해서 equals() 와 hashCode()를 재정의 해줘야 한다
Entitiy는 Id로 구분 된다(Identifier Equality). 따라서 고유한 식별자
가 존재한다. 또한 대부분 가변적이며, 수명
이 존재한다.
→ 엔티티 고유의 라이프 사이클이 존재한다!
만약 이름이 홍길동이고 계급이 상병인 군인이 있다. 어느날 후임이 었던 동명이인의 일병 홍길동이 진급을 해서 상병 홍길동이 되었다. 이때 이둘은 이름과 계급 모두 같다. 그렇다면 이 두명은 같은 군인인가?
아니다.
군번이라는 Id를 통해서 이 두명이 서로 다른 군인이라는 것을 구별 할 수 있다.
따라서 Entity는 Identifier Equality 으로 객체를 비교한다.
→ 그렇기 때문에, 식별자를 기준으로 equals() 와 hashCode()를 재정의 해줘야한다.
수명
이 있다.독립적
으로 존재 할 수 없다.값
객체이다. 따라서 값을 변경 할 때에는 새로운 값 객체로 갈아 끼워주면 된다.상태의 순간
(값)이라는 것을 의미한다.