반응형
발전하는 질서(Emerging Order)
- 대규모 시스템이 시간이 지남에 따라 자연스럽게 구조화되고, 일관성을 갖추게 되는 과정을 의미
- 시스템이 진화하면서 일관성과 체계를 유지할 수 있도록 돕는 설계 접근 방식
- 특징:
- 점진적 설계: 시스템이 진화하고 변화하면서 점진적으로 설계를 개선하고 정제한다
- 적응성: 시스템이 환경 변화나 새로운 요구사항에 적응할 수 있도록 유연하게 설계한다
- 일관성 유지: 변화 과정에서 시스템의 일관성을 유지하기 위해 노력한다
- 예제:
- 애자일 개발 방법론: 초기에는 전체 시스템을 상세히 설계하지 않고, 스프린트 단위로 점진적으로 설계하고 구현한다
시스템 은유(System Metaphor)
- 시스템의 구조와 동작을 이해하기 쉽게 하기 위해 사용하는 비유적 표현
- 복잡한 시스템을 설명하고 이해하는 데 도움이 된다
- 특징:
- 직관적 이해: 시스템의 구조와 동작을 직관적으로 이해할 수 있도록 한다
- 공통 언어: 팀원들이 공통적으로 이해할 수 있는 언어를 제공한다
- 설명 용이: 복잡한 개념을 쉽게 설명할 수 있도록 돕는다
- 예제:
- "버스" 은유:
- 메시지 버스(Message Bus)는 메시지를 버스에 태워 목적지까지 이동시키는 방식으로 설명할 수 있다
- 이는 메시지 전송 시스템의 동작을 직관적으로 이해할 수 있게 한다
- "버스" 은유:
책임 계층(Responsibility Layers)
- 시스템의 책임을 여러 계층으로 분리하여 각 계층이 특정한 역할과 책임을 가지도록 하는 설계 패턴
- 이는 시스템의 복잡성을 관리하고, 변경의 영향을 최소화하는 데 도움이 된다
- 특징:
- 명확한 책임 분담: 각 계층이 명확한 책임을 가진다
- 의존성 관리: 계층 간의 의존성을 최소화하여 변경의 영향을 줄인다
- 유지보수성 향상: 각 계층이 독립적으로 변화할 수 있어 유지보수가 용이하다
- 예제: 3계층 아키텍처:
- 프레젠테이션 계층, 비즈니스 로직 계층, 데이터 접근 계층으로 분리하여 각각의 책임을 명확히 한다
// 프레젠테이션 계층
public class OrderController {
private final OrderService orderService;
public OrderController(OrderService orderService) {
this.orderService = orderService;
}
public ResponseEntity<Order> createOrder(OrderRequest request) {
Order order = orderService.createOrder(request);
return new ResponseEntity<>(order, HttpStatus.CREATED);
}
}
// 비즈니스 로직 계층
public class OrderService {
private final OrderRepository orderRepository;
public OrderService(OrderRepository orderRepository) {
this.orderRepository = orderRepository;
}
public Order createOrder(OrderRequest request) {
// 주문 생성 로직
Order order = new Order();
// ...
return orderRepository.save(order);
}
}
// 데이터 접근 계층
public interface OrderRepository extends JpaRepository<Order, Long> {
}
지식 수준(Knowledge Level)
- 도메인 모델에서 핵심적인 개념과 규칙을 정의하는 추상화 계층을 의미한다
- 이는 시스템의 비즈니스 규칙과 로직을 명확히 하는 데 도움을 준다
- 특징:
- 추상화: 비즈니스 규칙과 개념을 추상화하여 명확히 정의한다
- 일관성 유지: 비즈니스 규칙의 일관성을 유지한다
- 명확한 규칙: 시스템의 핵심 규칙을 명확히 정의하여, 이해와 유지보수를 용이하게 한다
- 예제: 대출 승인 규칙:
- 대출 승인에 필요한 규칙과 조건을 지식 수준에서 명확히 정의.
public class LoanApprovalService {
public boolean approveLoan(LoanApplication application) {
// 대출 승인 규칙
if (application.getCreditScore() >= 700 && application.getAnnualIncome() > 50000) {
return true;
}
return false;
}
}
착탈식 컴포넌트 프레임워크(Pluggable Component Framework)
- 시스템의 각 구성 요소를 독립적으로 개발하고, 필요에 따라 시스템에 쉽게 추가하거나 제거할 수 있도록 설계된 프레임워크
- 특징:
- 독립성: 각 컴포넌트는 독립적으로 개발되고 배포될 수 있다
- 유연성: 새로운 컴포넌트를 쉽게 추가하거나 제거할 수 있다
- 확장성: 시스템의 기능을 확장하기 용이하다
- 예제: 플러그인 아키텍처:
- 새로운 기능을 플러그인 형태로 추가하여, 기존 시스템을 변경하지 않고 기능을 확장할 수 있다
// 플러그인 인터페이스
public interface PaymentPlugin {
PaymentResponse processPayment(PaymentRequest request);
}
// PayPal 플러그인 구현
public class PayPalPaymentPlugin implements PaymentPlugin {
@Override
public PaymentResponse processPayment(PaymentRequest request) {
// PayPal 결제 처리 로직
}
}
// Stripe 플러그인 구현
public class StripePaymentPlugin implements PaymentPlugin {
@Override
public PaymentResponse processPayment(PaymentRequest request) {
// Stripe 결제 처리 로직
}
}
// 결제 서비스
public class PaymentService {
private List<PaymentPlugin> paymentPlugins;
public PaymentService(List<PaymentPlugin> paymentPlugins) {
this.paymentPlugins = paymentPlugins;
}
public PaymentResponse processPayment(PaymentRequest request) {
for (PaymentPlugin plugin : paymentPlugins) {
PaymentResponse response = plugin.processPayment(request);
if (response != null) {
return response;
}
}
throw new PaymentProcessingException("No suitable payment plugin found");
}
}
반응형
LIST
'도서' 카테고리의 다른 글
DDD - 에릭 에반스, (15장 디스틸레이션) (0) | 2024.06.29 |
---|---|
DDD - 에릭 에반스, (14장 모델의 무결성 유지) (0) | 2024.06.29 |
DDD - 에릭 에반스, (11장 모델과 디자인 패턴의 연결) (0) | 2024.06.29 |
DDD - 에릭 에반스, (11장 분석 패턴의 적용) (0) | 2024.06.29 |
DDD - 에릭 에반스, (10장 유연한 설계) (0) | 2024.06.29 |