- Published on
1. 비즈니스 도메인 모델링 학습과 실습
- Authors
- Name
- 이건창
Introduction
도메인 주도 설계는 크게 전략적 설계와 전술적 설계로 나뉜다. 그 중 전략적 설계를 이해하고 적용하는 방법에 대해 정리한다.
해당 글에서는 비즈니스 도메인 모델링 과정을 정리한다.
전략적 설계 과제
팀 스터디를 진행하며 실습 과제로 전략적 설계 구현 과제를 만들었고 정리했다.
- 요구사항
- 사용자는 회원 가입 후 로그인 해 서비스를 이용할 수 있습니다.
- 회원은 공간을 예약할 수 있습니다. 공간은 늘어날 수도 줄어들 수 있습니다.
- 회원은 전체 공간 정보를 확인할 수 있습니다. 정보에는 방 크기, 시간 당 비용, 현재 사용 여부가 기록됩니다.
- 회원은 특정 공간을 선택하고 하루 날짜 단위로 예약 시간을 확인할 수 있습니다.
- 회원은 특정 공간을 제어할 수 있습니다. 전등을 키고 끌 수 있습니다.
- 과제
- 도메인을 분류한다.
- 유비쿼터스 언어를 정의한다.
- 바운디드 컨텍스트 경계 간 소통 방법 정의한다.
도메인 분류
학습
해결하고자 하는 문제를 이해하려면 맥락을 알아야 하는 일처럼 소프트웨어를 만들면서 비즈니스 전략을 알아 얻고자 하는 가치를 알아야 한다. 기업 활동은 비즈니스 도메인과 하위 도메인으로 구성된다.
하위 도메인은 다음으로 구분할 수 있다.
- 핵심 하위 도메인 : 새로운 제품을 발명하거나 기존 프로세스를 최적화해 비용을 줄이는 일을 말한다.
- 일반 하위 도메인 : 모든 회사가 같은 방식으로 수행하는 비즈니스 활동을 말한다.
- 지원 하위 도메인 : 회사 비즈니스를 지원하는 활동을 말한다.
보통 조직 단위로 구분하기도 한다.
- 조직 단위로 하위 도메인 정제하는 일은 도메인 설계 시작 부담을 줄일 수 있다.
- 또한 도메인 설계와 무관한 이해관계자와 소통에서 의사 결정 부담을 줄인다.
- 개발자가 경계할 점은 조직 단위로 구분한 하위 도메인이 소프트웨어 설계시 의사 결정에 도움 되는지 여부다.
하위 도메인을 세부 도메인으로 구분 가능하다.
- 하위 도메인은 세부 하위 도메인으로도 구분 가능하며 세부적인 통찰력을 얻는다.
- 과도하게 세분화하면 복잡도만 높이니 주의해야 한다.
하위 도메인을 구분하는 방법은 각 하위 도메인 특징을 이용할 수도 있다.
- 경쟁우위를 고려한다면 핵심 도메인이다.
- 복잡성을 고려한다면 핵심 도메인이다. 핵심 도메인이 아니지만 복잡한 경우를 경계한다.
- 변동성이 많다면 핵심 도메인이다. 핵심 도메인이 아니지만 변동성이 높은 경우를 경계한다.
- 솔루션 전략을 채택했다면 지원 도메인이다. 경쟁 우위가 필요하지 않다면 구현하지 않고 솔루션을 채택한다.
결론
도메인 분류에 대해 요약했다.
- 비즈니스 도메인을 하위 도메인으로 세분화해 핵심에 집중한다.
- 하위 도메인을 세부 하위 도메인으로 세분화해 앞으로의 방향성을 고려해 설계할 수 있다.
- 하위 도메인 설계시 조직 단위로도 설계해 도메인 지식이 현재 조직에 자연스럽게 흡수되도록 설계 가능하다. (그러나 소프트웨어 설계시 의사 결정에 도움되지 않는다면 조직 단위 도메인 정제를 진행하지 않는다.)
- 하위 도메인 설계시 핵심,일반,지원 도메인 구분이 어렵다면 각 도메인 특징을 고려해 구분 가능하다. 경쟁 우위, 변동성, 솔루션 채택 여부로 결정한다.
책에서 말하고자 하는 건 딱 한 줄이다.
- 핵심에 집중할 수 있도록 핵심 도메인 외 도메인은 복잡도를 낮추고 확장성을 줄여야 한다.
실습
요구사항을 분석해 추출한 기능은 다음과 같다.
- 사용자는 회원 가입해서 회원 권한을 획득한다.
- 사용자는 로그인해서 회원 권한을 사용한다.
- 회원은
전체 공간 리스트
를 확인한다. 리스트에서 노출될 공간 정보는방 크기
,시간 당 비용
,현재 대여 여부
다. - 회원은
전체 공간 리스트
에서공간
을 선택한다. - 회원은
공간 예약
한다. - 회원은
공간 전등
을 제어한다.
기능으로 도메인을 분류하면 다음과 같다.
- 회원 (일반 도메인)
- 예약 (핵심 도메인)
- 공간 (일반 도메인)
여기서 하위 도메인을 구분하기 위해서 경쟁 우위가 높아야 하는 부분은 예약이라 생각했다. 이유는 다음과 같다.
- 예약 금액 차별점이 경쟁 우위를 확보할 방법이다.
- 예약시 다양한 프로모션 혜택이 경쟁 우위를 확보할 방법이다.
- 예약 이력으로 사용되지 않는 공간 비용을 할인해 사용률을 높이는 등의 변동성이 높다.
팀원은 공간도 핵심 도메인이 될 수 있음을 이야기 했다. 결국 우리가 셀링하는건 공간이고 공간에 대한 차별점이 필요하다고 이야기 했으며 동의할 수 있었다.
우리는 공간을 예약하는걸까 공간 예약 기능을 제공하는걸까? 공간에 대한 차별점은 물리적인 공간 차별점이 아닐까? 특별한 공간을 제공하는 일이 핵심 도메인이지 공간 정보를 관리하는 일은 핵심 도메인일 수 있을까? 같은 고민도 할 수 있다.
유비쿼터스 언어
학습
효율적인 소프트웨어 솔루션 설계를 위해 비즈니스 도메인 지식이 필요하다.
효과적인 소프트웨어는 도메인 전문가가 문제를 생각하는 방식인 멘탈 모델을 모방해야 한다. 비즈니스 도메인 복잡성에 대한 전문성을 갖추는건 비즈니스 전문가가 해야할 일이지만 그들과 동일한 비즈니스 용어를 사용하는 일이 중요하다.
아래 그림처럼 도메인 지식에서 코드까지 변화가 세 번 일어나며 도메인 지식과 코드 간 연관성이 떨어지게 된다.

연관성을 유지하기 위해서는 유비쿼터스 언어로 비즈니스 문제 해결까지 동일한 도메인 지식이 이어지게 설계한다.
- 유비쿼터스 언어 : 문제 정의 부터 해결까지 변환 과정에서 동일하게 사용할 언어를 의미한다. 도메인 설명하기 위한 단일화된 체계로 만들어진다.
- 비즈니스 언어 : 기술 용어를 사용하지 않고 도메인 용어만 사용한 언어를 말한다. 모호함이 없어야 하며 동의어가 만들어지지 않도록 경계해야 한다.
- 비즈니스 도메인 모델 : 유비쿼터스 언어가 발전되면서 멜탈 모델의 비즈니스 엔티티, 액션, 불변성이 반영된 모습을 의미한다. 용어집으로 유비쿼터스 언어를 관리하고 거킨 테스트로 행동을 포착하기도 한다.
거킨테스트를 활용하면 사용자 시나리오로 서비스 검증을 자동화할 수 있다. 거킨 테스트는 사용자 시나리오와 해당 시나리오 테스트 연결점을 잇는다.
결론
요약하면 다음과 같다.
- 문제 정의부터 해결까지 과정에서 사용될 유비쿼터스 언어를 만들어 커뮤니케이션 비용을 줄인다.
- 유비쿼터스 언어에서 모호성과 암묵적 가정을 제거해 일관성을 유지해야 한다.
- 용어집으로 유비쿼터스 언어를 관리하고 거킨 테스트로 행동을 포착하며 일관된 비즈니스 도메인 모델을 유지한다.
한 줄 요약하면 다음과 같다.
- 우리는 비즈니스 도메인 모델을 만들어 비즈니스 문제 해결 과정에서 일관성을 유지할 필요가 있다.
실습
만약 권한 도메인을 추가한다면 다음처럼 세 개의 도메인과 연결될 수 있다.

그럼 도메인에 따라 권한
을 이해하는 방식이 달라지고 소통에 차질이 생긴다.

모두 동일한 의미로 사용하게 된다면 모호성을 가질 수도 있다. 그렇기에 각 바운디드 컨텍스트에 맞게 정의해주는게 모호함을 줄일 수 있는 길이다.
다음을 고려해서 각 바운디드 컨텍스트에 맞게 기능을 정리하고 용어를 정리했다.
- 정리한 기능 목록으로 사용자 시나리오를 고려한다.
- 정리한 용어 목록으로 도메인 전문가 멜탈 모델이 반영된 비즈니스 도메인 모델을 만든다.
회원 기능 정리
- 사용자는 회원 가입한다.
- 회원은 로그인한다.
- 회원은 회원 정보를 조회한다.
- 회원이 가진 권한을 조회한다.
- 회원이 제어할 수 있는 공간을 조회한다.
회원 용어집
용어 | 영문 | 설명 |
---|---|---|
사용자 | User | 서비스에 진입한 사람을 의미한다. |
회원 | Member | 서비스를 이용하기 위해 회원 가입 후 정보를 저장한 사용자를 의미한다. 회원 정보는 사용자 아이디, 비밀번호, 이름을 저장한다. |
권한 | Permission | 사용자가 가진 권한을 의미한다. |
공간 | Room | 사용자가 제어할 수 있는 공간을 의미한다. |
예약 기능 정리
- 회원은 공간에 대한 현재 예약 여부를 조회한다.
- 회원은 공간에 대한 예약 이력을 조회한다. 예약 정보는 시간 당 비용, 시간 단위 예약 정보를 포함한다.
- 회원은 공간 예약 가능 여부를 권한으로 확인한다.
- 회원은 공간을 예약한다.
- 회원은 예약 여부로 공간 제어 권한을 확인한다.
예약 용어집
용어 | 영문 | 설명 |
---|---|---|
회원 | Member | 서비스를 이용하는 회원이다. |
공간 대여 여부 | RoomAvailability | 방 사용 여부를 의미한다. 사용 중(IN_USE ), 예약됨(RESERVED ), 사용 가능(AVAILABLE ), 사용할 수 없음(UNAVAILABLE ) 으로 구분한다. |
현재 대여 여부 | RoomCurrentAvailability | 현재 방 사용 여부를 의미한다. true , false 로 구분한다. |
공간 대여 | RoomRental | 원하는 공간을 선택해 임시 소유권을 가진다. 시간 단위로 예약 가능하며 현재 시점 이전 시간을 예약할 수 없다. |
시간 당 대여 비용 | RentalPricePerHour | 공간 대여시 시간 당 비용을 의미한다. |
시간 단위 예약 정보 | RentalInformationPerHour | 공간 대여시 시간 당 예약 정보를 의미한다. 시간 별로 예약 가능 여부를 출력한다. |
공간 | Room | 예약할 수 있는 공간을 의미한다. |
권한 | Permission | 회원은 예약 여부로 권한을 가진다. |
공간 기능 정리
- 회원은 전체 공간 정보 조회한다. 전제 공간 정보에는 현재 대여 여부와 시간 당 대여 비용, 방 크기가 포함된다.
- 회원은 현재 공간 정보 조회한다. 현재 공간 정보에는 현재 대여 여부와 시간 당 대여 비용, 방 크기가, 예약 이력이 포함된다.
- 권한을 가진 회원은 공간 전등을 제어할 수 있다.
공간 용어집
용어 | 영문 | 설명 |
---|---|---|
회원 | Member | 서비스를 이용하는 회원이다. 공간 정보를 확인할 수 있는 권한을 가진다. |
전체 공간 리스트 | Rooms | 관리하고 있는 방 전체 리스트를 의미한다. |
공간 대여 여부 | RoomAvailability | 방 사용 여부를 의미한다. 사용 중(IN_USE ), 예약됨(RESERVED ), 사용 가능(AVAILABLE ), 사용할 수 없음(UNAVAILABLE ) 으로 구분한다. |
현재 대여 여부 | RoomCurrentAvailability | 현재 방 사용 여부를 의미한다. true , false 로 구분한다. |
시간 당 대여 비용 | RentalPricePerHour | 공간 대여시 시간 당 비용을 의미한다. |
공간 예약 이력 | RoomRentalHistory | 공간에 대한 예약 이력을 의미한다. 예약 이력은 시간 당 예약 여부를 포함한다. |
공간 | Room | 관리하고 있는 공간이다. |
방 크기 | RoomSize | 공간에 대한 방 크기를 의미한다. |
공간 전등 | RoomLight | 공간 전등을 의미한다. flag 변수이며 불이 켜져있을 때는 true , 꺼져있을 때는 false 를 반환한다. |
권한 | Permission | 공간을 제어할 수 있는 권한이다. 해당 권한이 있어야만 공간 전등을 제어할 수 있다. |
권한 기능 정리
- 공간 예약 권한 여부를 조회한다.
- 공간 조회 권한 여부를 조회한다.
- 공간 제어 권한 여부를 조회한다.
권한 용어집
용어 | 영문 | 설명 |
---|---|---|
권한 | Permission | 권한을 이용해 권리를 누릴 수 있는 단위다. |
공간 제어 권한 | RoomControlPermission | 해당 권한을 가진 사용자는 특정 공간에 대한 제어 권한을 가진다. 회원이 현재 시간대에 해당 공간 예약한 이력이 있다면 공간 제어 권한을 가진다. |
공간 예약 권한 | RoomRentalPermission | 해당 권한을 가진 사용자는 특정 공간에 대한 예약 권한을 가진다. 회원이 예약하는 시간대에 다른 공간을 예약하지 않았다면 예약 권한을 가진다. |
공간 조회 권한 | RoomAccessPermission | 해당 권한을 가진 사용자는 특정 공간에 대한 정보 조회 권한을 가진다. 서비스 회원이라면 정보 조회 접근이 가능하다. |
회원 | Member | 서비스를 이용하는 회원이다. 회원은 권한을 가질 수 있다. |
유비쿼터스 언어를 각 도메인 별로 정의해서 모호함을 줄일 수 있었지만 권한 도메인 구현은 어렵다. 권한을 표현하기 위해서는 세 도메인 간 연동이 필요하다. 권한은 회원
이 공간
을 예약
해 얻은 권리이기 때문이다.
바운디드 컨텍스트 경계 간 연동 방법에서 이런 고민을 정리해보겠다.