본문 바로가기

JAVA/DDD

(9)
애그리게이트 애그리게이트란? 객체지향 프로그래밍에서는 여러개의 객체가 모여 한 가지 의미를 갖는 하나의 객체가 된다. 이렇게 객체가 모여 이룬 객체는 어떤 불변조건(어떤 처리를 수행하는 동안 참을 유지해야 하는)을 유지해야 한다. 이 불변 조건은 언제나 유지돼야 하지만, 객체가 가진 데이터를 변경하는 조작을 무제한 허용하면 이를 유지하기 어렵다. 따라서 객체를 다루는데도 질서가 필요하다. 애그리게이트는 경계와 루트를 갖는다. 애그리게이트의 경게는 애그리게이트에 포함되는 대상을 결정하는 경계다. 그리고 루트는 애그리게이트에 포함되는 특정한 객체이다. 외부에서 애그리게이트를 다루는 조작은 모두 루트를 거쳐야한다. 애그리게이트에 포함되는 객체를 외부에 노출하지 않음으로서 불변 조건을 유지할수 있다. User | | V V..
도메인 주도 설계(소개) 도메인 주도 설계 도메인주도설계에서의 모델의 유용성1.모델과 핵심 설계는 서로 영향을 주모 구체화된다.2.모델은 모든 팀 구성원이 사용하는 언어의 중추다.3.모델은 지식의 정수만을 뽑아낸 것이다. 소프트웨어의 본질은 해당 소프트웨어의 사용자를 위해 도메인에 관련된 문제를 해결하는 능력에 있다.그밖의 매우 중요하다 할수 있는 기능도 모두 이러한 기본적인 목적을 뒷받침하는데 불과하다.도메인이 복잡하면 이 같은 문제 해결은 유능하고 숙련된 사람의 집중적인 노력이 필요한 어려운 일이 된다.개발자는 업무 지식을 증진하기 위해 도메인 연구에 물두해야 한다. 그뿐만 아니라 모델링 기법을 연마해서 도메인 설계에 통달해야 한다. 예제선박화물의 운송 예약을위한 애플리케이션 Voyage(운항) ------ Cargo(화물)..
리포지터리와 모델구현(JPA 중심) 리포지터리와 모델구현(JPA 중심) 애그리거트를 어떤 저장소에 저장하느냐에 따라 리포지터리를 구현하는 방법이 다르기 때문에 모든 구현 기술을 대해 알아볼 수는 없다.도메인 모델과 리포지터리를 구현할 때 선호하는 기술을 꼽자면 JPA를 들 수 있다.데이터 보관소로 RDBMS를 사용할 때 객체 기반의 도메인 모델과 관계형 데이터 모델 간의 매핑을 처리하는 기술로 ORM 만한 것이 없다.다양한 ORM기술이 존재하지만, 자바의 ORM 표준인 JPA를 이용해서 리포지터리와 애그리거트를 구현하는 방법을 살펴보자 모듈위치리포지터리 인터페이스는 애그리거트와 같이 도메인 영역에 속하고, 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속한다. domain InfraModel ------> ModelRepository ..
트랜잭션 범위 트랜잭션 범위트랜잭션의 범위는 작을수록 좋다.DB 테이블 기준으로 한 트랜잭션이 한 개의 데이터베이스를 수정하는 것과 세 개의 테이블을 수정하는 것은 성능에서 차이가 발생한다. 한 트랜잭션에는 한 개의 애그리거트만 수정해야한다.애그리거트에서 다른 애그리거트를 변경하지 않는다는 뜻예) 배송지 정보를 변경하면서 동시에 배송지 정보를 회원의 주소로 설정하는 기능 public class Order {private Orderer orderer; public void shipTo(ShippingInfo newShippingInfo, boolean useNewShippingAddrAsMemberAddr) {verifyNotYetShipped();setShippingInfo(newShippingInfo);if(useN..
Aggregate 애그리거트 Aggregate 애그리거트 애그리거트 루트-총 금액인 totalAmounts를 갖고 있는 Order 엔티티-개별 구매 상품의 개수인 quantity와 금액인 price를 갖고 있는 OrderLine 밸류 구매할 상품의 개수를 변경하려면 한 OrderLine의 qunantity를 변경하고 totalAmount도 변경해야된다. 애그리거트는 여러 객체로 구성되기 때문에 한 객체만 상태가 정상이어서는 안된다.도메인 규칙을 지키려면 애그리거트에 속한 모든 객체가 정상 상태를 가져야한다.주문 애그리거트의 경우 OrderLine을 변경하면 Order의 totalAmounts도 다시 계산해서 총 금액이 맞아야한다. 애그리거트에 속한 모든 객체가 일관된 상태를 유지하려면 애그리거트 전체를 관리 할 주체가 필요한데, 이..
아키텍처 표현-응용-도메인-인프라스트럭처표현 UI영역은 사용자의 요청을 받아 응용 영역에 전달하고 응용 영역의 처리 결과를 다시 사용자에게 보여주는 역할을 한다.웹 애플리케이션을 개발할 때 많이 사용하는 스프링 MVC프레임워크가 표현 영역을 위한 기술에 해당한다.웹 애플리케이션에서 표현 영역의 사용자는 웹 브라우저를 사용하는 사람일 수도 있고, REST API를 호출하는 외부 시스템일 수도 있다. 웹브라우저 -> 표현(객체변환) -> 응용(서비스)웹브라우저
엔티티와 밸류 엔티티와 밸류도출한 모델은 크게 엔티티(Entity)와 밸류(Value)로 구분한다. 엔티티와 밸류를 제대로 구분해야 도메인을 올바르게 설계하고 구현할 수 있다.엔티티엔티티의 가장 큰 특징은 식별자를 갖는다.식별자는 엔티티의 객체마다 고유해서 각 엔티티는 서로 다른 식별자를 갖는다. 예)주문 도메인에서 각 주문은 주문번호를 갖는데 이 주문번호는 각 주문마다 서로 다르다.주문번호가 주문의 식별자가 된다.주문 도메인 모델에서 주문에 해당하는 클래스가 Order이므로 Order가 엔티티가 되며 주문번호를 속성으로 갖게된다.주문에서 배송지 주소가 바뀌거나 상태가 바뀌더라도 주문번호가 바뀌지 않는 것 처럼 엔티티의 식별자는 바뀌지 않는다.엔티티를 생성하고 엔티티의 속성을 바꾸고 엔티티를 삭제할 때가지 식별자는 유..
도메인 모델 도출 도메인 모델 도출기획서, 유스케이스, 사용자 스토리와 같은 요구사항과 관련자의 대화를 통해 도메인을 이해하고 이를 바탕으로 도메인 모델 초안을 만들어야 비로소 코드를 작성할 수 있다. 화이트보드, 종이와 연필, 모델링 툴 중 무엇을 선택하든지 간에 구현을 시작하려면 도메인에 대한 초기 모델이 필요하다. 도메인을 모델링 할때 기본이 되는 작업은 모델을 구성하는 핵심구성요소, 규칙, 기능을 찾는것이다. -최소 한종류 이상의 상품을 주문해야한다. -한 상품을 한개 이상 주문할 수 있다. -총 주문 금액은 각 상품의 구매 가격 합을 모두 더한 금액이다. -각 상품의 구매 가격 합은 상품가격에 구매 개수를 곱한 값이다. -주문할 때 배송지 정보를 반드시 지정해야한다. -배송지 정보는 받는사람이름, 전화번호, 주소..