SlideShare a Scribd company logo
1 of 39
도메인 주도 설계
Eric Evans의 책에서 처음 소개된 설계법
복잡한 도메인을 해결하는 목적의
소프트웨어를 우선순위로 해결해나가는 방법
도메인 주도 설계
Domain-Driven Design
도메인 주도 설계 프로세스
Domain-Driven Design Process
도메인 분석
Bounded
Context
엔터티, 집합체,
서비스 등 정의
계층 설계
도메인 모델
Bounded
Context
엔터티
사용자
인터페이스
유비쿼터스
언어
Context
map
값 객체
Value Object
응용
프로그램
Shared
Kernel
집합체
도메인
계층
기타
서비스
인프라
기타
도메인의 구성요소를 개념적으로 표현한 것
SW 전문가와 도메인 전문가가 만드는 것
도메인에 대한 이해가 필수!
어떤 특정한 다이어그램이 아니라 다이어그램이 전달하고자 하는 아이디어
내적 일관성이 없는 모델은 아무런 의미가 없다
도메인 모델
Domain Model
도메인 모델
Domain Model
예시: 영화 예매 시스템
Reservation 영화 예매 정보
Movie 영화 정보
Screening 상영 정보
AudienceName 관객이름
ReservationItem 예매 상품 정보
영화 예매 정보는 영화 정보ID, 상영 정보, 관객이름, 예매상품
정보를 갖는다
도메인 모델
Domain Model
Reservation Model
(이거보다 훨씬 풍성해져야 한다)
Reservation
ID
MovieID
ScreeningID
AudienceName
ReservationItems
빌딩 블록
엔터티
Entity
소프트웨어가
여러 과정을 거치는 동안에도
동일한 값을 유지하는 식별자를
지닌 유형의 객체
빌딩 블록
Building Block
값 객체
Value object
개념적 식별성이 없는,
어떤 특징을 묘사하는 객체
한번 만들어 지면
바뀌지 않는 객체
집합체 Aggregate
생명주기를 공유하는 데이터 집합
일관성을 유지해야 될 객체들을
묶어 놓은 것
빌딩 블록
Building Block
Root Entity
접근 범위에 있는
가장 상위 Entity
Aggregate은 Root Entity를 통해서만 외부에서 접근 할 수 있다
빌딩 블록
Building Block
집합체의 중요성
연관 관계를 줄이면서 복잡도가 감소한다
많은 도메인 모델을
간단하고 이해 가능한 수준으로
만들어 줄 수 있다
빌딩 블록
Building Block
Movie Aggregate
<<Entity>>
(Root)
Movie
Id: Guid
Title: string
Screenings : Screening[]
<<Entity>>
Screening
Id: Guid
TheaterId: Guid
Seats: Seat[]
ScreeningTime: DateTime
DefaultFee: Decimal
ChildrenFee: Decimal
<<Value Object>>
Seat
Row: int
Column: int
IsReserved: bool
빌딩 블록
Building Block
Reservation Aggregate
<<Entity>>
(Root)
Reservation
Id: Guid
MovieId: Guid
ScreeningId: Guid
AudienceName: string
Items : Array<ReservationItem>
<<Value Object>>
ReservationItem
…
이벤트 소싱
Capture all changes to an application
state as sequence of events.
- Martin Fowler
이벤트 소싱
Event Sourcing
Event sourcing is all about the
storing of facts.
- Greg Young
전통적 저장 방식
Traditional Store
저장소
Cart_id User_id
1 3
2 5
…
Cart_id Item_id Count
1 3 1
1 2 1
1 10 1
<Cart> <CartItem>
이벤트 소싱
Event Sourcing
이벤트 저장소
이벤트
CartCreated
ItemsAdded
ItemsDeleted
CartOrdered
……
이벤트 소싱
Event Sourcing
이벤트 구성
Key Value
ObjectId EventType
Version Serialized PayLoad
이벤트 소싱
Event Sourcing
이벤트 저장소 구현 예시
ReservationId Version EventType PayLoad
ac98ds0 2 ItemsAdded {“Items_Id” : “cflsk” … }
ld035bp5 2 ItemsAdded {“Items_Id” : “csldk” … }
ac98ds0 3 ItemsDeleted {“Items_Id” : “cflsk” … }
이벤트 소싱
Event Sourcing
𝑆𝑡𝑎𝑡𝑒 𝑛 = ෍
𝑖=1
𝑛
𝐸𝑣𝑒𝑛𝑡𝑖
이벤트 소싱
Event Sourcing
어딘가 낯 익은 데..?
“집합체”와 “이벤트 소싱”
집합체와 이벤트 소싱
Aggregate using Event Sourcing
Reservation
Raise
Event
Commands 유효성
검사
Valid
예외
Invalid
Event
Handler
State
Event
Store
Events
Events
<< Save >>
<< Restore >>
집합체와 이벤트 소싱
Aggregate using Event Sourcing
Reservation
Raise
Event
Commands 유효성
검사
Valid
예외
Invalid
Event
Handler
State
Event
Store
Events
Events
<< Save >>
<< Restore >>
public void Cancel(DateTime now)
{
AssertCanCancel(now);
RaiseEvent(new ReservationCanceled());
}
private void AssertCanCancel(DateTime now)
{
if (CanCancel(now))
{
string message = "Cannot cancel because of cancel time limits over";
throw new InvariantException(message, now);
}
}
private bool CanCancel(DateTime now)
=> now > _movieTime.AddMinutes(20);
집합체와 이벤트 소싱
Aggregate using Event Sourcing
Reservation
Raise
Event
Commands 유효성
검사
Valid
예외
Invalid
Event
Handler
State
Event
Store
Events
Events
<< Save >>
<< Restore >>
private void RaiseEvent(DomainEvent domainEvent)
{
EnqueueEvent(domainEvent);
HandleEvent(domainEvent);
}
private void EnqueueEvent(DomainEvent domainEvent)
{
_pendingEvents.Add(domainEvent);
}
private void HandleEvent(DomainEvent domainEvent)
{
Func<object> handler = FindEventHandler(domainEvent.GetType());
handler.Invoke(domainEvent);
}
private void ReservationCanceledEventHandler(ReservationCanceled reservationCanceled)
{
_status = Status.Canceled;
}
집합체와 이벤트 소싱
Aggregate using Event Sourcing
Reservation
Raise
Event
Commands 유효성
검사
Valid
예외
Invalid
Event
Handler
State
Event
Store
Events
Events
<< Save >>
<< Restore >>
public static Reservation Restore(IEnumerable<DomainEvent> pastEvents)
{
var reservation = new Reservation();
foreach (DomainEvent domainEvent in pastEvents)
{
reservation.HandleEvent(domainEvent);
}
return reservation;
}
private void HandleEvent(DomainEvent domainEvent)
{
Func<object> handler = FindEventHandler(domainEvent.GetType());
handler.Invoke(domainEvent);
}
private void ReservationCanceledEventHandler(ReservationCanceled reservationCanceled)
{
_status = Status.Canceled;
}
이벤트 소싱, “그리고 더 ….”
객체 관계형 임피던스 불일치
The object-relational impedance mismatch is
a set of conceptual and technical difficulties
that are often encountered
when a relational database management system (RDBMS) is being served
by an application program (or multiple application programs)
written in an object-oriented programming language or style,
particularly because objects or class definitions
must be mapped to database tables defined by a relational schema.
이벤트는 관계가 없는 단순한 구성을 가진다
이벤트 소싱, 그리고 더 …
Event Sourcing, And more …
𝑆𝑡𝑎𝑡𝑒 𝑛 = ෍
𝑖=1
𝑛
𝐸𝑣𝑒𝑛𝑡𝑖
이벤트 소싱, 그리고 더 …
Event Sourcing, And more …
𝑆𝑡𝑎𝑡𝑒 𝑛 = 𝑆𝑡𝑎𝑡𝑒 𝑚 + ෍
𝑖=𝑚+1
𝑛
𝐸𝑣𝑒𝑛𝑡𝑖
1 ≤ 𝑚 ≤ 𝑛
이벤트 소싱, 그리고 더 …
Event Sourcing, And more …
롤링 스냅샷
이벤트 소싱, 그리고 더 …
Event Sourcing, And more …
UI
데이터베이스
모델
전통적 방식
이벤트 소싱, 그리고 더 …
Event Sourcing, And more …
UI
조회모델
데이터 베이스
명령모델
데이터 베이스
조회모델
명령모델
CQRSCommand Query Responsibility Segregation
이벤트 소싱, 그리고 더 …
Event Sourcing, And more …
내가 겪은 Domain-Driven-Design
장점
도메인 모델에 대한 이해
단점
가파른 학습 곡선
작업의 우선 순위 결정
이벤트 소싱, 그리고 더 …
Event Sourcing, And more …
내가 겪은 Event-Sourcing
장점
신뢰 가능한 시스템 기록
단점
가파른 학습 곡선
마이그레이션비즈니스의 추적 기록 요구
CQRS 필수도메인 모델의 풍부한 코드 표현
DDD와 이벤트소싱

More Related Content

What's hot

대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션 - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션  - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션  - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션 - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021Amazon Web Services Korea
 
Fargate 를 이용한 ECS with VPC 1부
Fargate 를 이용한 ECS with VPC 1부Fargate 를 이용한 ECS with VPC 1부
Fargate 를 이용한 ECS with VPC 1부Hyun-Mook Choi
 
객체지향적인 도메인 레이어 구축하기
객체지향적인 도메인 레이어 구축하기객체지향적인 도메인 레이어 구축하기
객체지향적인 도메인 레이어 구축하기Young-Ho Cho
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정Arawn Park
 
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링Amazon Web Services Korea
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)Seung-June Lee
 
Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기경원 이
 
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20Amazon Web Services Korea
 
스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴Sanghyuk Jung
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기beom kyun choi
 
Domain Driven Design com Python
Domain Driven Design com PythonDomain Driven Design com Python
Domain Driven Design com PythonFrederico Cabral
 
mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교Woo Yeong Choi
 
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017Amazon Web Services Korea
 
[216]네이버 검색 사용자를 만족시켜라! 의도파악과 의미검색
[216]네이버 검색 사용자를 만족시켜라!   의도파악과 의미검색[216]네이버 검색 사용자를 만족시켜라!   의도파악과 의미검색
[216]네이버 검색 사용자를 만족시켜라! 의도파악과 의미검색NAVER D2
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유beom kyun choi
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술NAVER D2
 
Tutorial on Ontology editor: Protege
Tutorial on Ontology editor: Protege Tutorial on Ontology editor: Protege
Tutorial on Ontology editor: Protege Biswanath Dutta
 
AWS Fargate와 Amazon ECS를 사용한 CI/CD 베스트 프랙티스 - 유재석, AWS 솔루션즈 아키텍트 :: AWS Build...
AWS Fargate와 Amazon ECS를 사용한 CI/CD 베스트 프랙티스 - 유재석, AWS 솔루션즈 아키텍트 :: AWS Build...AWS Fargate와 Amazon ECS를 사용한 CI/CD 베스트 프랙티스 - 유재석, AWS 솔루션즈 아키텍트 :: AWS Build...
AWS Fargate와 Amazon ECS를 사용한 CI/CD 베스트 프랙티스 - 유재석, AWS 솔루션즈 아키텍트 :: AWS Build...Amazon Web Services Korea
 
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다KWON JUNHYEOK
 

What's hot (20)

대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션 - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션  - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션  - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
대용량 트래픽을 처리하는 최적의 서버리스 애플리케이션 - 안효빈, 구성완 AWS 솔루션즈 아키텍트 :: AWS Summit Seoul 2021
 
Fargate 를 이용한 ECS with VPC 1부
Fargate 를 이용한 ECS with VPC 1부Fargate 를 이용한 ECS with VPC 1부
Fargate 를 이용한 ECS with VPC 1부
 
Rest in flask
Rest in flaskRest in flask
Rest in flask
 
객체지향적인 도메인 레이어 구축하기
객체지향적인 도메인 레이어 구축하기객체지향적인 도메인 레이어 구축하기
객체지향적인 도메인 레이어 구축하기
 
이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정이벤트 기반 분산 시스템을 향한 여정
이벤트 기반 분산 시스템을 향한 여정
 
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
Amazon OpenSearch Deep dive - 내부구조, 성능최적화 그리고 스케일링
 
객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)객체지향 개념 (쫌 아는체 하기)
객체지향 개념 (쫌 아는체 하기)
 
Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기Jpa 잘 (하는 척) 하기
Jpa 잘 (하는 척) 하기
 
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 :: 김필중 :: AWS Summit Seoul 20
 
스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴
 
DDD로 복잡함 다루기
DDD로 복잡함 다루기DDD로 복잡함 다루기
DDD로 복잡함 다루기
 
Domain Driven Design com Python
Domain Driven Design com PythonDomain Driven Design com Python
Domain Driven Design com Python
 
mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교mongodb와 mysql의 CRUD 연산의 성능 비교
mongodb와 mysql의 CRUD 연산의 성능 비교
 
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
마이크로서비스를 위한 AWS 아키텍처 패턴 및 모범 사례 - AWS Summit Seoul 2017
 
[216]네이버 검색 사용자를 만족시켜라! 의도파악과 의미검색
[216]네이버 검색 사용자를 만족시켜라!   의도파악과 의미검색[216]네이버 검색 사용자를 만족시켜라!   의도파악과 의미검색
[216]네이버 검색 사용자를 만족시켜라! 의도파악과 의미검색
 
Event source 학습 내용 공유
Event source 학습 내용 공유Event source 학습 내용 공유
Event source 학습 내용 공유
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술
 
Tutorial on Ontology editor: Protege
Tutorial on Ontology editor: Protege Tutorial on Ontology editor: Protege
Tutorial on Ontology editor: Protege
 
AWS Fargate와 Amazon ECS를 사용한 CI/CD 베스트 프랙티스 - 유재석, AWS 솔루션즈 아키텍트 :: AWS Build...
AWS Fargate와 Amazon ECS를 사용한 CI/CD 베스트 프랙티스 - 유재석, AWS 솔루션즈 아키텍트 :: AWS Build...AWS Fargate와 Amazon ECS를 사용한 CI/CD 베스트 프랙티스 - 유재석, AWS 솔루션즈 아키텍트 :: AWS Build...
AWS Fargate와 Amazon ECS를 사용한 CI/CD 베스트 프랙티스 - 유재석, AWS 솔루션즈 아키텍트 :: AWS Build...
 
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
[Devil's camp 2019] 혹시 Elixir 아십니까? 정.말.갓.언.어.입.니.다
 

Similar to DDD와 이벤트소싱

Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13hungrok
 
Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄Suhyeon Jo
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019min woog kim
 
광고 데이터 분석 제약을 없애기 위한 클라우드 기술 사례 - 윤석찬 (AWS 테크에반젤리스트) :: ADStars 2017
광고 데이터 분석 제약을 없애기 위한 클라우드 기술 사례 - 윤석찬 (AWS 테크에반젤리스트) :: ADStars 2017광고 데이터 분석 제약을 없애기 위한 클라우드 기술 사례 - 윤석찬 (AWS 테크에반젤리스트) :: ADStars 2017
광고 데이터 분석 제약을 없애기 위한 클라우드 기술 사례 - 윤석찬 (AWS 테크에반젤리스트) :: ADStars 2017Amazon Web Services Korea
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementationuEngine Solutions
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용중선 곽
 
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)Sang Don Kim
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementationuEngine Solutions
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기Jeado Ko
 
20150912 windows 10 앱 tips tricks
20150912 windows 10 앱 tips  tricks20150912 windows 10 앱 tips  tricks
20150912 windows 10 앱 tips tricks영욱 김
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트병한 유
 
AWS를 활용한 디지털 자산 관리/미디어 분석 시스템 구축 :: 김기완 ::AWS Summit Seoul 2016
AWS를 활용한 디지털 자산 관리/미디어 분석 시스템 구축 :: 김기완 ::AWS Summit Seoul 2016AWS를 활용한 디지털 자산 관리/미디어 분석 시스템 구축 :: 김기완 ::AWS Summit Seoul 2016
AWS를 활용한 디지털 자산 관리/미디어 분석 시스템 구축 :: 김기완 ::AWS Summit Seoul 2016Amazon Web Services Korea
 
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)DK Lee
 
[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸NAVER D2
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128beom kyun choi
 
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발LGU+
 
Event sourcing spring camp 2017.public
Event sourcing spring camp 2017.publicEvent sourcing spring camp 2017.public
Event sourcing spring camp 2017.publicGyuwon Yi
 
웹기술 이해 (프론트엔드 기초)
웹기술 이해 (프론트엔드 기초)웹기술 이해 (프론트엔드 기초)
웹기술 이해 (프론트엔드 기초)JoonHee Lee
 

Similar to DDD와 이벤트소싱 (20)

Java script 강의자료_ed13
Java script 강의자료_ed13Java script 강의자료_ed13
Java script 강의자료_ed13
 
Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄Domain-Driven-Design 정복기 1탄
Domain-Driven-Design 정복기 1탄
 
Ddd start 10장
Ddd start 10장Ddd start 10장
Ddd start 10장
 
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
김민욱, (달빛조각사) 엘릭서를 이용한 mmorpg 서버 개발, NDC2019
 
광고 데이터 분석 제약을 없애기 위한 클라우드 기술 사례 - 윤석찬 (AWS 테크에반젤리스트) :: ADStars 2017
광고 데이터 분석 제약을 없애기 위한 클라우드 기술 사례 - 윤석찬 (AWS 테크에반젤리스트) :: ADStars 2017광고 데이터 분석 제약을 없애기 위한 클라우드 기술 사례 - 윤석찬 (AWS 테크에반젤리스트) :: ADStars 2017
광고 데이터 분석 제약을 없애기 위한 클라우드 기술 사례 - 윤석찬 (AWS 테크에반젤리스트) :: ADStars 2017
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
[Td 2015]치즈케이크 팩토리는 알겠는데, 데이터 팩토리는 뭔가요(한기환)
 
From event storming to spring cloud implementation
From event storming to spring cloud implementationFrom event storming to spring cloud implementation
From event storming to spring cloud implementation
 
자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기자바스크립트 프레임워크 살펴보기
자바스크립트 프레임워크 살펴보기
 
20150912 windows 10 앱 tips tricks
20150912 windows 10 앱 tips  tricks20150912 windows 10 앱 tips  tricks
20150912 windows 10 앱 tips tricks
 
안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트안드로이드 개발자를 위한 스위프트
안드로이드 개발자를 위한 스위프트
 
모바일을 위한 (AWS) 클라우드 기술 동향
모바일을 위한 (AWS) 클라우드 기술 동향 모바일을 위한 (AWS) 클라우드 기술 동향
모바일을 위한 (AWS) 클라우드 기술 동향
 
AWS를 활용한 디지털 자산 관리/미디어 분석 시스템 구축 :: 김기완 ::AWS Summit Seoul 2016
AWS를 활용한 디지털 자산 관리/미디어 분석 시스템 구축 :: 김기완 ::AWS Summit Seoul 2016AWS를 활용한 디지털 자산 관리/미디어 분석 시스템 구축 :: 김기완 ::AWS Summit Seoul 2016
AWS를 활용한 디지털 자산 관리/미디어 분석 시스템 구축 :: 김기완 ::AWS Summit Seoul 2016
 
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
자바 웹 개발 시작하기 (6주차 : 커뮤니티를 만들어보자!)
 
[243]kaleido 노현걸
[243]kaleido 노현걸[243]kaleido 노현걸
[243]kaleido 노현걸
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 
Event sourcing spring camp 2017.public
Event sourcing spring camp 2017.publicEvent sourcing spring camp 2017.public
Event sourcing spring camp 2017.public
 
웹기술 이해 (프론트엔드 기초)
웹기술 이해 (프론트엔드 기초)웹기술 이해 (프론트엔드 기초)
웹기술 이해 (프론트엔드 기초)
 

DDD와 이벤트소싱

  • 1.
  • 2.
  • 4. Eric Evans의 책에서 처음 소개된 설계법 복잡한 도메인을 해결하는 목적의 소프트웨어를 우선순위로 해결해나가는 방법 도메인 주도 설계 Domain-Driven Design
  • 5. 도메인 주도 설계 프로세스 Domain-Driven Design Process 도메인 분석 Bounded Context 엔터티, 집합체, 서비스 등 정의 계층 설계 도메인 모델 Bounded Context 엔터티 사용자 인터페이스 유비쿼터스 언어 Context map 값 객체 Value Object 응용 프로그램 Shared Kernel 집합체 도메인 계층 기타 서비스 인프라 기타
  • 6. 도메인의 구성요소를 개념적으로 표현한 것 SW 전문가와 도메인 전문가가 만드는 것 도메인에 대한 이해가 필수! 어떤 특정한 다이어그램이 아니라 다이어그램이 전달하고자 하는 아이디어 내적 일관성이 없는 모델은 아무런 의미가 없다 도메인 모델 Domain Model
  • 7. 도메인 모델 Domain Model 예시: 영화 예매 시스템 Reservation 영화 예매 정보 Movie 영화 정보 Screening 상영 정보 AudienceName 관객이름 ReservationItem 예매 상품 정보 영화 예매 정보는 영화 정보ID, 상영 정보, 관객이름, 예매상품 정보를 갖는다
  • 8. 도메인 모델 Domain Model Reservation Model (이거보다 훨씬 풍성해져야 한다) Reservation ID MovieID ScreeningID AudienceName ReservationItems
  • 10. 엔터티 Entity 소프트웨어가 여러 과정을 거치는 동안에도 동일한 값을 유지하는 식별자를 지닌 유형의 객체 빌딩 블록 Building Block 값 객체 Value object 개념적 식별성이 없는, 어떤 특징을 묘사하는 객체 한번 만들어 지면 바뀌지 않는 객체
  • 11. 집합체 Aggregate 생명주기를 공유하는 데이터 집합 일관성을 유지해야 될 객체들을 묶어 놓은 것 빌딩 블록 Building Block Root Entity 접근 범위에 있는 가장 상위 Entity Aggregate은 Root Entity를 통해서만 외부에서 접근 할 수 있다
  • 12. 빌딩 블록 Building Block 집합체의 중요성 연관 관계를 줄이면서 복잡도가 감소한다 많은 도메인 모델을 간단하고 이해 가능한 수준으로 만들어 줄 수 있다
  • 13. 빌딩 블록 Building Block Movie Aggregate <<Entity>> (Root) Movie Id: Guid Title: string Screenings : Screening[] <<Entity>> Screening Id: Guid TheaterId: Guid Seats: Seat[] ScreeningTime: DateTime DefaultFee: Decimal ChildrenFee: Decimal <<Value Object>> Seat Row: int Column: int IsReserved: bool
  • 14. 빌딩 블록 Building Block Reservation Aggregate <<Entity>> (Root) Reservation Id: Guid MovieId: Guid ScreeningId: Guid AudienceName: string Items : Array<ReservationItem> <<Value Object>> ReservationItem …
  • 16. Capture all changes to an application state as sequence of events. - Martin Fowler 이벤트 소싱 Event Sourcing Event sourcing is all about the storing of facts. - Greg Young
  • 17. 전통적 저장 방식 Traditional Store 저장소 Cart_id User_id 1 3 2 5 … Cart_id Item_id Count 1 3 1 1 2 1 1 10 1 <Cart> <CartItem>
  • 18. 이벤트 소싱 Event Sourcing 이벤트 저장소 이벤트 CartCreated ItemsAdded ItemsDeleted CartOrdered ……
  • 19. 이벤트 소싱 Event Sourcing 이벤트 구성 Key Value ObjectId EventType Version Serialized PayLoad
  • 20. 이벤트 소싱 Event Sourcing 이벤트 저장소 구현 예시 ReservationId Version EventType PayLoad ac98ds0 2 ItemsAdded {“Items_Id” : “cflsk” … } ld035bp5 2 ItemsAdded {“Items_Id” : “csldk” … } ac98ds0 3 ItemsDeleted {“Items_Id” : “cflsk” … }
  • 21. 이벤트 소싱 Event Sourcing 𝑆𝑡𝑎𝑡𝑒 𝑛 = ෍ 𝑖=1 𝑛 𝐸𝑣𝑒𝑛𝑡𝑖
  • 24. 집합체와 이벤트 소싱 Aggregate using Event Sourcing Reservation Raise Event Commands 유효성 검사 Valid 예외 Invalid Event Handler State Event Store Events Events << Save >> << Restore >>
  • 25. 집합체와 이벤트 소싱 Aggregate using Event Sourcing Reservation Raise Event Commands 유효성 검사 Valid 예외 Invalid Event Handler State Event Store Events Events << Save >> << Restore >>
  • 26. public void Cancel(DateTime now) { AssertCanCancel(now); RaiseEvent(new ReservationCanceled()); } private void AssertCanCancel(DateTime now) { if (CanCancel(now)) { string message = "Cannot cancel because of cancel time limits over"; throw new InvariantException(message, now); } } private bool CanCancel(DateTime now) => now > _movieTime.AddMinutes(20);
  • 27. 집합체와 이벤트 소싱 Aggregate using Event Sourcing Reservation Raise Event Commands 유효성 검사 Valid 예외 Invalid Event Handler State Event Store Events Events << Save >> << Restore >>
  • 28. private void RaiseEvent(DomainEvent domainEvent) { EnqueueEvent(domainEvent); HandleEvent(domainEvent); } private void EnqueueEvent(DomainEvent domainEvent) { _pendingEvents.Add(domainEvent); } private void HandleEvent(DomainEvent domainEvent) { Func<object> handler = FindEventHandler(domainEvent.GetType()); handler.Invoke(domainEvent); } private void ReservationCanceledEventHandler(ReservationCanceled reservationCanceled) { _status = Status.Canceled; }
  • 29. 집합체와 이벤트 소싱 Aggregate using Event Sourcing Reservation Raise Event Commands 유효성 검사 Valid 예외 Invalid Event Handler State Event Store Events Events << Save >> << Restore >>
  • 30. public static Reservation Restore(IEnumerable<DomainEvent> pastEvents) { var reservation = new Reservation(); foreach (DomainEvent domainEvent in pastEvents) { reservation.HandleEvent(domainEvent); } return reservation; } private void HandleEvent(DomainEvent domainEvent) { Func<object> handler = FindEventHandler(domainEvent.GetType()); handler.Invoke(domainEvent); } private void ReservationCanceledEventHandler(ReservationCanceled reservationCanceled) { _status = Status.Canceled; }
  • 32. 객체 관계형 임피던스 불일치 The object-relational impedance mismatch is a set of conceptual and technical difficulties that are often encountered when a relational database management system (RDBMS) is being served by an application program (or multiple application programs) written in an object-oriented programming language or style, particularly because objects or class definitions must be mapped to database tables defined by a relational schema. 이벤트는 관계가 없는 단순한 구성을 가진다 이벤트 소싱, 그리고 더 … Event Sourcing, And more …
  • 33. 𝑆𝑡𝑎𝑡𝑒 𝑛 = ෍ 𝑖=1 𝑛 𝐸𝑣𝑒𝑛𝑡𝑖 이벤트 소싱, 그리고 더 … Event Sourcing, And more …
  • 34. 𝑆𝑡𝑎𝑡𝑒 𝑛 = 𝑆𝑡𝑎𝑡𝑒 𝑚 + ෍ 𝑖=𝑚+1 𝑛 𝐸𝑣𝑒𝑛𝑡𝑖 1 ≤ 𝑚 ≤ 𝑛 이벤트 소싱, 그리고 더 … Event Sourcing, And more … 롤링 스냅샷
  • 35. 이벤트 소싱, 그리고 더 … Event Sourcing, And more … UI 데이터베이스 모델 전통적 방식
  • 36. 이벤트 소싱, 그리고 더 … Event Sourcing, And more … UI 조회모델 데이터 베이스 명령모델 데이터 베이스 조회모델 명령모델 CQRSCommand Query Responsibility Segregation
  • 37. 이벤트 소싱, 그리고 더 … Event Sourcing, And more … 내가 겪은 Domain-Driven-Design 장점 도메인 모델에 대한 이해 단점 가파른 학습 곡선 작업의 우선 순위 결정
  • 38. 이벤트 소싱, 그리고 더 … Event Sourcing, And more … 내가 겪은 Event-Sourcing 장점 신뢰 가능한 시스템 기록 단점 가파른 학습 곡선 마이그레이션비즈니스의 추적 기록 요구 CQRS 필수도메인 모델의 풍부한 코드 표현