값 객체(Value Object)

💡객체 지향 프로그래밍에서 사용되는 개념인 값 객체(Value Object)에 대하여 기록하였습니다.

 

Value Object

  • 값 객체는 객체 지향 프로그래밍에서 불변하며, 주로 고유한 식별자(ex> ID 값)이 없고 데이터 그 자체로 의미를 갖는 객체를 말합니다.
  • 두 객체가 같은 속성 값을 가지고 있다면 동일한 것으로 간주하며, 본질적으로 데이터를 담는 그릇으로 분류합니다.

불변성

  • 값 객체는 생성된 이후 상태가 변하지 않는 특징이 있습니다.
  • 값 객체의 속성 값이 변경되면 새로운 값 객체를 생성해야 합니다.

동등성

  • 두 값 객체는 그 속성 값이 같으면 동일한 것으로 간주됩니다.
  • 객체의 참조가 다르더라도 같다면 동일한 객체로 취급합니다.

식별자

  • 값 객체는 식별자가 없으며, 데이터 자체가 중요합니다.
  • 그 데이터의 값이 같으면 두 객체는 같은 객체로 취급합니다.

값 객체는 주로 도메인 주도 설계(Domain-Driven Design, DDD)에서 사용되며, 데이터 자체가 중요하고 그 데이터를 정확하게 표현하고 다루기 위한 객체를 만들 때 활용됩니다.

값 객체 활용하기

  • 값 객체는 주로 돈, 거리, 시간 등 식별자가 불필요한 도메인 요소를 표현할 때 사용합니다.
data class Money(val amount: Int, val currency: String)

동등성

  • 값 객체의 동등성의 특징에 따라 Money 객체가 같은 amount와 currency를 가지면 동일한 것으로 취급합니다.
fun main() {
    val money1 = Money(100, "USD")
    val money2 = Money(100, "USD")
    val money3 = Money(200, "USD")

    // money1과 money2는 값이 같으므로 동일한 객체로 간주됩니다.
    println(money1 == money2) // true

    // money1과 money3는 값이 다르므로 다른 객체로 간주됩니다.
    println(money1 == money3) // false
}

불변성

  • 값 객체는 불변성을 특징으로 가지기 때문에 값을 변경하고자 할 경우는 새로운 객체를 반환해야 합니다.
fun increaseAmount(money: Money, amount: Int): Money {
    return money.copy(amount = money.amount + amount)
}

fun main() {
    val money = Money(100, "USD")
    val updatedMoney = increaseAmount(money, 50)
    
    println(money) // Money(amount=100, currency=USD)
    println(updatedMoney) // Money(amount=150, currency=USD)
}

Entity와 VO

  • 엔티티와 값 객체는 도메인 주도 설계에서 사용되는 핵심 개념들로, 서로 보완적인 관계에 있습니다.

Entity

  • Entitiy는 VO(Value Object)와 반대되는 특성을 가집니다.
  • 고유 식별자를 가지며, 변경 가능하고 독립된 객체를 포함합니다.

엔티티와 값 객체의 관계

  • 값 객체는 엔티티의 속성을 구체화하는 데 사용됩니다.
  • 엔티티는 값 객체를 포함할 수 있으며, 값 객체는 엔티티의 속성으로 사용될 수 있습니다.
data class User(
    val id: Long, // 엔티티의 고유 식별자
    var name: String,
    var email: String,
    var address: Address // 값 객체를 엔티티의 속성으로 포함
)

data class Address(
    val street: String,
    val city: String,
    val postalCode: String
)
  • 식별자로 동등성을 비교하며, 식별자가 같다면 같은 엔티티로 취급할 수 있습니다.

엔티티와 값 객체의 상호작용

  • 엔티티는 도메인 모델에서 식별 가능한 개체로 중요한 역할을 하며, 값 객체는 엔티티의 속성을 구체화하고 정확하게 표현하는 데 사용합니다.
  • 값 객체는 불변셩을 보장하므로, 엔티티 내에서 값 객체가 사용될 때 데이터 무결성을 유지하는 데 도움이 됩니다.