Value Object는 도메인 주도 설계(Domain-Driven-Design,DDD)의 핵심 개념 중 하나로,어플리케이션에서 값을 표현하는 데 사용되는 불변 객체이다.
이 개념은 단순한 값을 구조화 하여 오류 가능성을 줄이고,코드의 명확성을 높이는 방법을 제공한다.
Value Object는 각 값에 특정 타입을 명시함으로써 잘못된 값이 할당되는 것을 방지하고 데이터의 속성이 같다면 동일한 것으로 간주되는 '동등성(equality)'에 의해 정의된다.
이러한 Value Object는 비즈니스 로직에서 사용되는 데이터를 캡슐화하고,필요한 검증 로직을 포함할 수 있어 더 안전하고 효율적인 코드 작성을 가능하게 한다.
Value Object를 사용하는 주된 목적은 비즈니스 로직의 복잡성을 줄이고 코드의 의미를 명확하게 하는것 이다.
Value Object 를 사용하면 데이터의 유효성 검증,데이터의 일관성 유지 등을 보다 쉽게 관리 할 수 있다.
Reference equality (참조 동등성)
만약 2개의 객체가 메모리에 같은 주소를 참조하면 동등하다는 의미이다.
Identifier equality (식별자 동등성)
식별자 동등성은 id 필드를 가진 클래스들이 같은 참조자를 가진다면 동등하다는 의미이다.
Structural equality (구조 동등성)
구조 동등성은 모든 멤버 변수가 같다면 동등하다는 의미이다.
Entity와 Value Object의 가장 큰 차이점은 객체들을 비교하는 방식이다.
Entity는 Identifier equality(식별자 동등성)이고 Value Object는 Structural(구조 동등성)이다.
즉,Entity는 고유한 식별자가 있지만 Value Object는 없다.
Entity는 변화 가능하며 지속적인 생명주기를 가진다.
이들은 시간에 따라 상태가 변경될 수 있으며 이력을 통해 그 변화를 추적할 수 있다.
Entity는 고유한 식별자를 가지고 있어 시간이 지나도 동일한 객체로 인식된다.
반면에 Value Object는 불변 객체로서 한번 생성되면 그 상태가 변경되지 않는다.
상태 변경이 필요한 경우 새로운 Value Object가 생성된다.
예를 들어,돈이라는 개념은 '얼마'라는 값으로 독립적으로 의미를 가질 수 있으나 '철수가 가진 돈'이라고 특정 Entity와 연관지어 사용될 때 더 구체적인 문맥과 의미를 갖게 된다.
그러나 이것은 Value Object가 특정 Entity에 속해야만 하는 것을 의미하지 않는다.
Value Object는 Entity와 연관되어 사용될 수도 있고 독립적으로 사용될 수 있으며 이 경우에도 자체적인 의미와 역할을 가진다.
Value Object는 불변성이다. 불변성은 변하기 않는다는 뜻인데 즉, 어떤 객체의 특정 값을 바꿔야 한다면 값만 변경하는 것이 아니라 아예 새로운 객체를 만든다.
Entity는 특정 값을 수정할 수 있는 가변성이다.
만약 Value Object가 가변성이라면 특정 값을 바꿀 수 있게 되고 고유한 식별성이 생기고 생명주기를 가져버린다.
이는 DDD의 개념과 모순된다.
Value Object는 특정 상태의 순간을 저장하는 스냅샷 그 자체이다.
절대 변경이 되어서는 안 되며 불변성을 지키지 않는가면 Value Object라고 할 수 없다.
도메인 모델은 프로젝트 성격에 따라서 Entity가 될 수도 Value Object가 될 수도 있다.
모든 상황에서 동일한 기준으로 Entity와 Value Object를 나눌 수 없다.
통상적으로 '돈'은 Value Object 로서 동등성을 가지고 교환 가능한 것으로 생각하지만, 현금 흐름을 추적하는 소프트웨어를 만든다면 모든 청구서를 고유한 값으로 봐야한다.
이 경우 돈은 Value Object가 아닌 Entity가 된다.
명확한 기준은 없지만 구분하는 2가지 방법이 있다.
만약 하나의 객체를 같은 특성 값을 가진 다른 객체로 대체할 수 있다면 Value Object에 적합하다.
일반적으로 '돈'이 그렇다.오늘 내가 가진 1달러는 어제 내가 가지고 있던 혹은 다른 사람이 가지고 있는 1달러 와 동일하다.
이 1달러는 서로 교체가 가능하다면 Value Object에 적합하다.
Value Object를 integer에 비유하는 것이다.
integer 5가 다른 메서드에서 사용했던 5와 동일한지 아닌지 신경을 쓰는지를 생각해 봐야한다.
신경 쓰지 않는다면,어플리케이션 내의 모든 5는 어떻게 생성되었는지 상관없이 모두 같은 5이고 Value Object이다.
이 개념을 도메인으로 확장해 도메인을 integer처럼 취급할 수 있다면 Value Object에 적합하다.