본 글은 DDD에 입문하려는 사람들을 위해서 작성된 글입니다. DDD란 무엇인지에 대해서 개략적인 그림을 알아보고, 나아가 이 DDD와 OOP는 어떤 관계성을 가지고 있는지에 대해서 알아보고 있습니다. 부디 이 글을 읽는 분들이 DDD란 무엇인지, 그리고 DDD와 OOP는 어떤 관계를 가지고 있는지에 대해서 이해하게 되는 시간이 되길 바랍니다.
DDD란 무엇일까?
도메인 주도 설계(DDD)는 특정 도메인 또는 지식 영역에 맞게 소프트웨어를 모델링하는 것에 초점을 맞춘 소프트웨어 개발 철학 및 접근법입니다. 이런 접근법은 에릭 에반스가 2003년에 "Domain-Driven Design"이라는 책에서 소개했습니다. DDD의 목표는 불필요한 기능이나 기능들에 힘을 쏟는 대신, 사용자나 클라이언트의 복잡한 요구사항에 중심을 둔 소프트웨어를 만드는 것입니다. 결국, 특정 도메인의 문제를 효과적으로 반영하고 해결하는 소프트웨어를 개발하는 것입니다.
DDD로 설계하기 위해 가장 먼저 해야 할 일
도메인 주도 관점에서 설계를 시작하려면, 가장 먼저해야 할 일이 있습니다. 비지니스의 전문 분야 또는 도메인을 정의하는 것입니다. DDD에는 핵심 도메인과 지원 도메인이라는 두 가지 유형의 도메인이 존재합니다. 핵심 도메인은 사업 운영에 있어 독특하고 중심적인 역할을 하며, 개발 과정에서 대부분의 주의, 시간, 자원이 집중됩니다. 반면, 지원 도메인은 돈, 서비스, 시간 등 더 일반적인 도메인들입니다. 이 도메인들은 공통된 언어를 사용하여 모델링 되고, 이에 해당하는 코드로 변환됩니다.
DDD의 핵심 원칙 : 공통 언어를 확립하기
DDD의 핵심 원칙 중 하나는 기술 전문가와 도메인 전문가 모두가 공유하고 이해하는 공통 언어를 확립하는 것입니다. 도메인 전문가란, 특정 분야 또는 "도메인"의 지식과 이해를 가진 사람으로, 이는 꼭 소프트웨어 개발자가 아닌, 해당 분야의 전문가를 의미할 수 있습니다. 예를 들어, 은행 시스템을 개발하는 경우 도메인 전문가는 은행업무에 대한 깊은 이해를 가진 은행원이나 재무 컨설턴트가 될 수 있습니다.
이 공통 언어는 도메인 모델을 중심으로 구조화되며, 팀의 모든 활동을 소프트웨어와 연결하는데 모든 팀원이 이를 사용합니다. 공통 언어를 사용함으로써, 기술 전문가와 도메인 전문가 사이의 커뮤니케이션이 원활해지고, 소프트웨어 모델은 도메인에 대한 공통 이해가 됩니다. 이로써, 도메인 전문가의 전문 지식이 소프트웨어 개발에 직접적으로 반영되어, 사용자의 필요와 실제 비즈니스 문제를 더 정확하게 해결하는 소프트웨어를 만들 수 있게 됩니다.
DDD가 중요하게 생각하는 것 : 기술 전문가와 도메인 전문가의 협업
DDD는 또한 기술 전문가와 도메인 전문가 사이의 협업의 중요성을 강조합니다. 이 협업의 목표는 특정 도메인 문제를 다루는 '개념 모델'을 반복적으로 개선하는 것입니다. 개념 모델이란, 특정 도메인의 주요 개념과 이들 간의 관계를 표현하는 추상적인 표현입니다. 이는 기술적인 세부 사항이나 구현 방법에 대한 고려 없이, 해당 도메인의 본질적인 문제와 요구사항을 이해하고 설명하는 데 도움을 줍니다.
도메인 전문가들을 개발 과정에 참여시킴으로써, 이 개념 모델은 사용자의 필요에 더욱 잘 부합하도록 지속적으로 개선될 수 있습니다. 이를 통해, 소프트웨어 모델은 도메인의 복잡성을 더 잘 표현하고, 실제 비즈니스 문제를 더 정확하게 해결할 수 있게 됩니다.
DDD의 장점
소프트웨어 개발에서 DDD를 사용하는 것에는 여러 가지 이점이 있습니다:
- 커뮤니케이션 향상 : DDD는 기술 전문가와 도메인 전문가 사이의 격차를 줄이는데 도움이 되는 공통 언어 사용을 장려합니다. 이는 팀원 간의 커뮤니케이션과 이해를 향상시켜, 더 효과적인 협업과 더 나은 소프트웨어 설계를 이끕니다
- 핵심 도메인에 초점: DDD는 주요 초점을 핵심 도메인과 도메인 로직에 맞춥니다. 핵심 도메인을 우선순위로 두면, 개발자들은 그 도메인에 특정한 복잡한 문제를 더 잘 이해하고 해결할 수 있어, 사용자의 필요에 더 잘 부합하는 소프트웨어를 만들 수 있습니다
- 유지 관리성: DDD는 모듈식이고 느슨하게 결합된 설계를 촉진하여, 소프트웨어를 더 쉽게 유지 관리하고, 미래에 수정하거나 확장하기 쉽게 만듭니다. 공통 언어의 사용도 시간이 지남에 따라 소프트웨어를 유지 관리하고 발전시키는 데 도움이 됩니다.
DDD의 단점
하지만 장점 뿐 아니라 다음과 같은 단점들도 존재합니다 :
- 복잡성: DDD는 복잡하며 도메인에 대한 광범위한 지식을 요구합니다. 이는 고도로 기술적이거나 잘 정의된 도메인이 없는 모든 종류의 프로젝트에 적합하지 않을 수 있습니다. DDD는 모델이 도메인에 대한 공통 이해를 형성하는 데 분명한 이점을 제공하는 복잡한 도메인에 가장 적합합니다
- 격리와 캡슐화: DDD에 대한 한 가지 비판은 개발자들이 종종 모델을 깨끗하게 유지하고, 문제 해결에 도움이 되는 구조로 만들기 위해 많은 '격리'와 '캡슐화'를 적용해야 한다는 것입니다. 여기서 '격리'란, 서로 다른 부분이나 기능을 분리하여 그 영향을 최소화하는 것을 의미하고, '캡슐화'란 데이터와 그 데이터를 다루는 기능을 하나의 '캡슐'로 묶는 것을 말합니다. 이렇게 격리와 캡슐화를 많이 적용하는 것은 개발 과정을 좀 더 복잡하게 만들고, 추가적인 작업을 필요로 하는 단점이 있을 수 있습니다.
- 학습 곡선: DDD는 새로운 개념과 용어를 도입하므로, 개발자들은 이들을 학습하고 이해하는 데 시간을 투자해야 할 수 있습니다. 이는 DDD에 익숙하지 않거나 이 접근법에 대한 경험이 제한적인 팀에게는 도전이 될 수 있습니다
결론적으로, 도메인 주도 설계(DDD)는 특정 도메인에 맞게 소프트웨어를 모델링하는 데 초점을 맞춘 소프트웨어 개발 접근법입니다. DDD는 공통 언어의 사용, 기술 전문가와 도메인 전문가 간의 협업, 그리고 핵심 도메인에 대한 초점을 강조합니다. DDD는 개선된 커뮤니케이션, 사용자의 요구에 더 잘 부합하고, 유지 관리가 용이하다는 이점을 제공합니다. 그러나 동시에 복잡할 수 있으며, 격리와 캡슐화를 요구하며, 학습 곡선이 존재합니다. DDD는 모델이 도메인 이해에 명확한 이점을 제공하는 복잡한 도메인에 가장 적합합니다.
DDD와 OOP는 어떤 관계가 있을까?
그런데 이렇게 도메인 주도 설계에 대해서 알아봤지만, 저는 이 개발 방법론과 OOP는 어떤 관계성이 있는지 궁금했습니다. 그래서 해당 내용을 조금 더 찾아보고 정리를 해봤습니다.
OOP는 상태와 행동을 캡슐화하는 객체를 생성하는 데 초점을 맞춘 프로그래밍 패러다임입니다. 그에 반해 DDD는 해결해야 하는 문제의 도메인을 이해하고 모델링하는 데 강조를 둔 소프트웨어 설계 접근법입니다.
DDD와 OOP는 유사점이 있다.
Similarities between Domain Driven Design & Object Oriented Programming 이 아티클에 따르면, DDD에서의 많은 개념들이 OOP와 관련된 모범 사례와 유사하다는 점을 언급하고 있습니다. 두 접근법 모두 캡슐화, 모듈화, 그리고 실세계의 것들을 나타내는데 객체를 사용하는 것을 강조합니다. 사실, OOP는 도메인의 특정 부분을 나타내는 객체를 만들고 그들이 어떻게 동작하는지 정의하는 방법을 제공하기 때문에, DDD의 기초 개념으로 볼 수 있습니다.
DDD는 OOP를 넘어서는 개념이다.
하지만, DDD가 도메인 자체의 모델링과 이해에 초점을 맞춤으로써 OOP를 넘어선다는 것을 기억할 필요가 있습니다. 마틴 파울러가 작성한 DomainDrivenDesign 이 아티클에 따르면, DDD는 도메인의 프로세스와 규칙에 대한 풍부한 이해를 가진 도메인 모델을 프로그래밍하는 것을 개발의 중심으로 삼습니다. DDD는 개발자들이 문제 도메인을 정확하게 나타내는 모델을 생성하는데 도움을 주는 집합체(Aggregates), 경계 컨텍스트(Bounded Contexts), 공통 언어(Ubiquitous Language)와 같은 개념들을 도입합니다.
OOP가 DDD를 구현하는 데 주로 사용되지는 하지만, DDD에 사용할 수 있는 유일한 프로그래밍 패러다임은 아니라고 합니다. Domain-driven design in functional programming 이 아티클에서는 DDD가 함수형 프로그래밍에서도 적용될 수 있음을 이야기하고 있습니다. 함수형 프로그래밍 언어는 복잡한 비즈니스 도메인을 모델링하기 위한 자체적인 도구와 기술을 갖고 있고, DDD는 이 컨텍스트에서도 가치 있는 도구가 될 수 있습니다.
결론적으로, OOP와 DDD의 관계는 다음과 같이 설명할 수 있습니다. OOP가 DDD를 구현하는 데 도구로 자주 사용되지만, DDD는 문제 도메인의 모델링과 이해에 초점을 맞추기 때문에 OOP를 넘어서는 개념입니다. OOP와 DDD 모두 캡슐화, 모듈화, 객체 사용을 강조하지만, DDD는 복잡한 도메인을 모델링하기 위한 추가적인 개념과 기법을 도입하기 때문입니다. OOP가 주로 DDD와 함께 사용되지만, DDD는 함수형 프로그래밍과 같은 다른 프로그래밍 패러다임에서도 적용될 수 있습니다.
결론
오늘은 이렇게 DDD가 무엇인지, 그리고 DDD와 OOP는 어떤 관계를 가지고 있는지에 대해서 알아보았습니다. 이 글을 통해서 DDD에 대한 개략적인 이해와 DDD와 OOP의 관계성에 대해서 생각해볼 수 있는 시간이 되었기를 바랍니다.