티스토리 뷰
VO는 불변성이라는 특성을 갖고 있다. 왜 VO는 불변성을 유지해야할까?
주문(Order) 엔티티가 Money 타입의 price를 갖고 있는 상황을 살펴보자.
Money price = new Money(1000, "KRW");
order.setPrice(price);
만약 누군가 VO(Money)에 접근해서 값을 변경하면 어떤 문제가 발생할 수 있을까?
주문 엔티티는 주문 상태가 배송중이면 가격을 변경할 수 없다는 규칙이 있다. 이 규칙은 changePrice를 통해 지켜지고 있다.
public class Order {
private Money price;
private String status;
public void changePrice(Money newPrice) {
if ("SHIPPING".equals(this.status)) {
throw new IllegalStateException("배송중에는 가격 변경 불가");
}
this.price = newPrice;
}
}
만약 VO의 값을 변경할 수 있다면 규칙을 우회하는 통로가 생기게 되고 엔티티는 더 이상 도메인 규칙의 유효함을 보장할 수 없다.
order.getPrice().setAmount(0);
VO를 불변으로 만들면 이 문제가 원천적으로 차단된다. 값을 변경하고 싶으면 기존 객체를 수정하는 게 아니라 새로운 객체를 만들어서 엔티티의 메서드를 거쳐야 하기 때문이다.
Money newPrice = new Money(0, "KRW");
order.changePrice(newPrice); // 배송중이면 예외 발생 — 규칙이 정상 작동
VO의 불변성은 단순히 값을 못 바꾸게 막는 것이 아니다. 모든 상태 변경이 엔티티의 메서드를 거치도록 강제함으로써, 도메인 규칙이 우회되지 않는 구조를 만드는 것이다.
'언어 > Java' 카테고리의 다른 글
| 테스트 코드, 어디까지 검증해야 할까? (0) | 2026.02.15 |
|---|---|
| 테스트 더블은 코드에서 어떻게 표현되는가 (0) | 2026.02.14 |
| VO, 언제 쓰고 언제 쓰지 말아야 할까 (0) | 2026.02.08 |
| TDD 알아보기 (0) | 2026.02.06 |
| CompletableFuture 가이드 (0) | 2026.01.01 |
