포스트

Value Object (값 객체)

Value Object (값 객체)

Value Object (값 객체)


도메인 개념을 모델링할 때

  1. 엔티티
  2. 값 객체


개념 모델링 시 유비쿼터스 언어를 활용할 것

  • 서비스에서 사용되는 개념 / 용어 인지 ?
  • 기획 / 앱 개발자들도 해당 개념을 인지하고 있는지 ?


Value Object?

  • 도메인 내에서 측정 / 설명이 가능한 어떤 것
    • 측정: 사람의 나이 (Age)
    • 설명: 사람의 이름 (Name)
  • 불변성이 유지된다
  • 관련 특성을 모은 필수 단위이다 (응집)
    • Address: 도시 + 구 + 동 + 아파트 + 호수
    • Time: count(0~60) + 단위(초/분/시간)
  • 측정 / 설명이 변경될 때 완벽히 대체 가능
    • 사람의 나이가 변경되면 새로운 값객체로 완전히 대체
  • 다른 값과 등가성 비교 가능
    • 모든 특성이 같다면 등가로 간주한다
  • Side Effect Free Function
    • 불변성인 값객체의 메소드는 반드시 고유 상태를 변경하지 않아야 한다
    • Q) 메서드 매개변수로 엔티티가 존재하고, 해당 엔티티를 수정하는 경우
      • 바람직하지 않다. 테스트 어렵다. 해당 엔티티가 메서드를 가지도록 고려해볼 것
      • 매개변수로는 오직 값 만을 전달 -> 부작용 없는 메서드 Good


업스트림으로 부터 받아온 데이터는 Entity? VO? DTO?

배달을 가기 위해서는 음식이 필요하다.

치킨을 건네받은 배달부는 이게 크크크치킨인지 호랑이치킨인지 모른다.

물론 치믈리에라면 냄새로 구분할 수 있겠지만, 배달부 입장에서는 치킨인지 조차 알 필요가 없다.


이처럼 다운스트림에서는 업스트림으로부터 모든 데이터를 알 필요가 없다.

다운스트림에서 필요한 데이터만 업스트림에 요청하면 되고,

다운스트림에서 받은 데이터는 각자 자신의 도메인 로직에 맞게 재구성된다.

다운스트림에서 도메인 로직 수행을 위해서 업스트림으로부터 데이터를 받아온 경우에도

해당 데이터에 대해 모델링을 잘 해야 한다.


업스트림으로부터 받은 데이터는 엔티티 일까? DTO 일까? 값객체 일까?

  • 엔티티?
    • 업스트림으로부터 받아온 데이터를 다운스트림에서도 해당 데이터에 대해 주기적으로 트래킹해야하는 경우 엔티티로 만들 것 같다
    • 다운스트림에서는 엔티티로 표현하고. 업스트림의 이벤트를 받아서 다운스트림 엔티티를 갱신하려나?
  • DTO?
    • 데이터를 담은 그릇일까? 도메인 정보를. 유비쿼터스 언어를 잘 표현하지 못하는 것 같다.
    • 업스트림으로부터 받아온 데이터이지만, 도메인 관련 메서드를 표현해야 할 수도 있다.
  • 값객체
    • 업스트림으로부터 받아온 데이터가 다운스트림에서 주기적으로 트래킹 하지 않는다면 값객체로 만들 것 같다
    • 업스트림으로 부터 받아온 데이터이지만, 이 데이터들도 다운스트림에서의 유비쿼터스 언어로 표현할 수 있는 개념이 있을 것이고, 메서드도 만들어볼 수 있을 듯



값 객체(VO) vs 기본 언어 값 타입 (String, Int 등)

관련 특성이 두개 이상인 경우에는 값객체로 만들겠지만, 만약 관련특성이 한개 뿐이라면.. 기존 언어 값 타입을 값객체로 만들어야 할까?

  • VO +1점: VO에는 도메인에 맞는 메서드를 추가할 수 없다. 예외적인 상황도 이해할 수 있다. 도메인 이해도 증가
    • 이름은 2~3 글자, 한글만 가능하구나
    • 나이는 100살을 넘을 수 없구나
  • VO +1점: 학습 테스트를 짤 수 있다. 도메인 이해도 증가
  • VO -1점: 만들기 귀찮다


TODO 보강

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.