DDD 설계 VS SQL 중심 설계

ggamang·2023년 4월 5일
0

JAVA&Spring

목록 보기
20/27

DDD(Domain-Driven Design): 도메인 주도 설계

Domain이란?

  • 소프트웨어로 해결하고자 하는 문제 영역 => 비즈니스 영역

Domain Driven Design

비즈니스 도메인을 중심으로 시스템을 설계하는 방법

데이터베이스 스키마나 기술적인 제약조건에 우선순위를 두지 않고, 비즈니스 요구사항을 우선으로 하여 설계

  1. 도메인의 모델과 로직에 집중하는 개발 방식
  • 복잡한 도메인을 해결하는 것을 높은 우선순위로 생각해 서비스를 만드는 방법
  1. Ubiquitous Language - 단일화된 언어체계 사용
  • 기획~개발 모두 업무 용어 통일하여 커뮤니케이션을 진행한다
  1. Software Entity와 Domain 간 개념 일치
  • 분석, 모델, 설계, 코드가 달라 불일치가 발생하는 구조가 아닌 분석모델~코드까지 함께 움직이는 구조

장점

  1. 비즈니스 요구사항 충족성
    이해관계자들이 모두 요구사항에 대해 집중하며, 도메인에 대한 이해도를 바탕으로 요구사항을 충족시키는 시스템 개발이 가능하다
  2. 유연성 & 확장성
    새로운 요구사항이 있을 때 기존 도메인 모델을 조정하거나 새로운 모델을 추가하는 방법을 통해 쉽게 시스템 변경이 가능하다
    객체 지향적인 설계를 통해 코드의 재사용성도 높일 수 있다

단점

  1. 도메인을 이해하는데 소요되는 시간과 비용
    비즈니스 도메인을 충분히 분석하고 이해하는 추가적인 시간이 요구된다

코드 예시

'주문' 도메인을 DDD로 설계한 구조 및 코드

public class Order {
    private int orderId;
    private Customer customer;
    private List<OrderItem> orderItems;
    private OrderStatus status;
    
    public Order(int orderId, Customer customer, List<OrderItem> orderItems) {
        this.orderId = orderId;
        this.customer = customer;
        this.orderItems = orderItems;
        this.status = OrderStatus.PLACED;
    }
    
    public void cancel() {
        if (this.status == OrderStatus.PLACED) {
            this.status = OrderStatus.CANCELED;
        }
    }
}

public class Customer {
    private int customerId;
    private String name;
    private String email;
    
    public Customer(int customerId, String name, String email) {
        this.customerId = customerId;
        this.name = name;
        this.email = email;
    }
}

public class OrderItem {
    private int productId;
    private String productName;
    private int quantity;
    
    public OrderItem(int productId, String productName, int quantity) {
        this.productId = productId;
        this.productName = productName;
        this.quantity = quantity;
    }
}

public enum OrderStatus {
    PLACED, SHIPPED, DELIVERED, CANCELED
}

SQL 중심 설계

데이터베이스 스키마와 기술적인 제약조건을 중심으로 시스템을 설계하는 방법

데이터베이스의 테이블 구조와 제약조건을 먼저 설계하고, 이를 기반으로 어플리케이션을 설계한다

장점

  1. 시스템 성능
    SQL 중심 설계로 데이터베이스를 우선하기에 시스템의 성능이 높아질 수 있다

단점

  1. 비즈니스 요구사항에 대한 고려 부족
    데이터베이스 스키마가 중심이 되면서, 비즈니스 요구사항을 충분히 반영하지 못해 시스템 기능성과 확장성에 제약이 있을 수 있다.
  2. 유연성 저하
    데이터베이스 스키마를 변경할 경우 시스템 전체에 파급 영향이 있기에 비즈니스 요구사항 변경에 따른 스키마 구조 변경 필요성이 대두될 경우 시스템 유연성이 떨어지게 된다

예시 코드

마찬가지로 주문 도메인을 SQL 중심으로 작성한 ERD 및 코드이다

// 주문 테이블
public class Order {
    private int orderId;
    private int customerId;
    private OrderStatus status;
    
    public Order(int orderId, int customerId, OrderStatus status) {
        this.orderId = orderId;
        this.customerId = customerId;
        this.status = status;
    }
    
    public void cancel() {
        if (this.status == OrderStatus.PLACED) {
            this.status = OrderStatus.CANCELED;
        }
    }
}

public enum OrderStatus {
    PLACED, SHIPPED, DELIVERED, CANCELED
}

// 고객 테이블
public class Customer {
    private int customerId;
    private String name;
    private String email;
    
    public Customer(int customerId, String name, String email) {
        this.customerId = customerId;
        this.name = name;
        this.email = email;
    }
}

DDD와는 달리, 주문 항목(OrderItem) 정보를 나타내는 객체가 없으며, 대신 데이터베이스 테이블과 매핑되는 필드만 가지고 있게 된다.

0개의 댓글