[ DDD ]

DDD) Domain Driven Development

geekseong 2021. 7. 21. 00:21

TDD(Test Driven Development)같은 개발 방법론중 하나이며 TDD에서는 테스트중심의 개발방법론이라면 DDD는 도메인 중심으로 개발하는 방법을 말합니다.

 

도메인(Domain)이란 소프트웨어 문제 영역이라고 볼 수 있습니다. 추상적인 개념에 대한 정의만을 이야기 하면 이해가 어려우니 예를 들어보도록 하겠습니다.

 

일상생활 속에서 거치는 생각 루틴 몇가지를 살펴보겠습니다.

만약 당신이 읽고 싶은 책이 생각났다라고 가정하면 당신이 다음에 취할 행동은 다음과 같습니다.

 

1. 오프라인 서점을 방문하여 책을 구매한다.

2. 온라인 서점을 방문하여 책을 구매한다.

3. 중고거래를 통해 책을 구매한다.

 

이 과정을 하나씩 풀어보자면 당신의 생각(책을 읽고싶다)은 문제영역으로 볼 수 있고 온/온프라인서점, 중고거래는 문제해결 영역으로 볼 수 있습니다.

 

책을 읽고싶다(문제) -> 온/오프라인 서점 방문, 중고거래(해결방안).

 

그러면 소프트웨어 개발자 관점으로 돌아와서 우리가 책을 읽고 싶은 영역에서 해결해줄 수 있는 방법으로 온라인 서점을 채택한다라고 한다면 온라인 서점이 도메인이라고 볼 수 있습니다.

 

또 비슷한 예를 들어보겠습니다.

만약 당신이 사고 싶은 물건이 생각났다라고 가정해보면 당신이 취할 행동 역시 아래 범주에 속할 것입니다.

 

1. 오프라인 매장을 방문하여 물건을 구매한다.

2. 온라인 매장을 방문하여 물건을 구매 한다.

 

첫번째 예와 마찬가지로 물건을 사고싶다라는 문제영역에서 그에 대한 해결방안으로 채택한 방법(오프라인/온라인매장)이 바로 그 도메인영역이라고 할 수 있습니다. 따라서 우리가 개발하는 모든 프로그램들은 특정 도메인영역에 있는 문제를 해결하기위한 수단입니다.

 

그러면 도메인 중심(Driven)으로 개발한다는것은 무슨의미 일까요?

 

만약 당신이 온라인 쇼핑몰 사이트를 개발한다라고 하면 어느 코드부터 손대야 할까요?

사용자와의 점접인 UI레이어 코드부터 손대야 할까요? 아니면 비지니스 로직 영역의 코드부터 손대야 할까요? 아니면 프로젝트 초기화 작업에 필요한 설정코드부터 손을 대야 할까요?

 

DDD에서는 그 시작을 도메인 영역이라고 생각합니다. 즉 프로젝트의 뼈대 부분인 도메인 설계, 개발이 선행이 되고 나머지 비즈니스로직, UI로직 등등이 그 뒤를 따르는 방식입니다. TDD에서도 같은 맥락으로 테스트 코드가 선행하여 전체적인 코드를 이끌어나가는 방식으로 개발합니다. 즉 DDD에서는 프로젝트의 핵심을 도메인으로 본 것입이다. 도메인은 설계,개발을 바탕으로 프로젝트를 완성해 나가는 방식을 도메인 중심 개발이라고 합니다.

 

DDD가 개발 방법론 이지만 DDD는 사실 개발자들만의 영역이 아닙니다.  도메인 영역에 대해서는 기획자 혹은 프로덕프 매니저가 더 잘 아는 경우가 많습니다.  또 도메인 영역만 따로 놓고 본다면 도메인은 개발언어로 표현되어야 하는 영역이 아닙니다. 그래서 DDD내용을 좀더 살펴보면 비 개발언어인 유비쿼터스 언어로 도메인을 모두가 이해할 수 있도록 하는 표현방법도 나옵니다.

 

더 나아가면 DDD는 MSA(Micro Service Architecture) 구조로 설계하기에 굉장히 적합한 방법입니다. (저 역시 MSA를 먼저 공부하다가 DDD를 공부하게된 케이스 입니다.) MSA를 도입 하게되면 여러 컴포넌트 별로 분리하여 배포하게되는데, 컴포넌트를 분리하는 기준에 대한 해법 역시 DDD와 자연스럽게 연결됩니다. 그리고 MSA를 도입하게되면 분산 환경에서의 배포, 운영, 가용성문제 등등의 운영 이슈 또한 다뤄야 합니다.

 

따라서 DDD는 개발자 뿐만아니라 도메인을 잘 아는 기획팀, 운영이슈를 해결 해 줄 수 있는 운영팀 등등의 여러 역할의 사람들이 모여 서비스 중심의 팀을 구성하는 방법이 좋다라고 합니다.

 

마치며

제가 공부한 내용과 그 내용을 토대로 제 개인적을 생각을 덧붙여서 게시글을 작성하였습니다. 따라서 부족분에 대한 궁금증이나 틀린부분에 대한 따끔한 지적은 언제나 환영입니다. 다른 생각을 가진 분들의 의견도 언제나 환영입니다.

 

레퍼런스

DDD Start! 도메인 주도 설계 구현과 핵심 개념 익히기, 저자 최범균

https://domaindrivendesign.org