Skip to content

1.2 도메인 모델을 이해하자: 업무 지식을 소프트웨어로 정확하게 표현하기 위한 개념 #1528

@jongfeel

Description

@jongfeel

1.2 도메인 모델을 이해하자: 업무 지식을 소프트웨어로 정확하게 표현하기 위한 개념

1.2.1 도메인 모델의 세 가지 사용법

  • 업무 지식의 요점 정리
  • 의사소통을 위한 기본 용어
  • 클래스 설계의 기본 구조

1.2.2 업무 로직을 기술하는 방법 비교하기

트랜잭션 스크립트

트랜잭션 스크립트는 화면이나 웹 API에 들어오는 입출력 요청을 순서대로 기술합니다.
같은 업무 로직이 여러 트랜잭션 스크립트에 중복되거나 관련된 업무 로직이 여러 트랜잭션 스크립트에 나뉘어서 처리되는 현상이 발생할 수 있으므로 업무 규칙의 기술에는 적합하지 않습니다.

도메인 모델

도메인 모델을 구성하는 클래스에는 업무 규칙에 기반한 계산과 판단 로직만 기술하고, 데이터의 기록과 참조는 도메인 모델이 아닌 다른 애플리케이션 클래스(유스케이스 클래스)에 기술합니다.
업무 로직을 입출력의 관심사와 분리함으로써 업무 로직을 더 명확하게 정리하고 구현할 수 있습니다.

테이블 모듈

테이블 모듈은 테이블의 CRUD(Create, Read, Update, Delete) 조작을 업무 로직에 삽입하며 업무 로직은 테이블 단위로 작성됩니다.
업무 로직을 기술하기 위해 트랜잭션 스크립트 방식의 클래스를 추가하기도 합니다.

기술 방식의 선택

업무 로직이 단순하다면 트랜잭션 스크립트나 테이블 모듈도 하나의 선택지가 될 수 있습니다.
하지만 업무 로직이 복잡하다면 도메인 모델 방식을 선택하는 것이 더 합리적입니다.
복잡한 업무 로직에 초점을 맞추는 도메인 주도 설계의 관점에서 보면 도메인 모델이 가장 합리적인 선택이기 때문입니다.

1.2.3 비즈니스 활동의 모델 만들기

  • 업무 프로세스에 중점 두기
  • 업무 데이터에 중점 두기
  • 업무 규칙에 중점 두기

업무 프로세스에 중점 두기

업무 프로세스에 집중해 개발하는 경우 트랜잭션 스크립트 방식을 사용하는 것이 일반적입니다.
업무 단계별 화면의 세부 사항을 정의하고, 각 세부 사항에 대한 유스케이스를 작성하면 그것이 결국 화면의 요청을 처리하는 트랜잭션 스크립트의 명세서가 됩니다.

업무 데이터에 중점 두기

업무 데이터에 집중하는 모델을 구현하기 위해 선택할 수 있는 방법이 테이블 모듈을 이용하는 방법이며, 테이블에 CRUD(Create, Read, Update, Delete) 조작과 업무 기능을 직접 매핑하는 방식입니다.

업무 규칙에 중점 두기

도메인 모델은 업무 규칙의 계산과 판단 로직 자체를 모델로 만듭니다.
도메인 주도 설계는 업무 규칙에 주목하여 도메인 모델을 만드는 설계 방식 중 하나입니다.
주요 업무 규칙을 클래스로 표현하면서, 업무 규칙에 기반한 계산과 판단 로직을 메서드로 구현하는 방식입니다.

1.2.4 도메인 모델을 만들기 위한 기초 지식

도메인 모델은 업무 규칙을 소프트웨어로 표현하기 위한 개념과 설계 방식입니다.
구체적인 방법은 <도메인 주도 설계>의 2부와 3부에 다양한 패턴으로 소개하고 있습니다.

도메인 모델의 세 가지 용도 인식하기

클래스 설계는 도메인 모델의 세 가지 용도 중 하나에 불과하며, 다음 두 가지도 도메인 모델에서 중요한 역할을 합니다.

  • 업무 지식의 정리
  • 이해관계자와의 의사소통을 위한 기본 공통 언어 사용

엔터티는 클래스 설계의 패턴입니다.
동시에 업무적으로 중요한 관심사를 발견하는 데에 유용한 수단입니다.
엔터티의 클래스 이름을 생각한다는 것은 이해관계자와 의사소통할 때 사용하기 위한 공통 언어를 늘리는 것입니다.

업무 규칙과 그 복잡성

업무 규칙을 이해하는 데 필요한 기초 지식을 쌓으려면 다음과 같은 관점에서 비즈니스 활동을 파악하는 것이 유용합니다.

  • 가치의 제공과 대가
  • 약속과 실행
  • 매출과 비용
  • 시장에서의 경쟁과 비즈니스의 생존 가능성

네 가지 모두 기술적인 관점에서의 활동은 아니지만, 도메인 주도 설계는 이러한 비즈니스 활동에 대한 지식을 넓히고 깊이 이해함으로써, 그 결과를 소프트웨어 설계에 정확하게 반영할 수 있습니다.
프로그래밍 언어를 사용해 클래스를 정의하는 기술적인 활동과 비즈니스 활동의 한계와 제약 조건을 이해하는 업무적인 활동을 통합하는 개발 기법인 것입니다.

가치의 제공과 대가

예를 들어, 컨테이너선 운송 사업을 하는 회사는 화물 운송이라는 가치를 고객에게 제공합니다.
화물의 운송에 대한 대가는 운임과 할증 기타 요금에 대한 수수료입니다.

해당 사업에서 일반적으로 사용하는 용어와 표현을 이해한 후, 업무 지식을 가진 사람들과 소통하면서 클래스나 패키지를 설계하는 것이 도메인 주도 설계의 기본 활동입니다.

약속과 리스크

손실을 최대한 피하거나 줄이기 위해 업무 규칙이 있습니다.
해상 운송은 불확실성이 많은 사업이며 다양한 위험을 가정한 업무 규칙이 복잡하게 얽혀 있습니다.
<도메인 주도 설계>에 나오는 오버부킹과 경로 선택에 대한 업무 규칙의 배경에는 이러한 위험에 대비하기 위한 대책이 포함되어 있습니다.

매출과 비용

매출을 늘리고 비용을 줄이는 것은 중요한 업무 규칙입니다.
오버부킹이나 경로 선택에 대한 업무 규칙은 이러한 이익을 최대화하기 위해 필요한 결정입니다.

1.2.5 모델 주도 설계의 구성 요소

화물 운송의 예약 업무에서 사용되는 오버부킹 규칙을 예로 들어 보겠습니다.

예약 업무

고객에게 화물 운송을 의뢰받으면 원하는 항로와 일정에 빈 공간이 있는 선박이 있는지 확인하고, 그 선박이 있으면 예약을 받습니다.

이러한 업무 내용을 단서로 초기 도메인 모델을 만들어 나갑니다.

기본적인 관심사: 엔터티

엔터티는 ‘개별적으로 인식할 수 있는 실체’를 가리키는 단어입니다.

엔터티는 도메인 모델에 넣어야 할 업무 지식, 용어, 클래스의 중요한 구성 요소입니다.

앞서 설명한 내용으로 미루어 볼 때 번호를 매겨 관리해야 할 개체는 다음 세 가지입니다.

  • 화물 번호
  • 선박 번호
  • 예약 번호

업무 규칙을 찾는 방법

업무 규칙을 찾는 방법으로 표 1-2와 같이 엔터티를 세 가지 유형으로 분류할 수 있습니다.

표 1-2 엔터티를 분류하는 방법

데이터 종류 설명
이벤트 예약 등 발생한 사실
수명이 짧은 리소스 화물, 운항 등
수명이 긴 리소스 선박 등 반복적으로 사용하는 리소스

엔터티를 이벤트와 리소스로 나누는 개념은 업무 데이터에 집중하는 모델링과 같습니다.

예약 이벤트를 식별할 수 있다면 허용 조건 또는 금지 조건으로서 오버부킹 규칙을 발견할 수 있을 것입니다.

모델의 초점 좁히기

예약 이벤트 발생의 허용 조건과 금지 조건에 초점을 맞추면
운항 - 화물
과 같이 단순해집니다.

애플리케이션 전체의 엔터티를 광범위하게 검토하는 것보다 업무 규칙을 발견하고 정의하는데 밀접하게 연관된 엔터티와 그 관계만을 선별하는 활동이 중요합니다.

업무 규칙을 표현하는 기본 구성 요소: 값 객체

적재량이나 크기와 같이 공간에 대한 업무 지식과 관련된 용어는 클래스에서 가장 중요한 구성 요소입니다.
업무 규칙에 따른 계산과 판단 등에 사용되는 이러한 속성을 발견하여 클래스로 표현하는 패턴이 값 객체입니다.

업무 데이터와 계산 및 판단 로직을 한 곳에 모아 정리하는 캡슐화는 단순하지만, 매우 강력한 설계 기법입니다. 이렇게 업무 규칙을 표현하는 기본 구성 요소가 되는 것이 바로 값 객체입니다.

업무 지식으로 다음과 같은 내용이 나온다면 업무 규칙이 관련되어 있을 가능성이 높습니다.

  • 금액
  • 수량
  • 비율
  • 날짜, 일수, 기간

업무 데이터로 기록하고 참조하는 값의 종류를 파악하고 이름에 주목하면 다양한 업무 규칙을 발견할 수 있습니다.
업무 규칙에 초점을 맞춘 도메인 모델의 핵심은 바로 값 객체입니다.

다중성을 클래스로 표현한다: 컬렉션 객체

컬렉션 객체는 배열(array), 집합(set), 맵(map) 등을 인스턴스 변수로 가지고, 그 인스턴스 변수를 사용하는 연산 로직을 같은 클래스에 모으는 설계 패턴입니다.

연관된 다중성은 어떤 업무 규칙(계산과 판단 로직)이 존재한다는 것을 암시합니다. 계산과 판단 로직을 발견하고 정리하는 수단으로 컬렉션 객체가 유용합니다.

여러 객체의 조합: 애그리게이트

여유 공간을 판단하는 계산식은 아직 클래스로 표현하지 못했습니다.
그것을 표현하기 위한 패턴이 애그리게이트입니다.

업무 규칙을 하나의 클래스로 표현하려고 하면 클래스가 비대해집니다.
이것을 피하고 알기 쉽게 정리하기 위해서, 기초가 되는 계산과 판단 로직을 값 객체나 컬렉션 객체로 분리합니다.
그리고 몇 개의 로직을 조합하여 전체를 계산하는 특화된 클래스를 만듭니다.
이것이 바로 애그리게이트 클래스입니다.

조건 분기의 복잡성 표현: 분기 객체

오버부킹의 판단 규칙에는 다음과 같은 경우의 수가 있습니다.

  • 항로 카테고리
  • 계절
  • 화물의 종류

이러한 것들을 정리하기 위해서는 먼저 구분자를 열거하는 것이 중요한데, 자바의 enum을 사용하면 이러한 업무 지식을 그대로 코드로 표현할 수 있습니다.

전체를 정리하기: 모듈

업무 규칙을 표현하려면 상당한 수의 클래스를 찾아서 정의해야 합니다.
이때 전체를 알기 쉽게 정리하는 패턴이 모듈입니다.
프로그래밍 언어로 말하면 패키지 또는 네임스페이스가 이에 해당합니다.

1.2.6 도메인 모델을 발전시키기

  • 업무 지식을 넓히고 깊이 이해한다.
  • 동일한 언어로 개발을 진행하기 위해 용어에 충실한다.
  • 프로그래밍 언어를 이용한 복잡한 업무 로직의 표현을 개선한다.

비즈니스가 존속하는 한 도메인 모델의 개선과 발전은 계속됩니다.
이것이 도메인 주도 설계가 지향하는 소프트웨어 개발입니다.

Metadata

Metadata

Assignees

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions