소프트웨어 본질
소프트웨어 본질은 해당 소프트웨어 사용자들을 위해 복잡한 도메인에 관련된 문제들을 해결하는 데 있습니다. 복잡한 도메인을 소프트웨어로 구현하기 위해서는 해당 도메인을 바르게 이해해야 되는데, 도메인 전문가와 개발자 등 프로젝트에 참여한 모든 구성원들은 도메인의 올바른 이해를 위해 많은 노력을 해야 됩니다.
그러나 보통의 프로젝트에서는 비용과 일정, 인력 등 리소스 관리를 중요시하고 있습니다. 특히 개발자들도 도메인에 대한 이해보다는 UI, Framework, DB 등 최신 기술을 습득하고 적용하는 것에만 관심이 많은 것이 사실입니다. 그러므로 도메인의 문제를 해결할 수 있는 올바른 소프트웨어를 개발하기 위한 도메인 주도 설계에 대해 알아보겠습니다.
도메인 주도 설계
도메인이란 비즈니스나 현실세계의 복잡한 문제를 의미합니다. 다양하고 복잡한 현실세계의 문제를 해결해줄 수 있는 올바른 소프트웨어를 만들기 위한 기법으로 도메인 주도 설계가 있습니다.
도메인 주도 설계는 도메인의 가치를 최우선시하는 모델링 기법입니다. 개발자들도 분석과 설계자와 함께 회의에 참석합니다. 코드를 구현하기에 앞서 도메인과 도메인 모델을 명확히 이해하고 또 완전한 이해를 강조하고 있습니다.
또한 도메인 주도 설계는 도메인의 모델과 코드를 매우 밀접하게 관련시키는 것입니다. 코드와 모델을 밀접하게 관련시킴으로써 코드에 도메인의 의미가 녹아있게 됩니다. 모델은 도메인의 중요한 가치를 갖도록 하는 것입니다.
도메인 주도 설계는 크고 복잡한 도메인을 이해하고 탐구하는 활동을 합니다. 이를 통해 발견된 다양하고 많은 도메인의 문제들을 해결하기 위한 소프트웨어 개발의 철학이라고 할 수 있습니다.
소프트웨어 설계
많은 소프트웨어 개발 프로젝트를 수행하는 것을 보면, 특히 소프트웨어를 설계할 때 흔히 벌어지는 일이 있습니다. 소프트웨어 설계는 처음에는 중요한 것들부터 작게 설계가 시작됩니다. 설계가 계속 진행되면서 팀원들은 본인이 담당하는 업무와 관련된 다양한 내용을 설계에 계속 추가하게 됩니다.
복잡한 도메인에 대한 이해와 탐구가 부족한 상태에서 각각의 담당 업무와 관련된 내용을 계속해서 식별하고 추가를 하게 됩니다. 이런 것들이 설계가 진행되는 내내 발생되고 반복됩니다. 비즈니스 상 중요한 것과 덜 중요한, 어쩌면 중요하지 않은 것들이 하나의 큰 덩어리로 얽히게 됩니다.
이렇게 만들어진 설계를 기반으로 구현된 코드는 가독성이 떨어딥니다. 또 많은 기능이 하나로 엮여 새로운 기능의 추가나 개선 등의 유지보수를 어려워지게 만드는 문제가 있습니다.
도메인 주도 설계
이런 문제를 방지하거나 최소화할 수 있는 설계 기법으로 도메인 주도 설계가 해법이 될 수 있습니다. 전체 비즈니스가 한 덩이로 된 큰 진흙 공 같은 소프트웨어를 비즈니스 상 중요도에 따라 도메인을 나눕니다. 또 나눠진 것들을 하나씩 해결해나가는 것이 도메인 주도 설계가 필요한 이유입니다.
도메인 주도에서의 설계는 마이크로서비스를 식별하는 전략적 설계와 전략적 설계를 통해 식별된 마이크로서비스의 내부 구조를 상세하게 정의합니다. 비즈니스의 고유한 활동을 모델링하는 전술적 설계로 구성이 됩니다.
전략적 설계의 첫 번째는 명확히 식별된 Bounded Context 내부를 모델링하기 위한 유비쿼터스 언어를 정의하는 것입니다. 유비쿼터스 언어란 소프트웨어를 개발하는 팀 안에서 사용하는 공통의 언어입니다. 이 공통의 언어를 활용해서 비즈니스를 분석하고 핵심이 되는 개념을 식별하게 됩니다.
이렇게 식별된 개념들을 분석해서 Bounded Context를 식별합니다. 식별된 Bounded Context 간의 매핑 관계를 정의해서 Context map을 작성하게 됩니다. 그리고 최종적으로 Bounded Context로의 분할에 따른 효과를 분석합니다. 서비스의 분할 또는 통합을 검토하여 후보 마이크로서비스를 도출하는 것으로 전략적 설계를 진행하게 됩니다.
도출된 마이크로서비스는 서비스의 내부를 상세히 설계하는 전술적 설계를 통해 최종 코드로 구현에까지 이르게 됩니다. 전술적 설계는 비즈니스의 고유한 활동을 정확하게 모델링하는 설계 패턴과 방법들을 의미합니다.
전략적 설계와 전술적 설계
전략적 설계를 통해 도출한 후보 마이크로서비스별로 서비스의 내부 구조를 상세히 정의하고, 도메인 모델과 모듈, 서비스 인터페이스와 API 그리고 프론트 엔드의 설계를 전술적 설계를 통해 수행하게 됩니다.
용어 설명
먼저 모듈은 도메인 객체를 담는 container의 역할을 수행하는 것을 말합니다. 또한 API는 http URI로 표현된 리소스에 대한 동작이나 범위를 정의한 것입니다. ‘무엇을 어떻게 한다.’로 정의된 API를 REST API라고 합니다. 그리고 도메인 모델은 비즈니스의 핵심 개념을 도메인 객체로 표현한 것으로 UML의 Class Diagram의 형태로 그려지게 됩니다.
도메인 주도 설계
도메인 주도 설계는 소프트웨어로 만들어내야 할 비즈니스에 대해 도메인 전문가와 개발자들의 도메인의 이해에 대한 눈높이를 맞춤으로써 도메인의 문제를 정확히 해결할 수 있는 좋은 소프트웨어를 만들 수 있게 합니다. 또한 유비쿼터스 언어를 개발하여 사용합니다. 도메인 전문가와 소프트웨어 개발자 그리고 소프트웨어 사이에 도메인을 이해하고 탐구합니다.
서로 간에 용어 차이로 인해 발생하는 오해를 설명하는 일종의 번역이 필요하지 않게 됩니다. 프로젝트 팀원 모두가 동일하게 이해하고 표현하는 공통의 언어를 사용해서 프로젝트 팀이 개발을 하게 되기 때문입니다.
이 유비쿼터스 언어의 활용은 한 용어를 다른 개념으로 이해해서 발생되는 잘못된 설계와 구현을 사전에 방지하게 해줍니다. 이것은 좋은 소프트웨어를 만드는 데도 기여를 하게 됩니다. 따라서 소프트웨어 개발에 도메인 주도 설계 기법을 적용합니다. 그래서 비즈니스의 복잡한 문제를 잘 해결할 수 있는 올바른 소프트웨어를 만드는 데 도움을 받을 수가 있습니다.
'SW > 마이크로서비스' 카테고리의 다른 글
마이크로서비스 : 전략적 설계 : 컨텍스트 매핑 : 정의, 개요, 개념 (0) | 2020.05.12 |
---|---|
마이크로서비스 : 전략적 설계 : 바운디드컨텍스와 유비쿼터스 : 개념, 정의, 개요 (0) | 2020.05.12 |
마이크로서비스 : 도메인 주도 설계 : 개념, 정의, 개요 (0) | 2020.05.10 |
마이크로 서비스 : 명령 조회 책임 분리 아키텍처 : 개념, 정의, 개요 (0) | 2020.05.09 |
마이크로 서비스 : SAGA 패턴 : 정의, 개념, 종류, 개요 (0) | 2020.05.08 |