/////
Search
Duplicate
5️⃣

애그리거트 간 집합 연관

: 애그리거트 간 1-N과 M-N 연관은 자바에서 일반적으로 컬렉션을 이용해 구현되는데, 카테고리와 상품 간의 연관이 대표적이다.
: 카테고리 입장에서 한 카테고리에 한 개 이상의 상품이 속할 수 있으니 카테고리와 상품은 1-N 관계이다. 한 상품이 한 카테고리에만 속할 수 있다면 상품과 카테고리의 관계는 N-1이다.
: 애그리거트 간 1-N 관계는 Set과 같은 컬렉션을 이용해서 표현할 수 있다.
public class Category { private Set<Product> products; }
Java
복사
: 개념적으로 존재하는 애그리거트 간의 1-N 연관을 실제 구현에 반영하는 것이 요구사항을 충족하는 것과 상관이 없을 때도 있다. 특정 카테고리에 곳한 상품 목록을 보여줘야하는 요구사항을 생각해보자.
: 보통 목록 관련 요구사항은 한 번에 전체 상품을 보여주기 보다는 페이징을 이용해 제품을 나눠서 보여준다. 이 기능을 카테고리 입장에서 1-N 연관을 이용해 구현하면 다음과 같은 방식이 된다.
public class Category { private Set<Product> products; public List<Porduct> getProducts(int pages, int size) { List<Product> sortedProducts = sortById(products); return sortedProducts.subList((page-1) * size, page * size); } ...
Java
복사
: 이 코드를 실제 DBMS와 연동해 구현한다면 Category에 속한 모든 Product를 조회하게 된다, 이는 Product가 많을 경우, 성능 저하를 불러올 수 있다.
: 이 때문에 개념적으로 애그리거트 간에 1-N 연관이 있다하더라도 애그리거트 간의 1-N 연관을 실제 구현에 반영하지 않는다.
: 만약 이런 상황에서 카테고리에 속한 상품을 구현할 필요가 있다면 상품 입장에서 자신이 속한 카테고리를 N-1로 연관지어 구하면 된다. 이를 구현 모델에 반영하면 Product에 다음과 같이 Category로의 연관을 추가하고 그 연관을 이용해서 특정 Category에 속한 Product 목록을 구하면 된다.
public class Product { ... private CategoryId categoryId; ... }
Java
복사
: 카테고리에 속한 상품 목록을 제공하는 응용 서비스는 ProductRepository를 이용해서 categoryId가 지정한 카테고리 식별자인 Product 목록을 구한다.
: M-N 연관은 개념적으로 양쪽 애그리거트에 컬렉션으로 연관을 만든다. 상품이 여러 카테괼에 속할 수 있다고 가정하면 카테고리와 상품은 M-N 연관을 맺는다. 앞서 1-N 연관처럼 M-N 연관도 실제 요구사항을 고려하여 M-N 연관을 구현에 포함시킬지를 결정해야 한다.
: 보통 특정 카테고리에 속한 상품 목록을 보여줄 때 목록 화면에서 각 상품이 속한 모든 카테고리를 상품 정보에 표시하지는 않는다. 제품이 속한 모든 카테고리가 필요한 화면은 보통 제품의 상세 화면인데, 이러한 요구사항을 고려했을 때, 카테고리에서 상품으로의 집합 연관은 필요하지 않다. 다음과 같이 상품에서 카테고리로의 집합 연관만 존재하면 된다. 구현 모델에는!
: 즉 개념적으로는 상품과 카테고리의 양방향 M-N 연관이 존재하지만 실제 구현에서는 상품에서 카테고리로의 단방향 M-N 연관만 적용하면 되는 것이다.
: 일반적으로 상세 화면이나 목록같은 조회 기능은 조회 전용 모델을 이용해서 구현하는 것이 좋다.