2024. 8. 26. 21:44ㆍ독서
이 장에서는 '값 객체'에 대해서 다루고 있습니다.
'값 객체'란 무엇일까요.
도메인 주도 설계에서 말하는 값 객체는 이렇듯 시스템 특유의 값을 나타내는 객체다.
그리고 바로 다음 값의 성질을 설명하고 있습니다.
- 변하지 않는다.
- 주고 받을 수 있다.
- 등가성을 비교할 수 있다.
이를 코드로 생각해보면 각각 다음과 대응된다고 생각했습니다.
- 변하지 않는다. -> final
- 주고 받을 수 있다. -> 대입으로 밖에 변경이 안 된다.
- 등가성을 비교할 수 있다.(equals @override)
변하지 않는다.
불변하는 값의 장점을 책에서는 다음과 같이 서술하고 있습니다.
객체를 생성하고 메서드에 인자로 넘기니 자기도 모르는 사이에 상태가 수정되어 의도하지 않은 동작을 보이거나 버그를 일으켰다는 이야기는 ... 모르는 사이에 상태가 바뀌는 것이 문제라면 처음부터 상태가 변화하지 않게 하면 된다. 단순하지만 강력한 방어책이다.
상태 변화의 가능성을 원천 차단함으로써, 상태수정으로 인한 버그를 방지하는 것이 장점이라고 설명하고 있습니다.
객체를 여러 계층 혹은 여러 클래스에서 사용할 때, 만약 데이터가 변경되는 상황이 발생할 수 있다면 이는 유지보수를 매우 어렵게 만들 것
입니다.
교환 가능하다.
자칫 오해하기 쉬운 문장인데, 책에서 '교환 가능'의 의미는 값 객체를 수정하는 방법은 새로운 값 객체의 대입 밖에 없다는 뜻으로 해석됩니다.
var fullName = Fullname("hoo", "kang")
fullName = Fullname("hoo2", "kang")
등가성 비교 가능
책에서는 equality를 등가성으로 번역한 것으로 보인다.
흔히 VO의 특징을 얘기할때 '동등성'을 많이 사용한다.
여기서는 등가성이라고 하겠다.
등가성은 값 객체의 필드의 값이 같다면 같은 객체로 취급한다는 것이다.
var nameA = FullName("hoo", "kang")
var nameB = FullName("hoo", "kang")
println(nameA == nameB) // true
이것이 가능하게 하려면 Java에서는 equals, HashCode를 override 해야한다.
Kotlin에서는 data class를 사용해서 ==(동등성 비교)를 사용하면 된다.
값 객체가 되기 위한 기준
책에서는 어떤 것을 값 객체로 사용해야하는 지에 대해서 간략하게 설명합니다.
도메인 모델로 선정되지 못한 개념을 값 객체로 정의해야 할지에 대한 기준으로 필자는 '규칙이 존재하는가'와 '낱개로 다루어야 하는가'를 중요하게 본다.
간단히 코드로 살펴보면
class FullName(
private val firstName: String,
private val lastName: String) {
init {
require(validateName(firstName)) { "First name must contain only letters" }
require(validateName(lastName)) { "Last name must contain only letters" }
}
private fun validateName(name: String): Boolean {
return name.matches("^[a-zA-Z]+$".toRegex())
}
}
행동이 정의된 값 객체
VO가 method를 통해서 새로운 객체를 생성하는 것을 말한다.
@AllArgsConstructor
public class Money {
@NotNull
private final BigDecimal amount;
@NotNull
private final Currency currency;
public Money add(@NotNull Money arg) {
if(!arg.currency.equals(this.currency)) {
throw new IllegalArgumentException("화폐 단위가 다릅니다.");
}
return new Money(amount.add(arg.amount), currency);
}
}
값 객체를 도입했을 때의 장점
책에서는 총 4가지의 장점을 말한다.
1. 표현력이 증가한다.
2. 무결성이 유지된다.
3. 잘못된 대입을 방지한다.
4. 로직이 코드 이곳저곳에 흩어지는 것을 방지한다.
'독서' 카테고리의 다른 글
(나도코딩의 파이썬 입문) 11장. 모듈과 패키지(p.382~395) (1) | 2023.03.17 |
---|---|
(나도코딩의 파이썬 입문) 11장. 모듈과 패키지(p.369~381) (1) | 2023.03.16 |
(나도코딩의 파이썬 입문) 11장. 모듈과 패키지(p.363~368) (0) | 2023.03.15 |
(나도코딩의 파이썬 입문) 11장. 모듈과 패키지(p.353~362) (0) | 2023.03.14 |
(나도코딩의 파이썬 입문) 10장. 예외 처리(p.338~345) (0) | 2023.03.13 |