IT 개발자 단톡방에서 토론이 벌어졌다
개발을 할건데 JPA를 할까 mybatis를 할까 라는 토론이었다
여기서 사람들은 DDD라는 개념을 가져와서 토론을 진행했다
나는 DDD를 모른다...!
토론의 맥락을 따라가기 위해 DDD 개념을 찾아보았다
1. DDD란?
DDD는 "Domain-Driven Design"의 약자로, 소프트웨어 개발 방법론 중 하나다.
이 방법론은 복잡한 소프트웨어 시스템을 개발할 때, 도메인(문제 영역)의 개념과 로직을 중심으로 설계하는 것을 강조한다.
쉽게 말해서, DDD는 프로그램의 구조를 실제 비즈니스나 문제 상황을 반영하도록 만드는 것을 목표로 한다.
2. DDD의 주요개념
- 도메인: 소프트웨어가 해결하려는 문제 영역. ex) 전자상거래 시스템에서는 상품, 주문, 결제 등이 도메인에 해당.
- 도메인 모델: 도메인을 이해하고 표현하기 위한 개념적 모델. 이는 도메인의 주요 개념과 그들 간의 관계를 나타냄
- 엔티티와 값 객체: 엔티티는 고유한 식별자를 가진 객체로, 값 객체는 식별자가 필요 없는 객체입니다. 예를 들어, 주문은 엔티티, 돈이나 주소는 값 객체가 될 수 있다.
- 애그리게이트: 연관된 엔티티와 값 객체의 모음으로, 일관성을 유지하는 단위다. ex) 주문 애그리게이트는 주문, 주문 항목, 결제 정보를 포함할 수 있다.
- 서비스: 도메인 로직을 포함하지 않지만 도메인 객체를 활용하여 작업을 수행하는 객체
3. DDD의 장점
- 비즈니스와의 커뮤니케이션 향상: 비즈니스 전문가와 개발자가 공통의 언어로 소통할 수 있게 해준다.
- 복잡성 관리: 복잡한 시스템을 더 작은, 관리 가능한 부분으로 나눌 수 있다.
- 유연성: 도메인 모델을 통해 요구사항 변화에 유연하게 대응할 수 있다.
4. 예시
전자상거래 애플리케이션을 만든다고 가정해보자,
DDD를 사용하면, 먼저 전자상거래 도메인을 이해해서 이를 모델로 표현합니다.
예를 들어서 [주문], [고객], [상품] 등의 개념을 도메인 모델로 정의하고, 이들 간의 관계를 명확히 한다.
주문 엔티티는 주문 ID라는 식별자를 가지고, 여러 개의 주문 항목(값 객체)을 포함한다.
이렇게 하면 프로그램 구조가 실제 비즈니스 로직을 잘 반영하게 되는데,
결론적으로, DDD는 복잡한 소프트웨어를 개발할 때 문제 영역을 중심으로 설계하여,
비즈니스 요구사항을 더 잘 반영하고, 시스템의 유지보수성을 높이는 방법론이다.
예제가 아직은 PHP가 더 편하므로 ㅠ.ㅠ PHP로 DDD를 구현해보고자 한다
require_once 'Product.php';
require_once 'Order.php';
require_once 'OrderService.php';
$product1 = new Product("P001", "Laptop", 999.99);
$product2 = new Product("P002", "Mouse", 49.99);
$order = new Order("O001", "C001");
$orderService = new OrderService();
$orderService->addProductToOrder($order, $product1);
$orderService->addProductToOrder($order, $product2);
echo "Total Price: " . $orderService->calculateTotal($order);
아래는 DDD 개념을 사용하지 않은 예이다.
class Order
{
public $orderId;
public $customerId;
public $products;
public $totalPrice;
public function __construct($orderId, $customerId)
{
$this->orderId = $orderId;
$this->customerId = $customerId;
$this->products = [];
$this->totalPrice = 0.0;
}
}
class Product
{
public $productId;
public $name;
public $price;
public function __construct($productId, $name, $price)
{
$this->productId = $productId;
$this->name = $name;
$this->price = $price;
}
}
$order = new Order("O001", "C001");
$product1 = new Product("P001", "Laptop", 999.99);
$product2 = new Product("P002", "Mouse", 49.99);
$order->products[] = $product1;
$order->products[] = $product2;
$order->totalPrice = 0;
foreach ($order->products as $product) {
$order->totalPrice += $product->price;
}
echo "Total Price: " . $order->totalPrice;
5. 결론
DDD를 적용한 코드에서는 도메인 객체가 자신의 데이터를 관리하고, 비즈니스 로직을 캡슐화하며, 명확한 도메인 모델을 따른다.
반면, DDD를 적용하지 않은 코드에서는 도메인 객체가 단순 데이터 구조체로 사용되며, 비즈니스 로직이 분산되어 유지보수성이 떨어진다.
DDD를 적용하면 시스템이 복잡해질수록 더 관리하기 쉽고 유연하게 대응할 수 있다. 객체지향 개발의 끝판왕같다.