[DDD] 응용 서비스와 표현 영역 -1
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.200~201)를 읽고 정리한 글입니다. 표현 영역과 응용 영역도메인이 제 기능을 하려면 사용자와 도메인을 연결해 주는 매개체가 필요하다. 아키텍처에서 응용 영역과 표현 영역이 사용자 도메인을 연결해 주는 매개체 역할을 한다. 표현 영역은 사용자의 요청을 해석한다. 사용자가 웹 브라우저에서 폼에 ID와 암호를 입력한 뒤 전송 버튼을 클릭하면 요청 파라미터를 포함한 HTTP 요청을 표현 영역에 전달한다. 요청받은 표현 영역은 URL, 요청 파라미터, 쿠키, 헤더 등을 이용해서 사용자가 실행하고 싶은 기능을 판별하고 그 기능을 제공하는 응용 서비스를 실행한다. 실제 사용자가 원하는 기능을 제공하는 것은 응용 영역에 위치한 서비스이다. 사용자가 ..
[DDD] 스프링 데이터 JPA를 이용한 조회 기능 -3
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.183~198)를 읽고 정리한 글입니다. 스펙 조합스펙 인터페이스는 기본 구현을 제공하는 default 메서드인 and()와 or()를 통해 스펙을 조합할 수 있다. // 스펙 조건마다 개별 변수 선언Specification spec1 = OrderSummarySpecs.ordererId("user1");Specification spec2 = OrderSummarySpecs.orderDateBetween( LocalDateTime.of(2022, 1, 1, 0, 0, 0), LocalDateTime.of(2022, 1, 2, 0, 0, 0)); Specification spec3 = spec1.and(spec2); ..
[DDD] 스프링 데이터 JPA를 이용한 조회 기능 -2
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.178~182)를 읽고 정리한 글입니다. 스프링 데이터 JPA를 이용한 스펙 구현Spring Data JPA는 검색 조건을 표현하기 위한 인터페이스인 Specification을 제공하며 다음과 같이 정의되어 있다.public interface Specification extends Serializable { @Nullable Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb);} 스펙 인터페이스에서 제네릭 타입 파라미터 는 JPA 엔티티 타입을 의미한다. toPredicat..
[DDD] 리포지터리와 모델 구현 -8 / 스프링 데이터 JPA를 이용한 조회 기능 - 1
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.170~177)를 읽고 정리한 글입니다. 도메인 구현과 DIP아래 리포지토리는 DIP 원칙을 어기고 있다. 먼저 엔티티는 구현 기술인 JPA에 특화된 @Entity, @Table, @Id, Column 등의 애너테이션을 사용하고 있다. DIP에 따르면 @Entity, @Table은 구현 기술에 속하므로 Article과 같은 도메인 모델은 구현 기술인 JPA에 의존하면 안 된다.@Entity@Table(name = "article")@SecondaryTable( name = "article_content", pkJoinColumns = @PrimaryKeyJoinColumn(name = "id"))public class Article{ ..
[DDD] 리포지터리와 모델 구현 -7
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.166~169)를 읽고 정리한 글입니다. 애그리거트의 영속성 전파애그리거트가 완전한 상태여야 한다는 것은 애그리거트 루트를 조회할 때뿐만 아니라 저장하고 삭제할 때도 하나로 처리해야 함을 의미한다. @Embeddable 매핑 타입은 함께 저장되고 삭제되므로 cascade 속성을 추가로 설정하지 않아도 된다. 반면에 애그리거트에 속한 @Entity 타입에 대한 매핑은 cascade 속성을 사용해서 저장과 삭제 시에 함께 처리되도록 설정해야 한다.@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true}@JoinColumn(name = "product..
[DDD] 리포지터리와 모델 구현 -6
·
📚 개발자의 서재/도메인 주도 개발 시작하기
해당 포스팅은 최범균 작가님의 도메인 주도 개발 시작하기 (P.160~165)를 읽고 정리한 글입니다. 매핑 구현ID 참조와 조인 테이블을 이용한 단방향 M-N 매핑애그리거트 간 집합 연관은 성능 상의 이유(편한 탐색 오용, 성능에 대한 고민, 확장의 어려움)로 피해야 한다. 하지만 요구사항을 구현하는 데 집합 연관을 사용하는 것이 유리하다면 ID 참조를 이용한 단방향 집합 연관을 적용해 볼 수 있다.@Entity@Table(name = "product")public class Product { @EmbeddedId private ProductId id; @ElementCollection @CollectionTable(name = "product_category", joi..
[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 관계가 존재한다고 하더라도, 이를 그대로 구현에 반영하는 것이 항상 요구사항을 충족시키는 것은 아..