티스토리 뷰

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의 불변성은 단순히 값을 못 바꾸게 막는 것이 아니다. 모든 상태 변경이 엔티티의 메서드를 거치도록 강제함으로써, 도메인 규칙이 우회되지 않는 구조를 만드는 것이다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함