일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- TDD
- DDD
- template
- 아키텍처
- 이펙티브코틀린
- 스터디
- 헥사고날아키텍처
- Kotlin
- GrokkingFunctionalProgramming
- 코틀린
- 테스트
- Thymeleaf
- 만들면서배우는클린아키텍처
- Java
- 객체지향의사실과오해
- 함수형프로그래밍
- Boot Legacy 차이점
- Spring
- 책스터디
- 개발방법론
- 클린아키텍처
- FP
- 유지보수
- 테스트주도개발
- web
- 조영호
- 도메인 주도 개발 시작하기
- 개발서적
- 계층형아키텍처
- 추상화 설계
- Today
- Total
목록아키텍처 (10)
김동형수 개발기
10장 이벤트 10.1 쇼핑몰에서 구매를 취소하면 환불을 처리해야 한다. 도메인 기능에서 도메인 서비스를 실행하게 된다. 응용서비스에서 환불 기능을 실행할 수도 있다. 결제 시스템이 제공하는 환불서비스를 호출한다. 두 가지 문제가 발생할 수 있는데, 첫 번째는 외부 서비스가 정상이 아닐 경우 트랜잭션 처리 두 번째 문제는 성능에 대한 것. 환불을 처리하는 외부 시스템의 응답 시간이 길어지면 그 만큼 대기 시간도 길어진다. 외부 서비스 성능에 직접적인 영향을 받게 된다. 두 가지 문제 외에 도메인 객체에 서비스를 전달하면 추가로 설계상 문제가 나타날 수 있다. 로직이 섞이는 문제 주문 도메인 객체의 코드를 결제 도메인 때문에 변경할지도 모르는 상황은 좋아 보이지 않는다. 지금까지 언급한 문제가 발생하는 이..
9장 도메인 모델과 바운디드 컨텍스트 9.1 처음 도메인 모델을 만들 때 빠지기 쉬운 함정이 도메인을 완벽하게 표현하는 단일 모델을 만드는 시도를 하는 것이다. 하위 도메인을 모두 표현하려고 시도하면 오히려 모든 하위 도메인에 맞지 않는 모델을 만들게 된다. 논리적으로 같은 존재처럼 보이지만 하위 도메인에 따라 다른 용어를 사용하는 경우도 있다. 하위 도메인마다 사용하는 용어가 다르기 때문에 올바른 도메인 모델을 개발하려면 하위 도메인마다 모델을 만들어야 한다. 이렇게 구분되는 경계를 갖는 컨텍스트를 DDD에서 바운디드 컨텍스트라고 부른다. 9.2 바운디드 컨텍스트는 모델의 경계를 결정하며 한 개의 바운디드 컨텍스트는 논리적으로 한 개의 모델을 갖는다. 이상적으로 하위 도메인과 바운디드 컨텍스트가 일대일..
8장 애그리거트 트랜잭션 관리 애그리거트와 트랜잭션 한 애그리거트를 두 사용자가 거의 동시에 변경할 때 트랜잭션이 필요하다.한 애그리거트를 두 사용자가 거의 동시에 변경할 때 트랜잭션이 필요하다. 애그리거트에 대해 사용할 수 있는 대표적인 트랜잭션 처리 방식에는 선점(Pressimistic) 잠금과 비선점(Optimistic) 잠금의 두 가지 방식이 있다. 선점 잠금 선점 잠금은 먼저 애그리거트를 구한 스레드가 애그리거트 사용이 끝날 때까지 다른 스레드가 해당 애그리거트를 수정하는 것을 막는 방식이다. 선점 잠금은 보통 DBMS가 제공하는 행 단위 잠금을 사용해서 구현한다. 오라클을 비롯한 다수 DBMS가 for update와 같은 쿼리르 사용해서 특정 레코드에 한 사용자만 접근할 수 있는 잠금 장치를 ..
7장 도메인 서비스 7.1 한 애그리거트로 기능을 구현할 수 없을 때가 있다. 한 애그리거트에 넣기 애매한 도메인 기능을 억지로 특정 애그리거트에 구현하면 안 된다. 책임 범위를 넘어서는 기능을 구현하면 외부에 대한 의존이 높아지고 코드를 복잡하게 만든다. 애그리거트의 범위를 넘어서는 도메인 개넘이 애그리거트에 숨어들어 명시적으로 드러나지 않게 된다. 가장 쉬운 방법은 도메인 기능을 별도 서비스로 구현하는 것 7.2도메인 서비스계산 로직 : 여러 애그리거트가 필요한 계산 로직이나, 한 애그리거트에 넣기 다소 복잡한 계산 로직외부 시스템 연동이 필요한 도메인 로직 : 구현하기 위해 타 시스템을 사용해야 하는 도메인 로직애매한 도메인 개넘을 구현하려면 도메인 서비스를 이용해서 도메인 개념을 명시적으로 드러낸..
6장 응용 서비스와 표현 영역 6.1 응용 영역과 표현 영역이 사용자와 도메인을 연결해 주는 매개체 역할 표현 영역은 사용자의 요청을 해석 URL, 요청 파라미터, 쿠키, 헤더 등을 이용해서 판별 기능을 제공하는 응용서비스를 실행 실제 사용자가 원하는 기능을 제공하는 것은 응용 영역에 위치한 서비스다. 표현 영역은 응용 서비스가 요구하는 방식으로 변환 응용 서비스는 표현 영역에 의존하지 않는다. 단지 필요한 입력 값을 받고 결과만 리턴 6.2 응용서비스는 리포지터리에서 도메인 객체를 가져와 사용 응용 서비스는 도메인 영역과 표현 영역을 연결해 주는 창구 응용 서비스가 복잡하다면 도메인 로직의 일부를 구현하고 있을 가능성이 높다. 응용 서비스는 도메인의 상태 변경을 트랜잭션으로 처리 DB에 반영하는 도중 ..
5장 스프링 데이터 JPA를 이용한 조회 기능 5.1 CQRS는 명령모델과 조회모델을 분리하는 패턴 5.2 검색 조건이 고정되어 있고 단순하면 특정 조건으로 조회하는 기능을 만들면 된다. 다양한 검색조건을 조합해야할 때 사용할 수 있는 것이 스펙이다. 검사 대상 객체가 조건을 충족하면 true를 리턴하고 그렇지 않으면 false JPA를 이용한 스펙구현에 대해 알아볼 것 5.3 JPA 크리테리아 API에서 조건을 표현하는 Predicate 스펙 구현 클래스를 개별적으로 만들지 않고 별도 클래스에 스펙 생성 기능을 모아도 된다. 스펙 인터페이스는 함수영 인터페이스이다. 5.4 스펙을 충족하는 엔티티를 검색하고 싶다면 findAll() 메서드를 사용하면 된다. 스펙 구현체를 사용하면 특정 조건을 충족하는 엔..
4장 리포지터리와 모델 구현 JPA를 이용한 리포지터리 구현 데이터 보관소로 RDBMS를 사용할 때, 객체 기반의 도메인 모델과 관계형 데이터 모델간의 매핑을 처리하는 기술로 ORM 자바의 ORM 표준인 JPA를 사용한다. 리포지터리 인터페이스는 에그리거트와 같이 도메인 영영에 속하고 리포지터리를 구현한 클래스는 인프라스트럭처 영역에 속한다. 리포지토리 구현 클래스를 dmoain.impl 과 같은 패키지에 위치시킬 수 있는데 이는 좋은 원칙을 따르는 것은 아니다. 리포지토리 구현 클래스를 인프라스트럭처 영역에 위치 시켜서 인프라스트럭처에 대한 의존을 낮춰야 한다. 리포지터리 구현 객체는 스프링 데이터 JPA가 알아서 만들어준다. JPA를 사용하면 저장소에 반영하는 메서드를 추가할 필요는 없다. 트랜젝션 ..
3장 애그리거트 애그리거트 상위 수준에서 모델을 정리하면 도메인 모델의 복잡한 관계를 이해하는 데 도움이 된다. 도메인 객체 모델이 복잡해지면 도메인 간의 관계를 파악하기 어려워진다. 주요 도메인 요소 간의 관계를 파악하기 어렵다는 것은 코드를 변경하고 확장하는 것이 어려워진다는 것을 의미한다. 꼼수를 부리면 장기적으로 코드를 더 수정하기 어렵게 만든다. 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만드는 방법이 애그리거트다. 애그리거트는 모델을 이해하는 데 도움을 줄 뿐만 아니라 일관성을 관리하는 기준 애그리거트는 복잡한 도메인을 단순한 구조로 만들어준다. 애그리거트는 관련된 모델을 하나로 모았기 때문에 한 애그리거트에 속한 객체는 유사하거나 동일한 라이프 사이클을 갖는다. 한 애그리거트에 속한 객체..