[Spring Boot] 도메인 모델 패턴과 트랜잭션 스크립트 패턴

Posted by 김성철

SpringBoot - 도메인 모들 패턴과 트랜잭션 스크립트 패턴

JPA 강의를 듣던중 나온 얘기를 듣고 정리함  
실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 - 섹션6 - 주문도 도메인 개발 - 주문 서비스 개발  
==========================================================================  
주문 서비스의 주문과 주문 취소 메서드를 보면 비즈니스 로직 대부분이 엔티티에 있다.  
서비스 계층은 단순히 엔티티에 필요한 요청을 위임하는 역할을 한다.  
이처럼 엔티티가 비즈니스 로직을 가지고 객체 지향의 특성을 적극 활용하는 것을 도메인 모델 패턴이라 한다.  
반대로 엔티티에는 비즈니스 로직이 거의 없고 서비스 계층에서 대부분의 비즈니스 로직을 처리하는 것을 트랜잭션 스크립트 패턴이라 한다  
- 도메인 모델 패턴( http://martinfowler.com/eaaCatalog/domainModel.html )  
- 트랜잭션 스크립트 패턴( http://martinfowler.com/eaaCatalog/transactionScript.html )  
==========================================================================  
  
요약 :  
- 엔티티에 핵심 비즈니스 로직을 몰아 넣는 것을 도메인 모델 패턴 (JPA , ORM)  
- 엔티티에는 비즈니스 로직이 거의 없고 setter , getter만 있고 서비스 계층에서 대부분 로직을 처리하는 것은 트랜잭션 스크립트 패턴 (MyBatis, 일반적으로 SQL을 다뤄서 개발하는 것)  

도메인 모델 패턴

- 소프트웨어 개발에서 사용되는 디자인 패턴 중 하나로, 소프트웨어 시스템에서의 도메인(예: 비즈니스 규칙, 데이터 구조, 로직 등)을 표현하고 처리하는 데 중점을 둔 구조적인 설계 방법론입니다.  
  
- 실제 비즈니스 도메인에 대한 개념, 규칙, 데이터를 모델링한 객체들의 집합입니다. 이 모델은 해당 도메인의 특성과 규칙을 반영하며, 개발자들이 비즈니스 도메인을 이해하고 그에 맞춰 소프트웨어를 개발할 수 있도록 도와줍니다.  
  
- 주요 구성 요소 및 특징:  
	도메인 객체 (Domain Objects):  
		도메인 모델 패턴은 주로 객체지향 프로그래밍에서 사용되며, 도메인 객체는 실제 비즈니스 도메인의 개념을 표현한 객체입니다.  
		예를 들어, 주문, 상품, 고객 등의 개념에 대한 객체가 도메인 객체가 될 수 있습니다.  
  
	비즈니스 로직 (Business Logic):  
		도메인 객체는 해당 도메인의 비즈니스 규칙 및 로직을 포함하고 있습니다.  
		이 로직은 해당 도메인에서의 작업을 수행하고 도메인 객체 간의 상호 작용을 정의합니다.  
  
	상태 (State):  
		도메인 객체는 특정 상태를 가지며, 이 상태는 도메인에서의 상태 전이 및 동작에 영향을 줍니다.  
		예를 들어, 주문 객체의 상태는 "주문 받음", "처리 중", "배송 중" 등이 될 수 있습니다.  
  
	행위 (Behavior):  
		도메인 객체는 특정 행위를 수행할 수 있으며, 이러한 행위는 비즈니스 로직에 의해 정의됩니다.  
		각 도메인 객체는 해당 도메인에서 필요한 행위를 수행하도록 구현됩니다.  
  
도메인 모델 패턴은 소프트웨어 시스템을 비즈니스 도메인의 모델링과 관련된 부분과 분리하여 설계함으로써 시스템의 유지보수성, 확장성, 이해성을 높이는 데 도움을 줍니다.  
이 패턴은 비즈니스 로직을 중심으로 한 설계를 가능하게 하고, 소프트웨어 시스템을 실제 비즈니스 도메인에 더욱 가깝게 모델링할 수 있도록 도와줍니다.  
  
ex) 도메인 모델 패턴 예시 코드  
==========================================================================  
  
import java.util.ArrayList;  
import java.util.List;  
  
class Product {  
	private int productId;  
	private String name;  
	private double price;  
  
	public Product(int productId, String name, double price) {  
		this.productId = productId;  
		this.name = name;  
		this.price = price;  
	}  
  
	// Getters and setters (omitted for brevity)  
}  
  
class Order {  
	private int orderId;  
	private List<Product> products;  
  
	public Order(int orderId, List<Product> products) {  
		this.orderId = orderId;  
		this.products = products;  
	}  
  
	public double calculateTotal() {  
		double total = 0;  
		for (Product product : products) {  
			total += product.getPrice();  
		}  
		return total;  
	}  
}  
  
public class Main {  
	public static void main(String[] args) {  
		Product product1 = new Product(1, "Laptop", 1000.0);  
		Product product2 = new Product(2, "Mouse", 20.0);  
  
		List<Product> products = new ArrayList<>();  
		products.add(product1);  
		products.add(product2);  
  
		Order order = new Order(1, products);  
		double totalAmount = order.calculateTotal();  
		System.out.println("Total amount for the order: " + totalAmount);  
	}  
}  
  
==========================================================================  

트랜잭션 스크립트 패턴

- 트랜잭션 스크립트 패턴(Transaction Script Pattern)은 소프트웨어 개발에서 사용되는 디자인 패턴 중 하나로, 비즈니스 로직을 트랜잭션 단위로 단순한 스크립트 형태로 구현하는 방법론입니다. 이 패턴은 비즈니스 로직을 단순한 프로시저나 함수의 형태로 처리하며, 트랜잭션마다 각각의 스크립트가 실행됩니다.  
  
- 트랜잭션 스크립트 패턴의 특징과 구성 요소:  
	트랜잭션 단위 실행 (Transaction Script):  
		각 트랜잭션은 비즈니스 로직이나 규칙을 포함한 트랜잭션 스크립트로 구성됩니다.  
		특정 작업이 수행될 때 해당 트랜잭션 스크립트가 호출되어 비즈니스 로직을 처리합니다.  
  
	단순한 프로시저나 함수 (Simple Procedures/Functions):  
		트랜잭션 스크립트는 주로 간단한 프로시저나 함수의 형태로 구현됩니다.  
		각 트랜잭션에 대한 비즈니스 로직이 이 프로시저나 함수 내에 포함됩니다.  
  
	트랜잭션 처리 (Transaction Handling):  
		트랜잭션 스크립트 패턴은 트랜잭션의 처리 방법을 중시합니다.  
		각 트랜잭션은 데이터베이스 상태를 변경하거나 검증하는 등의 작업을 수행합니다.  
  
	DB 연동 및 데이터 처리 (Database Interaction):  
		트랜잭션 스크립트는 데이터베이스와 연동하여 데이터를 조회, 변경, 삭제 등의 작업을 처리합니다.  
		이러한 데이터 처리는 각 트랜잭션에 따라 다양하게 이루어집니다.  
  
	트랜잭션 스크립트 패턴은 간단한 비즈니스 로직이나 프로세스를 처리할 때 유용하며, 비교적 단순한 응용 프로그램에서 사용됩니다.  
	그러나 비즈니스 로직이 복잡하고 길어질 경우 유지보수가 어려워질 수 있으며, 이러한 경우에는 더 복잡한 아키텍처 패턴들을 고려하는 것이 좋습니다.  
  
ex) 트랜잭션 스크립트 패턴 예시 코드  
==========================================================================  
import java.util.List;  
  
class Product {  
	private int productId;  
	private String name;  
	private double price;  
  
	public Product(int productId, String name, double price) {  
		this.productId = productId;  
		this.name = name;  
		this.price = price;  
	}  
  
	// Getters and setters (omitted for brevity)  
}  
  
public class OrderService {  
  
	public double createOrder(int orderId, List<Product> products) {  
		double totalAmount = 0;  
		for (Product product : products) {  
			totalAmount += product.getPrice();  
		}  
  
		// 여기서 데이터베이스에 주문 정보를 저장하고 트랜잭션을 마무리할 수 있음  
		// 예를 들어, 데이터베이스에 저장하는 부분은 생략하겠습니다.  
  
		return totalAmount;  
	}  
  
	public static void main(String[] args) {  
		Product product1 = new Product(1, "Laptop", 1000.0);  
		Product product2 = new Product(2, "Mouse", 20.0);  
  
		List<Product> products = List.of(product1, product2);  
  
		OrderService orderService = new OrderService();  
		double totalAmount = orderService.createOrder(1, products);  
		System.out.println("Total amount for the order: " + totalAmount);  
	}  
}  
  
==========================================================================  

도메인 모델 패턴과 트랜잭션 스크립트 패턴의 차이점

도메인 모델 패턴과 트랜잭션 스크립트 패턴은 소프트웨어 개발에서 사용되는 두 가지 다른 설계 패턴이며, 각각의 특징과 목적이 다릅니다.  
  • 도메인 모델 패턴 (Domain Model Pattern):
    목적: 비즈니스 도메인을 중심으로 설계하고 구현하는 것이 주된 목적입니다.
    비즈니스 도메인의 복잡한 규칙, 로직, 상태 등을 객체로 모델링하여 표현합니다.

    구성 요소:
    도메인 객체: 비즈니스 도메인의 개념을 표현한 객체들의 집합으로, 비즈니스 로직과 상태를 포함합니다.
    비즈니스 로직: 도메인 객체에 포함된 비즈니스 규칙, 로직을 정의하고 구현합니다.
    특징:
    객체지향 프로그래밍에 기반한 설계 패턴으로, 비즈니스 도메인을 객체로 모델링하여 구현합니다.
    복잡한 비즈니스 로직을 객체 간의 상호 작용으로 표현하며, 비즈니스 도메인에 가까운 모델링을 지향합니다.

  • 트랜잭션 스크립트 패턴 (Transaction Script Pattern):
    목적: 간단한 트랜잭션 단위의 비즈니스 로직을 단순한 스크립트 형태로 구현하는 것이 주된 목적입니다. 각 트랜잭션마다 간단한 프로시저나 함수 형태로 비즈니스 로직을 처리합니다.

    구성 요소:
    트랜잭션 스크립트: 각 트랜잭션에 대한 비즈니스 로직이나 규칙을 담고 있는 스크립트 형태의 프로시저나 함수입니다.
    특징:
    트랜잭션별로 비즈니스 로직을 간단하게 처리하며, 주로 간단한 프로시저나 함수로 구현됩니다.
    데이터베이스와의 상호작용을 중심으로 한다.

  • 차이점 요약:
    도메인 모델 패턴은 비즈니스 도메인을 중심으로 객체지향적으로 모델링하고, 객체 간의 상호 작용으로 복잡한 비즈니스 로직을 표현합니다.
    트랜잭션 스크립트 패턴은 트랜잭션 단위로 간단한 비즈니스 로직을 처리하며, 프로시저나 함수 형태로 단순하게 구현됩니다. 주로 데이터베이스와의 상호작용에 중점을 둡니다.

JPA , ORM

도메인 모델 패턴  

Mybatis

트랜잭션 스크립트 패턴