프로그래밍/개발 지식

[개발 지식] 도메인 주도 설계와 데이터 주도 설계

I'm_ 2024. 1. 13. 14:35

소프트웨어 설계(Software Design)

소프트웨어 설계는 소프트웨어 해결책을 찾기 위한 계획과 문제해결 과정을 말한다.

객체 지향 설계

객체지향 설계란 올바른 객체에게 올바른 책임을 할당하면서 낮은 결합도와 높은 응집도를 가진 구조를 창조하는 활동을 말한다.
좋은 객체지향 설계를 위해서는 협력하는 객체들 사이의 의존성을 적절하게 조절함으로써 변경이 용이한 설계를 만들어야 한다.

좋은 설계의 판단 척도 : 캡슐화, 응집도, 결합도

  • 캡슐화 : 변경 가능성이 높은 부분을 객체 내부로 숨기는 추상화 기법이다.
  • 응집도: 모듈에 포함된 내부 요소들이 연관되어 있는 정도로, 객체지향의 관점에서는 객체 또는 클래스에 얼마나 관련 높은 책임들을 할당했는지를 나타낸다.
    응집도가 높은 설계에서는 하나의 요구사항 변경을 위해서 하나의 모듈만 수정하면 되지만, 응집도가 낮은 설계에서는 여러 모듈을 동시에 수정해야 한다. 즉, 응집도가 높을수록 코드를 변경하기가 쉬워진다.
  • 결합도: 의존성의 정도를 나타내며, 객체지향의 관점에서는 객체 또는 클래스가 협력에 필요한 적절한 수준의 관계만을 유지하고 있는지를 나타낸다.
    결합도는 한 모듈이 변경되기 위해서 다른 모듈의 변경을 요구하는 정도로 측정이 가능하다. 즉, 결합도가 높은 설계에서는 한 모듈이 변경되기 위해 많은 모듈을 변경해야 한다.

 

데이터 주도 설계(Data Driven Design)

 

데이터 주도 설계는 객체가 포함해야 하는 데이터에 초점을 두고 설계하는 방식이다.

특징

  • 객체 자신이 포함하고 있는 데이터를 조작하는 데 필요한 행동(getter와 setter)을 정의한다.
  • 외부에 getter와 setter가 노출되기 때문에 캡슐화의 원칙을 위반하게 된다.
public class Student {
	private String name;
    
    public String getName() {
    	return name;
    }
    
    public void setName(String name) {
    	this.name = name;
    }
}

 

도메인 주도 설계(Domain Driven Design)

도메인 주도 설계는 도메인과 일치하도록 소프트웨어를 모델링하는데 초점을 두고 설계하는 방식이다.

여기서 도메인(Domain)이란, 소프트웨어로 해결하고자 하는 문제 영역을 의미하고 하나의 도메인은 여러 하위 도메인으로 나눌 수 있다. 예를 들어, 배달 어플이라는 도메인을 회원, 리뷰, 주문, 결제, 배송, 음식 등의 하위 도메인으로 나눌 수 있다.

특징

  • 도메인 그 자체와 도메인 로직에 초점을 맞추므로 비즈니스 로직을 효과적으로 구현할 수 있다.
  • 보편적인 언어(Ubiquitous Language)의 사용으로 도메인 전문가와 소프트웨어 개발자 간의 커뮤니케이션이 용이하며, 코드의 가독성을 높여 코드를 분석하고 이해하는 시간이 절약된다.

DDD의 구성요소

  • Entity : 고유한 식별자를 가진다. 비즈니스 규칙을 포함하며 이를 통해 도메인의 실체 개념을 표현한다. 회원, 고객, 주문, 음식 등이 Entity의 예시이다.
  • Value Object : 고유한 식별자를 가지지 않는다. 주소, 시간 등이 Value Object의 예시이다.
  • Aggregate : Entity와 Value Object의 모음이다. 예를 들어 주문 도메인은 주문, 배송지 정보, 주문자, 주문 목록, 총 결제 금액 등의 하위 모델로 구성된다.  
    Aggregate는 루트(Root Entity)를 가지며 루트를 기준으로 애그리거트 내의 다른 엔티티나 밸류 객체를 관리한다. 
  • Repository : Aggregate 단위로 도메인 객체를 저장하고 조회하는 인터페이스를 제공하며 도메인 모델과 데이터 베이스 사이의 매핑 역할을 한다.
  • Service : 여러 Aggregate와 관련된 비즈니스 로직을 수행한다.
  • Domain Event : 도메인 모델에서 발생하는 사건을 나타낸다. 주문이 생성되거나 배송상태가 변경되는 것이 도메인 이벤트의 예시이다.

나가며

도메인 주도 설계를 적용하여 소프트웨어를 개발하기 위해서는 더 많은 공부가 필요하다. 이는 프로젝트를 진행하면서 적용을 통해 배워가도록 해야겠다.


참고 자료