TIL

Chapter2 아키텍처 개요

2.1 네 개의 영역

‘표현’, ‘응용’, ‘도메인’, ‘인프라스트럭처’는 아키텍처를 설계할 때 출현하는 전형적인 네 가지 영역이다.

표현 영역

응용 영역

public class OrderService {
	
	@Transactional
	public void cancelOrder(String orderId) {
		Order order = getOrderById(orderId);
		order.cancel();
	}

	// ...
}

도메인 영역

인프라스트럭처 영역

2.2 계층 구조 아키텍처

인프라스트럭처 계층에 종속되는 문제

2.3 DIP

가격 할인 도메인 예제를 계속해서 살펴보자.

DIP 적용

public interface RuldDiscounter {
	Money applyRules(Customer customer, List<OrderLine> orderLines);
}
public class CalculateDiscountServie {

	private final RuleDiscounter ruleDiscounter;

	public CalculateDiscountService(RuleDiscounter ruleDiscounter) {
		this.ruleDiscounter = ruleDiscounter;
	}

	public Money calculateDiscount(OrderLine orderLines, String customerId) {
		Customer customer = findCustomer(customerId);
		return ruleDiscounter.applyRules(customer, orderLines);
	}

2.3.1 DIP 주의사항

2.3.2 DIP와 아키텍처

무조건 DIP를 적용할 필요는 없다. 구현 기술에 따라 구현 기술에 의존적인 코드를 도메인 일부에 포함하는 게 효과적일 때도 있고, 추상화 대상이 잘 떠오르지 않을 때도 있다. 이런 경우 DIP의 이점을 얻는 수준에서 적용 범위를 검토해 보자.

2.4 도메인 영역의 주요 구성 요소

도메인 영역을 구성하는 요소는 다음과 같다.

요소 설멍
엔티티 고유의 식별자를 갖는 객체로 자신의 라이프 사이클을 갖고 도메인의 고유한 개념을 표현한다. 도메인 모델의 데이터를 포함하며 관련된 기능을 함께 제공한다.
밸류 식별자를 갖지 않는 객체로 주로 개념적인 하나의 값을 표현할 때 사용된다. 엔티티의 속성 또는 다른 밸류 타입의 속성으로도 사용할 수 있다.
애그리거트 연관된 엔티티와 밸류 객체를 개념적으로 하나로 묶은 것이다.
리포지터리 도메인 모델의 영속성을 처리한다.
도메인 서비스 특정 엔티티에 속하지 않은 도메인 로직을 제공한다. 도메인 로직이 여러 엔티티와 밸류를 필요로 하면 도메인 서비스에서 로직을 구현한다.

2.4.1 엔티티와 밸류

2.4.2 애그리거트

2.4.3 리포지터리

2.5 요청 처리 흐름

  1. 사용자가 애플리케이션에 기능 실행 요청을 한다.
  2. 표현 영역은 사용자가 전송한 데이터 형식이 올바른지 검사하고 응용 서비스에 기능 실행을 위임한다.
  3. 응용 서비스는 도메인 객체를 리포지터리에서 가져와 실행하거나 신규 도메인 객체를 생성해 리포지터리에 저장한다.
  4. 응용 서비스는 결과를 표현 계층에 리턴하고 표현 계층은 알맞은 형식으로 다시 사용자에게 리턴한다.

2.6 인프라스트럭처 개요

2.7 모듈 구성