SQL 중심 설계란 전통적인 데이터베이스와 데이터의 흐름을 중심으로 설계하는 방식이다.
데이터베이스의 테이블 구조와 SQL 쿼리를 중심으로 설계하는
아마도 우리에게 가장 익숙한 설계방식일 것이다.
데이터베이스의 특징과 같이 데이터베이스를 쉽게 구조화할 수 있다.
정규화를 통해 데이터베이스의 중복을 최소화하고 일관성을 유지할 있다.
DDD란 도메인(해결하려는 관심 영역)을 중심으로 설계 하는 방식이다.
도메인(Domain)
시스템이 해결하고자 하는 영역 혹은 비즈니스 영역을 의미한다.
현실 세계에서 발생하는 연관된 이벤트들의 집합이라고 이야기 할 수 있다.
서브 도메인(SubDomain)
도메인을 구성하는 도메인의 부분 집합이다.
(ex. '컴퓨터'라는 도메인이 있다면 'cpu'라는 서브 도메인이 존재한다고 생각하면 된다.)
도메인 모델(Domain Model)
특정 도메인을 개념적으로 표현한 것이다. 도메인 모델을 사용하면 여러 관계자들이 동일한 모습으로 도메인을 이해하고 도메인 지식을 공유하는데 도움이 된다.
바운더리 컨텍스트(Boundary Context)
바운디드 컨텍스트는 도메인 주도 설계에서 도메인을 분리하고 각각의 컨텍스트를 독립적으로 개발 및 변경할 수 있는 단위로 사용된다.
각 바운더리 컨텍스트는 특정 비즈니스 도메인 모델을 포함하고, 모델과 용어를 해당 영역에서 독립적으로 유효하게 된다.
이렇게 함으로써 도메인 모델이 특정 컨텍스트에서 완전한 의미를 가지게 된다.
어그리게이트(Aggregate)
각 도메인 영역들의 대표하는 도메인 객체들의 집합
개별 객체 수준의 모델만을 참고하여 도메인을 분석하게 되면 무엇이 중요하고 핵심인지 한눈에 파악하기가 힘들다.
하지만 애그리거트 단위로 도메인을 먼저 이해한 후 객체 수준의 모델을 바라보게 된다면 이해하기가 훨씬 쉽다.
클린 아키텍처와 비슷한 개념이지만 port라는 개념을 명시하고 있다.
사용하고자 하는 유틸리티를 각 port에 맞게 구현만 하면 어떤 유틸리티를 가져다 쓸 수 있다.
DDD는 비즈니스 도메인을 중심으로 하며, 도메인 모델링과 비즈니스 로직에 초점을 둔다.
반면에 SQL 중심 설계는 데이터베이스를 중심으로 하며, 데이터베이스 스키마와 쿼리를 중심으로 하고 데이터 구조를 중심으로 설계한다.
DDD는 개발자와 비즈니스 전문가 간의 협력을 강조하고, 도메인 모델의 이해와 정의에 중점을 둔다.
SQL 중심 설계는 주로 데이터베이스 관리와 데이터 구조를 중심으로 하기 때문에, 비즈니스 전문가와의 협력보다는 데이터베이스 관리 및 쿼리 성능에 집중한다.
DDD를 사용하는 이유로는 크게 두가지가 있다고 생각한다.
유연성과 확장성: DDD는 바운디드 컨텍스트를 사용하여 도메인을 분리하고, 각 컨텍스트를 독립적으로 개발하고 변경할 수 있도록 한다. 이는 시스템의 유연성과 확장성을 높여준다. 즉, 객체 지향적 설계에 유리하다.(= 결합도(의존도)가 낮아지고 높은 응집도를 추구하는 모듈화와 비슷하다고 볼 수있다.)
비즈니스 중심적 접근 : DDD를 사용하는 또 다른 이유는 기획자(도메인 전문가)와 개발자 및 이해관계자의 도메인에 대한 이해도의 차이를 극복하고 요구사항에 최적화된 개발이 용이하다.
TDD는 알고 있었는데 DDD는 생소한 개념이었다.
정말 간단하게 이야기 하면 실질적(현실적?)인 기능을 하나씩 모듈화 시키고 이것들을 연결시키는 방식으로 설계를 하는데 MSA와 상당히 비슷하다는 생각이 들었다.
DDD와 MSA의 차이점에 대해서도 공부를 해 봐야겠다.