도메인 모델 시작하기

진크·2022년 4월 10일
1

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=291420687

최범균님의 "도메인 주도 개발 시작하기(2022)" 책을 읽으며 제가 이해한 내용을 메모하였습니다.
(참고는 하시되 100% 신뢰하지 마시고 틀린 것이 있다면 함께 공유해주시면 감사하겠습니다.)

🌸
내가 그의 이름을 불러 주기 전에는
그는 다만
하나의 몸짓에 지나지 않았다.

내가 그의 이름을 불러 주었을 때
그는 나에게로 와서
꽃이 되었다.

내가 그의 이름을 불러 준 것처럼
나의 이 빛깔과 향기에 알맞은
누가 나의 이름을 불러 다오.
그에게로 가서 나도
그의 꽃이 되고 싶다.

우리들은 모두
무엇이 되고 싶다.
너는 나에게 나는 너에게
잊혀지지 않는 하나의 눈짓이 되고 싶다.

김춘수. ⟨꽃⟩

도메인Domain이란?

  • 사전적 의미는 ‘영역', ‘집합’이다.
  • DDD에서 말하는 도메인은 비즈니스 도메인을 말한다.
  • 비즈니스 도메인이란 유사한 업무간의 집합이다.
  • 도메인은 다수의 하위 도메인으로 구성된다.

도메인 모델

  • 도메인 모델은 기본적으로 도메인 자체를 이해하기 위한 개념 모델이다.
  • 개념 모델은 순수하게 문제를 분석한 결과물이다.
  • 개념 모델은 데이터베이스, 트랜잭션 처리, 성능, 구현 기술과 같은 것을 고려하지 않고 있기 때문에 실제 코드를 작성할 때 개념 모델을 있는 그대로 사용할 수 없다.
  • 그래서 개념 모델을 구현 가능한 모델로 전환하는 과정을 거치게 된다.

도메인 모델 도출

  • 제아무리 뛰어난 개발자라 할지라도 도메인에 대한 이해 없이 코딩을 시작할 수 없다.
  • 도출한 모델은 Entity와 Value로 구분할 수 있다.
  • 엔티티와 밸류를 제대로 구분해야 도메인을 올바르게 설계하고 구현할 수 있기 때문에 이 둘의 차이를 명확하게 이해하는 것은 도메인을 구현하는데 있어 중요하다.
public class OrderLine {
		private Product product;
		private int price;
		private int quantity;
		private int amounts;
		...
}

엔티티

  • 엔티티의 가장 큰 특징은 식별자를 가진다는 것이다.
  • 식별자는 엔티티 객체마다 고유해서 각 엔티티는 서로 다른 식별자를 갖는다.
  • 엔티티를 생성하고 속성을 바꾸고 삭제할 때까지 식별자는 유지된다.

밸류 타입

  • 밸류 타입은 개념적으로 완전한 하나를 표현할 때 사용한다.
public class Money {
		private int value;
		
		public Money(int value) {
				this.value = value;
		}
	
		public int getValue() {
				return this.value;
		}
}
//Money를 사용하도록 OrderLine을 변경한 코드
//Money 타입 덕에 price나 amounts가 금액을 의미한다는 것을 쉽게 알 수 있다. => 코드 가독성 향상
//**Money는 더 이상 단순 숫자가 아닌 도메인의 '돈'을 의미하는 것**
public class OrderLine {
		private Product product;
		private Money price;
		private int quantity;
		private Money amounts;
		...
}
  • 밸류 타입의 또 다른 장접은 밸류 타입을 위한 기능을 추가할 수 있다는 것이다.(돈 계산 기능 추가)
public class Money {
		private int value;
		
		...생성자, getValue()

		public Money add(Money money) {
				return new Money(this.value + money.value);
		}

		public Money multiply(int multiplier) {
				return new Money(value * multiplier);
		}
}

엔티티 식별자와 밸류 타입

  • 엔티티 식별자의 실제 데이터는 String과 같은 문자열로 구성된 경우가 많다.
  • Money가 단순 숫자가 아닌 도메인의 ‘돈'을 의미하는 것처럼 이런 식별자는 단순한 문자열이 아니라 도메인에서 특별한 의미를 지니는 경우가 많기 때문에 식별자를 위한 밸류 타입을 사용해서 의미가 잘 드러나게 할 수 있다.
public class Order {
		// OrderNo 타입 자체로 id가 주문번호임을 알 수 있다.
		private OrderNo id;
		...
		public OrderNo getId() {
				return id;
		}
}

도메인 모델에 set 메서드 넣지 않기

  • set 메서드는 도메인의 핵심 개념이나 의도를 코드에서 사라지게 한다.
  • set 메서드는 도메인 객체를 생성할 때 온전하지 않은 상태가 될 수 있다.
  • set 메서드를 구현해야 할 특별한 이유가 없다면 사용하지 않는다.

나의 생각

도메인이란 무엇일까. 이전까지 도메인이라고 한다면 단순히 인터넷 주소를 떠올리곤 하였다. 무지했지만 도메인 주도 개발이라고 하면 인터넷 주소를 작성하는 방법정도로 생각했었다(🦮무식;)
이번 챕터를 읽어나가면서 도메인에 대한 이해가 좁았음을 깨달았다. 그럼에도 아직은 누군가 도메인에 대해서 묻는다면 확실하게 대답할 자신은 없다.(책을 끝까지 읽어가는 과정에서는 나만의 답을 찾기를)
도메인은 아직이지만 도메인 주도 개발에서 추구하고자 하는 것이 무엇인지는 알 것 같다. 이는 도입부에 소개한 김춘수 시인의 '꽃'이 아닐까.

내가 어떤 무엇에게 관심을 주기 전까지 그것은 내게 아무것도 아니지만, 내가 그것에게 이름을 지어준다면 그것은 내게 의미있는 존재가 되는 것처럼.
도메인 주도 개발이 추구하는 것은 하나의(혹은 여럿) '의미'를 부여하는 행위가 아닐까. 그 의미를 공유하고 확장하는 과정이 아닐까.

profile
철학있는 개발자 - 내가 무지하다는 것을 인정할 때 비로소 배움이 시작된다.

0개의 댓글