도메인
- 해결하고자 하는 문제 영역
- 큰 도메인 아래 하위 도메인으로 나눌 수 있다.
- 온라인 서점은 주문, 결제, 배송, 혜택, 회원 등등의 하위 도메인으로 구성된다.
도메인 모델
- 특정 도메인을 개념적으로 표현한 것
- 주문을 예로하면
- 주문 번호와 지불할 총 금액이 있고
- 배송정보 변경 가능
- 주문 취소 가능
- 기타
Entity
Value
- 값만을 갖는다.
- 여러 필드 중에서 개념적으로 같은 것들을 묶은 것
- 필드가 하나라 하더라도, 의미를 명확하게 하기 위해 Value 타입으로 지정할 수 있다.
도메인 용어
- 도메인 용어를 잘 지정해서 사용하는 것이 매우 중요하다.
- 메소드에 set을 사용하는 것보다 도메인 용어를 이용하여 도메인 로직을 구현하는 것이 이해하기 쉬운 코드를 작성하는데 도움이 된다.
계층 구조 아키텍처
- 표현
- 사용자 요청을 받아 응용 계층에 전달하고, 응용 계층의 처리 결과를 받아온다.
- 응용
- 도메인
- 인프라스트럭처
Aggregate
- 여러 객체들 중에서 하나로 묶을 수 있는 단위
- 동일한 라이프사이클
- Transaction의 단위
- Aggregate 하나당 Repository 하나
도메인 서비스
- 여러 Aggregate가 합쳐져서 도메인 로직을 구현해야하는 경우, 어느 객체에서 로직을 구현해야할 지 분명하지 않다.
- 도메인 서비스를 도입하는 것을 생각해볼 수 있다.
Aggregate 트랜잭션 관리
- Pessimistic 잠금 (비관적/선점 잠금)
- Optimistic 잠금 (낙관적/비선점 잠금)
- Version을 이용하여 트랜잭션을 종료하기 전에 잠금
- 오프라인 선점 잠금
- 여러 트랜잭션에 걸쳐 동시 변경을 막는다.
- 잠금 정보를 저장하는 테이블을 이용
도메인 모델과 BOUNDED CONTEXT
- 같은 이름을 사용하더라도 도메인마다 갖는 의미가 다를 수 있다.
- ex) 주문 - 상품 / 배송 - 상품 등등 에서의 상품
- 역으로, 같은 것 처럼 보이지만 도메인에 따라 용어가 다른 경우
- 이러한 도메인 모델들은 하나의 CONTEXT에서 의미를 갖는다. 이를 BOUNDED CONTEXT라고 한다.
이벤트
- 상품 주문을 취소하면 환불이 되야한다를 구현한다. 결제 시스템의 경우 일반적으로 외부 시스템이다.
- 하나의 트랜잭션으로 처리 하려는데, 외부 서비스의 성능에 영향을 받는다.
- 애초에 Aggregate가 다르므로, 이벤트를 생성하고, 이후에 따로 처리하는 방식으로도 구현할 수 있다.
CQRS
- Command Query Responsibility Segregation
- 명령 (수정, 삭제 등등)과 조회를 위한 모델을 따로 구현하는 방법
아직 한번밖에 읽어보지 않았고, 세세하게 읽어보지 않았기 때문에 완전히 이해하진 못했다. 그래도 4챕터, 5챕터의 리포지토리 구현/조회(JPA)를 제외하고는 전체적으로 간략하게나마 이해할 수 있었다. 또한 이전에 Spring Data JDBC나 JdbcTemplate를 사용하면서 피상적으로만 알던 Aggregate 개념들을 조금은 이해할 수 있던 것 같다.