목록Book/도메인 주도 개발 시작하기 (5)
Sun's Blog
5.1 시작에 앞서 CQRS 명령 모델과 조회 모델을 분리하는 패턴 명령 모델: 상태를 변경하는 기능(회원 가입, 비밀번호 변경 등) 조회 모델: 데이터를 조회하는 기능(주문 목록, 주문 상세) 엔티티, 애그리거트, 리포지터리 등 앞에서 보았던 도메인 모델은 주로 명령 모델 리포지터리(도메인 모델)과 DAO(데이터 접근)으로 혼용해서 언급할 것 이다. 5.2 검색을 위한 스펙 검색 조건이 고정되어 있다면 간단하게 만들 수 있지만 다양한 조건을 조합해야 할 때가 있다. JPA의 find 메서드를 정의할 수 있지만 조건이 복잡할 수록 정의해야할 find 메서드도 함께 증가하기 때문에 좋은 방법은 아니다. 이렇게 다양하게 조합해야 할 때 사용할 수 있는 것이 스펙(specification)이다. 스펙은 애그리..

4.1 JPA를 이용한 리포지터리 구현 4.1.1. 모듈 위치 리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속한다. 각 타입의 패키지 구성은 아래와 같다. 팀 표준에 따라 리포지터리 구현 클래스를 domain.impl과 같은 패키지에 위치시킬 수도 있는데 이것은 리포지터리 인터페이스와 구현체를 분리하기 위한 타협안 같은 것이지 좋은 설계 원칙을 따르는 것은 아니다. 가능하면 리포지터리 구현 클래스를 인프라스트럭처 영역에 위치시켜서 인프라스트럭처에 대한 의존을 낮춰야 한다. 4.1.2 리포지터리 기본 기능 구현 리포지터리의 기본 기능은 다음 두 가지다. ID로 애그리거트 조회(findById) 애그리거트 저장(save) 인터페이스는 애그..

3.1 애그리커트 주요 도메인 요소 간의 관계를 파악하기 어렵다는 것은 코드를 변경하고 확장하는 것이 어려워진다는 것을 의미한다. 상위 수준에서 모델이 어떻게 엮여 있는지 알아야 전체 모델을 망가뜨리지 않으면서 추가 요구사항을 모델에 반영할 수 있는데, 세부적인 모델만 이해한 상태로는 코드를 수정하는 것이 꺼려지기 때문에 코드 변경을 최대한 회피하는 쪽으로 요구사항을 협의하게 된다. 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들려면 상위 수준에서 모델을 조망할 수 있는 방법이 필요한데 그 방ㅂ버이 바로 애그리커트다. 애그리거트는 관련된 객체를 하나의 군으로 묶어 준다. 애그리거트는 관련된 모델을 하나로 모았기 때문에 한 애그리거트에 속한 객체는 유사하거나 동일한 라이프 사이클을 갖는다. 예를들어 O..

2.1 네 개의 영역 표현 영역(또는 UI 영역): 사용자의 요청을 받아 응용 영역에 전달하고 응용 영역의 처리 결과를 다시 사용자에게 보여주는 역할(스프링의 MVC) 응용 영역: 시스템이 사용자에게 제공해야 할 기능 구현(주문 등록, 주문 취소 등), 응용 서비스는 로직을 직접 수행하기 보다는 도메인 모델에 로직 수행을 위임한다. 도메인 영역: 도메인 모델을 구현 예를 들어 주문 도메인은 '배송지 변경', '결제 완료', '주문 총액 계산' 같은 핵심 로직을 도메인 모델에서 구현 인프라스트럭처 영역: 구현 기술, RDBMS나 Message Queue와의 연동 혹은 SMTP를 이용한 메일 발송, REST API 호출 등을 처리, 인프라스트럭처 영역은 논리적인 개념을 표현하기보다는 실제 구현을 다룸 pub..
1.1 도메인이란? 도메인은 소프트웨어로 해결하고자 하는 문제 영역이며 한 도메인은 다시 하위 도메인으로 나눌 수 있다. 책의 예제에서는 주문의 하위 도메인으로 고객의 주문처리, 혜택의 하위 도메인으로 쿠폰이나 특별할인 등의 예시를 들었다. 한 하위 도메인은 다른 하위 도메인과 연동하여 완전한 기능을 제공한다. 특정 도메인을 위한 소프트웨어라고 도메인이 제공해야 할 모든 기능을 직접 구현하는 것은 아니다. 온라인 쇼핑몰들이 배송서비스는 외부 배송 업체의 시스템을 사용하고 결제 시스템도 직접 구현하기보다는 결제 대행업체를 이용해서 처리할 때가 많다. 혹은 규모가 크지 않은 소규모 업체는 엑셀과 같은 도구를 이용해서 수작업으로 정산을 처리할 수도 있다. 1.2 도메인 전문가와 개발자 간 지식 공유 개발자는 ..