DDD (24) 썸네일형 리스트형 애그리게이트란 - 「도메인 주도 설계 철저 입문」 12장 (1) 애그리게이트란? 애그리게이트는 변경의 단위이다. 11장에서 프로그래밍했던 User나 Circle과 같은 객체가 바로 애그리게이트이다. 출처 :「도메인 주도 설계 철저 입문」 애그리게이트의 특징애그리게이트는 경계와 루트를 갖는다. 애그리게이트의 경계는 애그리게이트에 포함되는 대상을 결정하는 경계이고, 애그리게이트의 루트는 애그리게이트에 포함되는 특정 객체다. 외부에서 애그리게이트를 다루는 조작은 모두 루트를 거쳐야 한다. 변경은 애그리게이트 루트를 통해서만 - 예시 (1) UserUser 애그리게이트의 루트는 User 클래스이다. 따라서 사용자명 변경도 루트인 User에 요청하는 형태여야 한다.이를 위해서 `changeName`과 같은 메소드를 만들면 null 체크 등과 같은 유효성 검사를 할 수 있.. 도메인 규칙을 코드로 제대로 표현하는 법 - 「도메인 주도 설계 철저 입문」 11장 (4) 말과 코드를 일치 시키기"써클 정원은 30명이다"라는 도메인 규칙은 다음과 같이 표현하는 것이 바람직하다. 규칙에 나오는 "30"이라는 숫자를 코드에 그대로 사용하는 것이다. // 바람직한 예 : 말과 코드가 일치한다.if (member.size() >= 30) { throw new IllegalStateException("정원 초과");} 만약 다음과 같이 말과 코드가 불일치 하게 되면 여러가지 문제가 생긴다. if (member.size() > 29) { throw new IllegalStateException("정원 초과");} 1. `30`으로 코드 전역 검색을 했을 때 코드가 나오지 않음2. 누군가 말과 다른 코드를 보고 오류라고 생각해서 29를 30으로 고칠 우려가 있음 규칙을 도.. 테스트 커버리지 높이는 법 - 「도메인 주도 설계 철저 입문」 11장 (3) jacoco 플러그인 세팅`build.gradle` 파일에 다음과 같은 내용들을 추가한다. plugins { id 'jacoco'}tasks.named('test') { finalizedBy(jacocoTestReport)}jacoco { toolVersion = "0.8.12"}test { useJUnitPlatform() finalizedBy jacocoTestReport}jacocoTestReport { dependsOn test reports { xml.required = false csv.required = false html.outputLocation = layout.buildDirectory.dir('jacocoHtm.. 엔티티 중복 확인은 도메인 서비스인가 앱 서비스인가 - 「도메인 주도 설계 철저 입문」 11장 (3) 저자의 주장 : 엔티티 중복 확인은 도메인 서비스가 해야 한다. 책에서는 엔티티 중복 확인 서비스를 다음과 같이 도메인 서비스로 구현하였다. 저자가 이렇게 한 이유는 "이름을 기준으로 중복을 판단한다"와 같은 규칙이 도메인 지식이기 때문이다. 저자는 도메인 지식은 한 곳에 모여 있어야 한다고 주장한다. 도메인에 관한 지식이 도메인 서비스에 모두 모여 있으면 유지 보수 측면에서 도메인 서비스 클래스만 확인하면 되므로 효율적이라고 볼 수 있다. public class CircleService { private final CircleRepository circleRepository; public CircleService(CircleRepository circleRepository) { .. Entity Factory 패턴 - 「도메인 주도 설계 철저 입문」 11장 (2) 팩토리 패턴 1. 기본 생성자는 private기본 생성자를 private으로 선언한다. 이렇게 하는 이유는 객체 생성을 팩토리를 통해서만 하도록 통제하기 위해서이다. 이때 주의해야 할 점은 기본 생성자를 아예 만들지 않으면 자바 컴파일러가 자동으로 기본 생성자를 생성하여 누구나 기본 생성자를 통한 User 생성할 수 있게 된다는 것이다. 따라서 생성자를 반드시 만들고, private으로 설정하는 것이 바람직하다.package com.woojoovove.ddd11.user.domain;public class User { private final UserId id; private UserName name; private User(UserId id, UserName name) { .. DDD 프로젝트 폴더 구조 - 「도메인 주도 설계 철저 입문」 11장 (1) DDD와 3-Layered의 프로젝트 폴더 구조 비교3-Layered 프로젝트의 폴더 구조는 대개 위와 같다. 3-Layer에 해당하는 뷰(Controller), 모델(Model), 비즈니스로직(Service)로 폴더가 크게 나뉘어 있다. # 3-Layered 구조src/├── controller/ │ ├── UserController.java│ └── OrderController.java│├── service/ │ ├── UserService.java│ └── OrderService.java│├── repository/ │ ├── UserRepository.java│ └── OrderRepository.. DDD에서 도메인 서비스와 앱 서비스 차이점 비교 분석 도메인 서비스의 역할과 특징 및 예시도메인 서비스는 도메인 객체(값 객체/엔티티)에 미처 담지 못한 도메인 규칙을 표현하는 객체이다. 도메인 규칙의 예시로는 다음과 같은 것들이 있다. 특정 금융 상품의 이자 계산 로직특정한 조건을 만족해야만 승인이 되는 보험금 청구 승인 판단 로직 도메인 객체에 도메인 규칙을 담지 못하는 이유는 규칙이 복잡하여 어느 한 도메인 객체에 속하지 않기 때문일 것이다. 혹은 도메인 객체 자체에 대한 내용이라 내부에 담기 어색한 규칙(🔗)인 경우도 있다. 도메인 주도 설계에서 도메인 서비스는 다음과 같은 특징을 가지며 철저히 독립적이고 순수한 영역이어야 한다는 것을 기억해야 한다. 외부 시스템 의존성이 거의 없음트랜잭션 관리와도 관계가 없음 앱 서비스의 역할과 특징 및 예.. 데이터의 무결성 유지하기 - 「도메인 주도 설계 철저 입문」 10장 본 포스트 시리즈는 「도메인 주도 설계 철저 입문」책을 요약한 내용입니다. 이전 발행 글 보기 더보기2024.09.02 - [DDD/도메인 주도 설계 철저 입문] - 도메인 주도 설계란? - 「도메인 주도 설계 철저 입문」 1장2024.09.04 - [DDD/도메인 주도 설계 철저 입문] - 값 객체란? - 「도메인 주도 설계 철저 입문」 2장 (1)2024.09.05 - [DDD/도메인 주도 설계 철저 입문] - 값 객체의 장점 - 「도메인 주도 설계 철저 입문」 2장 (2)2024.09.09 - [DDD/도메인 주도 설계 철저 입문] - 도메인 엔티티란? - 「도메인 주도 설계 철저 입문」 3장 (1)2024.09.30 - [DDD/도메인 주도 설계 철저 입문] - 도메인 서비스란? - 「도메인 주.. 이전 1 2 3 다음