/////
Search
Duplicate
7️⃣

도메인 용어와 유비쿼터스 언어

: 코드를 작성할 때 도메인에서 사용하는 용어는 매우 중요함, 도메인에서 사용하는 용어를 코드에 반영하지 않는다면 그 코드는 개발제엑 코드의 의미를 해석하라는 시련을 내리는 것, 예를 들어보자
export enum OrderState { STEP1, STEP2, STEP3, STEP4, STEP5, STEP6 }
TypeScript
복사
⇒ 이와 같은 구현이 있다고할 때
: 실제 주문 도메인의 상태값은 ‘결제 대기중’, ‘상품 준비 중’, ‘출고 완료’, ‘배송 중’, ‘배송 완료’, ‘주문 취소’인데 이 코드는 개발자가 전체 상태를 6단계로 보고 코드로 표현한 것, 이 개발자는 Order의 상태 변경 관련 메소드를 다음과 같이 작성할 확률이 높다.
export class Order { public changeShippingInfo(shippingInfo: ShippingInfo) { verifyStep1OrStep2(); setShippinInfo(shippingInfo); } private verifyStep1OrStep2() { if (state !== OrderState.STEP1 && state !== OrderState.STEP2) { throw new Error(); } } }
TypeScript
복사
⇒ 배송지 변경은 ‘출고 전’에 가능한데, 이 코드의 verifyStep1OrStep2() 메소드는 중요한 도메인 규칙을 포함하지 않고 있다. 그저 STEP1인지 2인지만을 확인할뿐 개발자가 그 외의 도메인 로직을 확인할
수는 없다. 실제 이 코드의 STEP1, STEP2가 각각 ‘결제 대기 중’, ‘상품 준비 중’ 상태로 연결된다는 것을 개발자가 알고 있어야만 가능하다.
⇒ 만약 다음과 같이 코드를 작성하였다면?
export enum OrderState { PAYMENT_WAITING, PREPARING, SHIPPED, DELIVERING, DELIVERY_COMPLETED, CANCELD }
TypeScript
복사
: 이 도메인에서 사용하는 용어를 최대한 코드에 반영하면 코드를 도메인 용어로 해석하거나 도메인 용어를 코드로 해석하는 과정이 줄어듦, 이는 코드의 가독성을 높여서 코드를 분석하고 이해하는 시간을 줄여줌, 최대한 도메인 용어를 사용해서 도메인 규칙을 코드로 작성하게 되므로 버그도 줄어든다.
: 에릭 에반스는 도메인 주도 설계에서 언어의 중요함을 강조하기 위해 유비쿼터스 언어라는 용어를 사용, 전문가, 관계자, 개발자가 도메인과 관련된 공통의 언어를 만들고 이를 대화, 문서, 도메인 모델, 코드, 테스트 등 모든 곳에서 같은 용어를 사용, 이렇게하면 소통 과정에서 발생하는 용어의 모호함을 줄일 수 있고 개발자는 도메인과 코드 사이에서 불필요한 해석 과정을 생략할 수 있음