본문 바로가기

DDD/도메인 주도 설계 철저 입문

도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 1장

 

본 포스트 시리즈는 「도메인 주도 설계 철저 입문」책을 요약한 내용입니다.

 


 

도메인의 의미

도메인은 ‘영역’이라는 뜻이지만, 소프트웨어 개발에서 말하는 도메인이란 ‘프로그램이 쓰이는 분야’라고 할 수 있다. 

 

 

도메인 주도 설계란

소프트웨어 개발에 있어 도메인이 중요한 이유는 사용자들의 문제를 해결해주기 위해서 사용자가 처한 환경을 제대로 이해하고, 그것을 코드에 녹여내야 하기 때문이다. 개발자들은 기술을 중시하면서 이 작업을 등한시 하기 쉬운 데, 도메인 주도 설계는 개발자들이 도메인에 초점을 맞출 수 있도록 도와주는 수단이다.

 

 

도메인 모델이란

‘도메인 모델’이란 도메인을 구성하는 개념들을 모델링한 결과물을 말한다. ‘모델링’이 무엇인지 먼저 짚어보자. ‘모델링’은 사건이나 개념을 추상화 하는 작업을 말한다. 쉽게 말하면 대상의 특성을 뽑는 것이다. 만약 자동차를 예로 든다면 자동차의 어떤 성질을 뽑아야 할까? 시동을 걸 수 있다는 특성, 색깔이라는 특성 등이 있을 것이다. 따라서 다음과 같은 결과물을 자동차 모델이라고 부를 수 있다. 

 

자동차 모델
- 모델명 (캐스퍼 일렉트릭)
- 생산자 (현대자동차)
- 색깔 (흰색)
- _시동 켜기_
- _시동 끄기_
- _주행 하기_

 

 

도메인 모델링이란

도메인 모델은 같은 자동차에 대해서도 관점에 따라 다르게 도출될 수 있다. 예를 들어 자동차 판매라는 도메인에서는 자동차를 하나의 상품으로 다루기 위해 자동차의 가격이 주요한 속성으로 뽑힐 수 있는 반면, 자동차 생산이라는 도메인에서는 자동차의 가격보다는 어떤 엔진이나 배터리가 사용되었는지가 중요한 자동차의 속성일 것이다.

 

자동차 모델(자동차 생산 도메인에서)
- 모델명 (캐스퍼 일렉트릭)
- 엔진 모델명
- 배터리 모델명
자동차 모델(자동차 판매 도메인에서)
- 모델명 (캐스퍼 일렉트릭)
- 가격
- 재고

 

이렇듯 도메인 모델링이란 소프트웨어가 해결하고자 하는 문제를 해결할 수 있도록 개념들을 추상화하는 것을 말한다.

 

 


 

 

도메인 객체란

도메인 객체는 도메인 모델을 소프트웨어 모듈로 구현한 것을 말한다. 도메인 객체는 도메인 개념이 변화함에 따라 바뀔 수 있다.

 

 

도메인 객체와 도메인 개념의 관계

 

그런데 도메인 개념은 시간에 따라 변화하기도 한다. 예를 들어 SDV(Software Defined Vehicle) 패러다임 이전에는 자동차의 제동거리는 한 번 출시된 이후에는 바뀔 수 없는 상수였지만, 소프트웨어에 의해 정의될 수 있는 자동차가 만들어지고 난 뒤에 제동거리는 소프트웨어 업그레이드를 통해 변화할 수 있는 속성이자, 소프트웨어 버전에 의해 결정되는 속성이 되었다.

 

이렇게 도메인 개념이 변화하면, 도메인 모델에도 이것이 반영되어야 하고, 나아가 도메인 객체에도 변화를 준다. 때로는 반대로 도메인 객체가 도메인 개념을 바꾸기도 한다. 도메인 객체를 구현하는 과정에서 불필요한 복잡성이나 비효율이 발생하는 경우에는 도메인 개념에 대한 수정이 필요할 수도 있다.

 

이렇듯 도메인 개념과 도메인 객체가 도메인 모델을 사이에 두고 서로 영향을 주고 받는 모습을 도식화 하면 다음과 같다.

 

도메인 개념 <-> 도메인 모델 <-> 도메인 객체

 

 

도메인 주도 설계의 특징과 의의

 

도메인 주도 설계를 실천하기 위해서는 개발자뿐만이 아니라 도메인 전문가의 도움이 반드시 필요하기 때문에 실무에서 도메인 주도 설계를 실천하기란 쉽지 않다. 도메인 주도 설계는 이상적인 특징이 있기 때문에 이상을 현실에 억지로 끼워맞추기 보다는 현실과 타협하는 것도 필요하다. 하지만 이상적인 것이 무엇인지 알지만 현실과 타협하는 것과, 이상을 알지 못하고 되는대로 설계하는 것은 엄연히 다르기 때문에 도메인 주도 설계의 의의는 분명히 있다.

 

도메인 주도 설계는 2003년에 등장한 개념이지만, 모델링에 많은 투자를 함으로써 개발 극초반에 비용이 많이 들어가는 방식으로, 빠르게 출시부터 하는 것이 중요했던 시절에는 주목을 받지 못하다가, 소프트웨어가 장기적으로 운영되면서 많은 수정을 거듭할수록 초반 설계에 대한 투자가 그 빛을 발한다는 것이 증명되어 최근에 그 가치를 인정 받고 있다.

 

개발 속도에 치중한 설계 방식으로 출시 후 여러 수정을 거친 후에는 이리저리 기워진 누더기가 된다. 한 번 출발하고 나면 돌아올 수 없다는 점에서 이러한 방식을 편도 로켓 발사에 비유할 수 있다. 반면 도메인 주도 설계는 항공기 운항이라고 할 수 있다. 속도는 로켓에 비해 압도적으로 느리지만, 왕복 운행이 가능하기 때문이다. 

 

 

2장 ~ 15장 소개

 

2장부터는 도메인 주도 설계의 대표적인 패턴들을 하나씩 다루게 된다. 

 

  • 지식 표현을 위한 패턴
    • 값 객체 (2장)
    • 엔티티 (3장)
    • 도메인 서비스 (4장)
  • 애플리케이션을 구성하는 패턴
    • 리포지토리 (5장)
    • 애플리케이션 서비스 (6장)
    • 팩토리 (9장)
  • 지식 표현을 위한 고급 패턴
    • 애그리게이트 (12장)
    • 명세 (13)

 


 

 

다음 글

 

2024.09.04 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 2장 (1)