[DDD] 리포지터리와 모델 구현 -1
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.130~135)를 읽고 정리한 글입니다. JPA를 이용한 리포지터리 구현이 장의 주제는 리포지터리 구현이다. 해당 챕터에서는 자바의 ORM 표준인 JPA를 이용해서 리포지터리와 애그리거트를 구현하는 방법에 대해 살펴본다.모듈 위치리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속한다. 리포지터리 기본 기능 구현리포지터리가 제공하는 기본 기능은 다음 두 가지다.ID로 애그리거트 조회하기애그리거트 저장하기public interface OrderRepository { Order findById(OrderNo no); void save(Order order);} 이 인터페이스를..
[DDD] 애그리거트 -4
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.121~127)를 읽고 정리한 글입니다. 애그리거트 간 집합 연관애그리거트 간 1-N과 M-N 연관은 컬렉션을 이용해 표현할 수 있으며, 대표적인 예로 카테고리와 상품 간의 관계를 들 수 있다. 카테고리 입장에서 보면 하나의 카테고리에 여러 개의 상품이 속할 수 있으므로 1-N 관계이며, 한 상품이 하나의 카테고리에만 속한다면 이는 N-1 관계가 된다. 1-N 관계는 Set과 같은 컬렉션을 이용하여 모델링할 수 있다. 예를 들어, Category가 연관된 Product들을 값으로 갖는 컬렉션을 필드로 정의하는 방식이다. 그러나 개념적으로 1-N 관계가 존재한다고 하더라도, 이를 그대로 구현에 반영하는 것이 항상 요구사항을 충족시키는 것은 아..
[DDD] 애그리거트 -3
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.114~120)를 읽고 정리한 글입니다. ID를 이용한 애그리거트 참조한 객체가 다른 객체를 참조하는 것처럼 애그리거트도 다른 애그리거트를 참조한다. 애그리거트 관리 주체는 애그리거트 루트이므로 애그리거트에서 다른 애그리거트를 참조한다는 것은 다른 애그리거트의 루트를 참조한다는 것과 같다. 애그리거트 간의 참조는 필드를 통해 쉽게 구현할 수 있다. 이 방법은 개발자에게 구현의 편리함을 제공하지만 다음과 같은 문제를 야기할 수 있다. 편한 탐색 오용한 애그리거트 내부에서 다른 애그리거트 객체에 접근할 수 있으면 다른 애그리거트의 상태를 쉽게 변경할 수 있게 된다. 한 애그리거트에서 다른 애그리거트의 상태를 변경하는 것은 애그리거트 간의 의존 ..
[DDD] 애그리거트 -2
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.107~113)를 읽고 정리한 글입니다. 애그리거트 루트애그리거트 루트의 기능 구현애그리거트 루트는 애그리거트 내부의 다른 객체를 조합해서 기능을 완성한다. 예를 들어 Order는 총 주문 금액을 구하기 위해 OrderLine 목록을 사용한다.public class Order{ private Money totalAmounts; private List orderLines; private void calculateTotalAmounts(){ int sum = orderLines.stream() .mapToInt(o1 -> o1.getPrice() * o1.getQuantity()) .s..
[DDD] 애그리거트 -1
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.98~107)를 읽고 정리한 글입니다. 애그리거트도메인 객체 모델이 복잡해지면 개별 구성요소 위주로 모델을 이해하게 되고 전반적인 구조나 큰 수준에서 도메인 간의 관계를 파악하기 어려워진다. 관계를 파악하기 어렵다는 것은 코드를 변경하고 확장하는 것이 어려워진다는 것을 의미한다. 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들려면 상위 수준에서 모델을 조망할 수 있는 방법이 필요한데, 그 방법이 바로 애그리거트다. 애그리거트는 관련된 객체를 하나의 군으로 묶어준다. 애그리거트는 모델을 이해하는데 도움을 줄 뿐만 아니라 일관성을 관리하는 기준도 된다. 모델을 보다 잘 이해할 수 있고 애그리거트 단위로 일관성을 관리하기 때문에, 애그리거트..
[DDD] 아키텍처 개요 -5
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.94~96)를 읽고 정리한 글입니다. 모듈 구성아키텍처의 각 영역은 별도의 패키지에 위치한다. 아래의 그림과 같이 영역별로 모듈이 위치할 패키지를 구성할 수 있다. 도메인이 크면 하위 도메인으로 나누고 각 하위 도메인마다 별도 패키지를 구성한다. 도메인 모듈은 도메인이 속한 애그리거트를 기준으로 다시 패키지를 구성한다 모듈 구조를 얼마나 세분화해야 하는지에 대해 정해진 규칙은 없다. 한 패키지에 너무 많은 타입이 몰려서 코드를 찾을 때 불편한 정도만 아니면 된다.각 영역마다 나누거나(첫 번째 그림) 도메인 기준으로 별도의 패키지를 만든 경험은 있었어도 도메인 내부에서 애그리거트 기준으로 나눈 적은 없었다. 기획할 때 애그리거트를 고려하지 않..
[DDD] 아키텍처 개요 -4
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.88~93)를 읽고 정리한 글입니다. 요청 처리 흐름사용자 입장에서 봤을 때 소프트웨어는 기능을 제공한다. 사용자가 애플리케이션에 기능 실행을 요청하면 그 요청을 처음 받는 영역은 표현 영역이다. 표형 영역은 사용자가 전송한 데이터 형식이 올바른지 검사하고 문제가 없다면 데이터를 이용해서 응용 서비스에 기능 실행을 위임한다. 이때 표현 영역은 사용자가 전송한 데이터를 응용 서비스가 요구하는 형식으로 변환해서 전달한다. 응용 서비스는 도메인 모델을 이용해서 기능을 구현한다. 기능 구현에 필요한 도메인 객체를 리포지터리에서 가져와 실행하거나 신규 도메인 객체를 생성해서 리포지터리에 저장한다.인프라스트럭처 개요인프라스트럭처는 표현 영역, 응용 영..
[DDD] 아키텍처 개요 -3
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P. 80~89)를 읽고 정리한 글입니다. 도메인 영역의 주요 구성 요소도메인 영역의 모델은 도메인의 주요 개념을 표현하며 핵심 로직을 구현한다. 도메인은 아래 표에 나와 있는 것처럼 여러 구성 요소로 이루어져 있다.요소설명엔티티(ENTITY)고유 식별자를 갖는 객체로 자신의 라이프 사이클을 갖는다. 도메인의 고유한 개념을 표현하며, 도메인 모델의 데이터를 포함하며 해당 데이터와 관련된 기능을 제공한다.밸류(VALUE)고유의 식별자를 갖지 않는 객체로 주로 개념적으로 하나인 값을 표현할 때 사용된다. 엔티티의 속성으로 사용할 뿐만 아니라 다른 밸류 타입의 속성으로도 사용할 수 있다.애그리거트(AGGREGATE)연관된 엔티티와 밸류 객체를 개념적..