SlideShare a Scribd company logo
1 of 28
Download to read offline
DDD start
10장 이벤트
아꿈사 송성곤
주요 내용
❏ 이벤트의 용도와 장점
❏ 핸들러 디스패치와 핸들러 구현
❏ 비동기 이벤트 처리
시스템 간 강결합 문제
❏ 쇼핑몰 구매 취소 시 환불 문제
❏ 주문 도메인에서 환불 기능을 실행
❏ 환불 도메인이 외부 시스템이라면
❏ 환불처리 과정에서 예외발생으로 구매취소 트랜잭션도 롤백해야 하는가…
❏ 외부 서비스 성능에 직접적인 영향을 받는다.
❏ 도메인 객체에 서비스를 전달하면
❏ 주문로직과 결재로직이 섞이는 문제
시스템 간 강결합 문제를 해결하려면..
❏ 이벤트를 사용하여 구매시스템과 결재 시스템간 강결합 문제를 해결
❏ 이벤트를 사용하면 서로 다른 도메인이 섞이는 것을 방지할 수 있음
이벤트 관련 구성요소
❏ 이벤트 생성 주체
❏ 이벤트 디스패처(퍼블리셔)
❏ 이벤트 핸들러
이벤트 생성 주체
이벤트 디스패쳐
이벤트 퍼블리셔
이벤트 핸들러
event event
이벤트 구성
❏ 이벤트 종류
❏ 클래스 이름으로 이벤트 종류 표현
❏ 이벤트 발생시간
❏ 추가 데이터
❏ 주문번호, 신규 배송지 정보 등 이벤트와 관련된 정보
생성자
이벤트 용도
❏ 트리거
❏ 시스템간의 데이터 동기화
Order EventDispatcher
OrderCanceled
EventHandler
OrderCanceled
event
OrderCanceled
event
RefundService
이벤트, 이벤트 핸들러, 디스패처 구현
❏ 이벤트 클래스 (Event)
❏ 이벤트 핸들러 (EventHandler)
❏ 이벤트 핸들러의 상위 타입으로 모든 핸들러는 이 인터페이스를 구현한다.
❏ 디스패처 (Events)
❏ 이벤트 디스패처, 이벤트 발행, 이벤트 핸들러 등록, 이벤트를 핸들러에
등록하는 등의 기능을 제공
이벤트 클래스
❏ 이벤트는 과거에 벌어진 상태 변화나 사건을 의미하므로 이벤트클래스의
이름을 결정할 때에는 과거 시제를 사용
❏ 접미사로 Event를 사용
❏ Event(s)
❏ OrderAcceptedEvent
❏ OrderCanceledEvent
❏ OrderShippedEvent
❏ CommentAddedEvent
❏ ReviewQuarantinedEvent
❏ ReviewUnquarantinedEvent
이벤트 핸들러
이벤트 디스패처
이벤트 디스패처
이벤트 발생
이벤트 디스패처
이벤트 디스패처
이벤트 디스패처
이벤트 처리 흐름
동기 이벤트 처리 문제
❏ 시스템간 강결합은 해결했으나 외부시스템 성능 영향
환불처리가 느려진다면
비동기 이벤트 처리
❏ ‘A하면 이어서 B하라’
❏ ‘A하면 최대 언제까지 B하라’로 바꿀수 있는 요구사항
❏ 비동기 이벤트 처리 방법
❏ 로컬 핸들러를 비동기로 실행
❏ 메시지 큐를 사용한 비동기 구현
❏ 이벤트 저장소와 이벤트 포워더 사용하기
❏ 이벤트 저장소와 이벤트 API 사용하기
로컬 핸들러의 비동기 처리
❏ 이벤트 핸들러를 별도 스레드로 이벤트 핸들러를 비동기로 실행
executor.submit(() -> handler.handle(event));
트랜잭션 범위
메시징 시스템을 이용한 비동기 구현
Order Events RabbitMQ
Events.raise rabbitTemplate.
convertAndSend()
Message
Listener
EventHandler
onMessage()
handle()
트랜잭션 범위
이벤트 저장소와 이벤트 포워더 사용하기
❏ 이벤트를 일단 DB에 저장
❏ 포워더(별도 프로그램)를 이용 이벤트 핸들러에 이벤트 전달
도메인 이벤트 디스패처 로컬핸들러
포워더 이벤트핸들러
저장소
이벤트 저장
이벤트를 주기적으로 읽어와 전달
어디까지 전달했는지 추적
이벤트 저장소와 이벤트 API 사용하기
❏ 이벤트를 일단 DB에 저장
❏ 외부핸들러가 API서버를 통해 이벤트 목록을 가져오는 방식
도메인 이벤트 디스패처 로컬핸들러
API 이벤트핸들러
저장소
이벤트 저장
API를 통해 이벤트를
읽어와 처리
REST와 같은 방식으로
이벤트를 외부에 제공
이벤트 저장소 구현
❏ EventEntry
❏ 이벤트 저장소에 보관할 이벤트 데이터
❏ Id, Type, Content-Type, Payload, Timestamp
❏ EventStore
❏ 이벤트를 저장하고 조회하는 인터페이스
❏ JdbcEventStore
❏ JDBC를 이용한 EventStore구현 클래스
❏ EventApi
❏ REST API를 이용해서 이벤트 목록을 제공하는 컨트롤러
이벤트 저장을 위한 이벤트 핸들러 구현
❏ 발생한 이벤트를 이벤트 저장소에 추가하는 로컬 이벤트 핸들러
REST API 구현
❏ Offset과 limit의 웹 요청 파라미터를 이용해서 EventStore#get을 실행하고 그
결과를 JSON으로 리턴
❏ API를 사용하는 클라이언트 동작
REST API 구현
포워더 구현
❏ API 방식에서 클라이언트의 구현과 유사
❏ 일정 주기로 EventStore로부터 이벤트를 읽어와 이벤트 핸들러에 전달
❏ 마지막으로 전달한 이벤트의 offset을 기억 해 두었다가 다음 조회 시점에
마지막으로 처리한 offset부터 이벤트를 조회하여 처리
이벤트 적용 시 추가 고려사항
❏ 이벤트 소스(이벤트 발생주체)를 EventEntry에 추가할지 여부
❏ 특정 주체가 발생한 이벤트만 조회하는 기능을 구현할 수 있게됨
❏ 포워더에서 전송 실패를 얼마나 허용할 것이냐
❏ 이벤트 손실
❏ 로컬 핸들러를 이용한 비동기 구현에서는 이벤트 처리 실패 시 이벤트 유실
❏ 이벤트 순서 보장
❏ 이벤트 재처리
❏ 이벤트 처리를 멱등으로 처리- 중복 발생이나 중복처리에 대한 부담을 줄여줌

More Related Content

Viewers also liked

실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8HyeonSeok Choi
 
7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장HyeonSeok Choi
 
HTTP 완벽가이드 21장
HTTP 완벽가이드 21장HTTP 완벽가이드 21장
HTTP 완벽가이드 21장HyeonSeok Choi
 
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장Sunggon Song
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성HyeonSeok Choi
 
Ddd start! 6장. 응용 서비스와 표현 영역
Ddd start!   6장. 응용 서비스와 표현 영역Ddd start!   6장. 응용 서비스와 표현 영역
Ddd start! 6장. 응용 서비스와 표현 영역Hyunsoo Jung
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugbeom kyun choi
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰beom kyun choi
 
7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신Hyunsoo Jung
 
간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기beom kyun choi
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)beom kyun choi
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개beom kyun choi
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128beom kyun choi
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven DesignYoung-Ho Cho
 
도메인 주도 설계의 본질
도메인 주도 설계의 본질도메인 주도 설계의 본질
도메인 주도 설계의 본질Young-Ho Cho
 

Viewers also liked (20)

실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8실무로 배우는 시스템 성능 최적화 Ch8
실무로 배우는 시스템 성능 최적화 Ch8
 
7가지 동시성 모델 4장
7가지 동시성 모델 4장7가지 동시성 모델 4장
7가지 동시성 모델 4장
 
HTTP 완벽가이드 21장
HTTP 완벽가이드 21장HTTP 완벽가이드 21장
HTTP 완벽가이드 21장
 
DDD Repository
DDD RepositoryDDD Repository
DDD Repository
 
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
실무로 배우는 시스템 성능 최적화 8부 - 1,2,3장
 
7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성7가지 동시성 모델 - 데이터 병렬성
7가지 동시성 모델 - 데이터 병렬성
 
Ddd start! 6장. 응용 서비스와 표현 영역
Ddd start!   6장. 응용 서비스와 표현 영역Ddd start!   6장. 응용 서비스와 표현 영역
Ddd start! 6장. 응용 서비스와 표현 영역
 
Bounded Context
Bounded ContextBounded Context
Bounded Context
 
DDD Start Ch#3
DDD Start Ch#3DDD Start Ch#3
DDD Start Ch#3
 
Ddd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksugDdd start 부록 지앤선&ksug
Ddd start 부록 지앤선&ksug
 
DDD 준비 서문래
DDD 준비 서문래DDD 준비 서문래
DDD 준비 서문래
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
모델링 연습 리뷰
모델링 연습 리뷰모델링 연습 리뷰
모델링 연습 리뷰
 
7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신7가지 동시성 모델 - 6장. 순차 프로세스 통신
7가지 동시성 모델 - 6장. 순차 프로세스 통신
 
간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기간단 Ip 필터 구현 이야기
간단 Ip 필터 구현 이야기
 
DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)DDD 구현기초 (거의 Final 버전)
DDD 구현기초 (거의 Final 버전)
 
자바8 스트림 API 소개
자바8 스트림 API 소개자바8 스트림 API 소개
자바8 스트림 API 소개
 
도메인구현 KSUG 20151128
도메인구현 KSUG 20151128도메인구현 KSUG 20151128
도메인구현 KSUG 20151128
 
Domain Driven Design
Domain Driven DesignDomain Driven Design
Domain Driven Design
 
도메인 주도 설계의 본질
도메인 주도 설계의 본질도메인 주도 설계의 본질
도메인 주도 설계의 본질
 

Similar to Ddd start 10장

구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발LGU+
 
이벤트 드리븐.pptx
이벤트 드리븐.pptx이벤트 드리븐.pptx
이벤트 드리븐.pptxMUUMUMUMU
 
Azure Event hubs
Azure Event hubsAzure Event hubs
Azure Event hubsJaeryong Im
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with SpringKeesun Baik
 
게임 서비스 품질 향상을 위한 데이터 분석 활용하기 - 김필중 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
게임 서비스 품질 향상을 위한 데이터 분석 활용하기 - 김필중 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming게임 서비스 품질 향상을 위한 데이터 분석 활용하기 - 김필중 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
게임 서비스 품질 향상을 위한 데이터 분석 활용하기 - 김필중 솔루션즈 아키텍트:: AWS Cloud Track 3 GamingAmazon Web Services Korea
 
DDD와 이벤트소싱
DDD와 이벤트소싱DDD와 이벤트소싱
DDD와 이벤트소싱Suhyeon Jo
 
울트론 개발 가이드 V3.0
울트론 개발 가이드 V3.0울트론 개발 가이드 V3.0
울트론 개발 가이드 V3.0용근 권
 
Service mesh(istio) monitoring
Service mesh(istio) monitoringService mesh(istio) monitoring
Service mesh(istio) monitoringJeong-Ho Na
 
AWS 서버리스 컴퓨팅-김필중 :: 2015 리인벤트 리캡 게이밍
AWS 서버리스 컴퓨팅-김필중 :: 2015 리인벤트 리캡 게이밍AWS 서버리스 컴퓨팅-김필중 :: 2015 리인벤트 리캡 게이밍
AWS 서버리스 컴퓨팅-김필중 :: 2015 리인벤트 리캡 게이밍Amazon Web Services Korea
 
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지강 민우
 
9주 dom & event advanced
9주  dom & event advanced9주  dom & event advanced
9주 dom & event advanced지수 윤
 
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경YoungSu Son
 
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
 
2017 Ad-Tech on AWS 세미나ㅣ국내외 애드테크 고객 사례 및 Machine Learning 소개
2017 Ad-Tech on AWS 세미나ㅣ국내외 애드테크 고객 사례 및 Machine Learning 소개2017 Ad-Tech on AWS 세미나ㅣ국내외 애드테크 고객 사례 및 Machine Learning 소개
2017 Ad-Tech on AWS 세미나ㅣ국내외 애드테크 고객 사례 및 Machine Learning 소개Amazon Web Services Korea
 
20160511 azure를 기반으로한 인공지능 io t 생태계 구축 전략
20160511 azure를 기반으로한 인공지능 io t 생태계 구축 전략20160511 azure를 기반으로한 인공지능 io t 생태계 구축 전략
20160511 azure를 기반으로한 인공지능 io t 생태계 구축 전략영욱 김
 
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발영욱 김
 
ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱confluent
 

Similar to Ddd start 10장 (20)

구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발 구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
구글 기술을 이용한 모바일 클라우드 애플리케이션 개발
 
이벤트 드리븐.pptx
이벤트 드리븐.pptx이벤트 드리븐.pptx
이벤트 드리븐.pptx
 
Azure Event hubs
Azure Event hubsAzure Event hubs
Azure Event hubs
 
REST API Development with Spring
REST API Development with SpringREST API Development with Spring
REST API Development with Spring
 
게임 서비스 품질 향상을 위한 데이터 분석 활용하기 - 김필중 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
게임 서비스 품질 향상을 위한 데이터 분석 활용하기 - 김필중 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming게임 서비스 품질 향상을 위한 데이터 분석 활용하기 - 김필중 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
게임 서비스 품질 향상을 위한 데이터 분석 활용하기 - 김필중 솔루션즈 아키텍트:: AWS Cloud Track 3 Gaming
 
DDD와 이벤트소싱
DDD와 이벤트소싱DDD와 이벤트소싱
DDD와 이벤트소싱
 
울트론 개발 가이드 V3.0
울트론 개발 가이드 V3.0울트론 개발 가이드 V3.0
울트론 개발 가이드 V3.0
 
Service mesh(istio) monitoring
Service mesh(istio) monitoringService mesh(istio) monitoring
Service mesh(istio) monitoring
 
AWS 서버리스 컴퓨팅-김필중 :: 2015 리인벤트 리캡 게이밍
AWS 서버리스 컴퓨팅-김필중 :: 2015 리인벤트 리캡 게이밍AWS 서버리스 컴퓨팅-김필중 :: 2015 리인벤트 리캡 게이밍
AWS 서버리스 컴퓨팅-김필중 :: 2015 리인벤트 리캡 게이밍
 
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
[IGC 2017] 아마존 구승모 - 게임 엔진으로 서버 제작 및 운영까지
 
9주 dom & event advanced
9주  dom & event advanced9주  dom & event advanced
9주 dom & event advanced
 
Netty4.x
Netty4.xNetty4.x
Netty4.x
 
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
[NEXT] 화면 재갱신이 되는 안드로이드 앱 만들기 - 네트워크에 독립하는 구조로 변경
 
Hacosa j query 8th
Hacosa j query 8thHacosa j query 8th
Hacosa j query 8th
 
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
 
2017 Ad-Tech on AWS 세미나ㅣ국내외 애드테크 고객 사례 및 Machine Learning 소개
2017 Ad-Tech on AWS 세미나ㅣ국내외 애드테크 고객 사례 및 Machine Learning 소개2017 Ad-Tech on AWS 세미나ㅣ국내외 애드테크 고객 사례 및 Machine Learning 소개
2017 Ad-Tech on AWS 세미나ㅣ국내외 애드테크 고객 사례 및 Machine Learning 소개
 
모바일을 위한 (AWS) 클라우드 기술 동향
모바일을 위한 (AWS) 클라우드 기술 동향 모바일을 위한 (AWS) 클라우드 기술 동향
모바일을 위한 (AWS) 클라우드 기술 동향
 
20160511 azure를 기반으로한 인공지능 io t 생태계 구축 전략
20160511 azure를 기반으로한 인공지능 io t 생태계 구축 전략20160511 azure를 기반으로한 인공지능 io t 생태계 구축 전략
20160511 azure를 기반으로한 인공지능 io t 생태계 구축 전략
 
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발20140122 techdays mini  앱 개발 세미나(3) - 센서활용 앱 개발
20140122 techdays mini 앱 개발 세미나(3) - 센서활용 앱 개발
 
ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱ksqlDB로 시작하는 스트림 프로세싱
ksqlDB로 시작하는 스트림 프로세싱
 

More from Sunggon Song

K8s in action chap15
K8s in action chap15K8s in action chap15
K8s in action chap15Sunggon Song
 
랜덤Walks, 몬테카를로 시뮬레이션
랜덤Walks, 몬테카를로 시뮬레이션랜덤Walks, 몬테카를로 시뮬레이션
랜덤Walks, 몬테카를로 시뮬레이션Sunggon Song
 
Function approximation as supervised learning
Function approximation as supervised learningFunction approximation as supervised learning
Function approximation as supervised learningSunggon Song
 
서포트 벡터머신
서포트 벡터머신서포트 벡터머신
서포트 벡터머신Sunggon Song
 
대칭가중치와 심층신뢰네트워크
대칭가중치와 심층신뢰네트워크대칭가중치와 심층신뢰네트워크
대칭가중치와 심층신뢰네트워크Sunggon Song
 
데이터처리와 통계 기본 머신러닝
데이터처리와 통계 기본 머신러닝데이터처리와 통계 기본 머신러닝
데이터처리와 통계 기본 머신러닝Sunggon Song
 
합성곱 신경망
합성곱 신경망합성곱 신경망
합성곱 신경망Sunggon Song
 
밑바닥부터 시작하는딥러닝 8장
밑바닥부터 시작하는딥러닝 8장밑바닥부터 시작하는딥러닝 8장
밑바닥부터 시작하는딥러닝 8장Sunggon Song
 

More from Sunggon Song (9)

K8s in action chap15
K8s in action chap15K8s in action chap15
K8s in action chap15
 
랜덤Walks, 몬테카를로 시뮬레이션
랜덤Walks, 몬테카를로 시뮬레이션랜덤Walks, 몬테카를로 시뮬레이션
랜덤Walks, 몬테카를로 시뮬레이션
 
K8s in action02
K8s in action02K8s in action02
K8s in action02
 
Function approximation as supervised learning
Function approximation as supervised learningFunction approximation as supervised learning
Function approximation as supervised learning
 
서포트 벡터머신
서포트 벡터머신서포트 벡터머신
서포트 벡터머신
 
대칭가중치와 심층신뢰네트워크
대칭가중치와 심층신뢰네트워크대칭가중치와 심층신뢰네트워크
대칭가중치와 심층신뢰네트워크
 
데이터처리와 통계 기본 머신러닝
데이터처리와 통계 기본 머신러닝데이터처리와 통계 기본 머신러닝
데이터처리와 통계 기본 머신러닝
 
합성곱 신경망
합성곱 신경망합성곱 신경망
합성곱 신경망
 
밑바닥부터 시작하는딥러닝 8장
밑바닥부터 시작하는딥러닝 8장밑바닥부터 시작하는딥러닝 8장
밑바닥부터 시작하는딥러닝 8장
 

Ddd start 10장

  • 2. 주요 내용 ❏ 이벤트의 용도와 장점 ❏ 핸들러 디스패치와 핸들러 구현 ❏ 비동기 이벤트 처리
  • 3. 시스템 간 강결합 문제 ❏ 쇼핑몰 구매 취소 시 환불 문제 ❏ 주문 도메인에서 환불 기능을 실행 ❏ 환불 도메인이 외부 시스템이라면 ❏ 환불처리 과정에서 예외발생으로 구매취소 트랜잭션도 롤백해야 하는가… ❏ 외부 서비스 성능에 직접적인 영향을 받는다. ❏ 도메인 객체에 서비스를 전달하면 ❏ 주문로직과 결재로직이 섞이는 문제
  • 4. 시스템 간 강결합 문제를 해결하려면.. ❏ 이벤트를 사용하여 구매시스템과 결재 시스템간 강결합 문제를 해결 ❏ 이벤트를 사용하면 서로 다른 도메인이 섞이는 것을 방지할 수 있음
  • 5. 이벤트 관련 구성요소 ❏ 이벤트 생성 주체 ❏ 이벤트 디스패처(퍼블리셔) ❏ 이벤트 핸들러 이벤트 생성 주체 이벤트 디스패쳐 이벤트 퍼블리셔 이벤트 핸들러 event event
  • 6. 이벤트 구성 ❏ 이벤트 종류 ❏ 클래스 이름으로 이벤트 종류 표현 ❏ 이벤트 발생시간 ❏ 추가 데이터 ❏ 주문번호, 신규 배송지 정보 등 이벤트와 관련된 정보 생성자
  • 7. 이벤트 용도 ❏ 트리거 ❏ 시스템간의 데이터 동기화 Order EventDispatcher OrderCanceled EventHandler OrderCanceled event OrderCanceled event RefundService
  • 8. 이벤트, 이벤트 핸들러, 디스패처 구현 ❏ 이벤트 클래스 (Event) ❏ 이벤트 핸들러 (EventHandler) ❏ 이벤트 핸들러의 상위 타입으로 모든 핸들러는 이 인터페이스를 구현한다. ❏ 디스패처 (Events) ❏ 이벤트 디스패처, 이벤트 발행, 이벤트 핸들러 등록, 이벤트를 핸들러에 등록하는 등의 기능을 제공
  • 9. 이벤트 클래스 ❏ 이벤트는 과거에 벌어진 상태 변화나 사건을 의미하므로 이벤트클래스의 이름을 결정할 때에는 과거 시제를 사용 ❏ 접미사로 Event를 사용 ❏ Event(s) ❏ OrderAcceptedEvent ❏ OrderCanceledEvent ❏ OrderShippedEvent ❏ CommentAddedEvent ❏ ReviewQuarantinedEvent ❏ ReviewUnquarantinedEvent
  • 17. 동기 이벤트 처리 문제 ❏ 시스템간 강결합은 해결했으나 외부시스템 성능 영향 환불처리가 느려진다면
  • 18. 비동기 이벤트 처리 ❏ ‘A하면 이어서 B하라’ ❏ ‘A하면 최대 언제까지 B하라’로 바꿀수 있는 요구사항 ❏ 비동기 이벤트 처리 방법 ❏ 로컬 핸들러를 비동기로 실행 ❏ 메시지 큐를 사용한 비동기 구현 ❏ 이벤트 저장소와 이벤트 포워더 사용하기 ❏ 이벤트 저장소와 이벤트 API 사용하기
  • 19. 로컬 핸들러의 비동기 처리 ❏ 이벤트 핸들러를 별도 스레드로 이벤트 핸들러를 비동기로 실행 executor.submit(() -> handler.handle(event));
  • 20. 트랜잭션 범위 메시징 시스템을 이용한 비동기 구현 Order Events RabbitMQ Events.raise rabbitTemplate. convertAndSend() Message Listener EventHandler onMessage() handle() 트랜잭션 범위
  • 21. 이벤트 저장소와 이벤트 포워더 사용하기 ❏ 이벤트를 일단 DB에 저장 ❏ 포워더(별도 프로그램)를 이용 이벤트 핸들러에 이벤트 전달 도메인 이벤트 디스패처 로컬핸들러 포워더 이벤트핸들러 저장소 이벤트 저장 이벤트를 주기적으로 읽어와 전달 어디까지 전달했는지 추적
  • 22. 이벤트 저장소와 이벤트 API 사용하기 ❏ 이벤트를 일단 DB에 저장 ❏ 외부핸들러가 API서버를 통해 이벤트 목록을 가져오는 방식 도메인 이벤트 디스패처 로컬핸들러 API 이벤트핸들러 저장소 이벤트 저장 API를 통해 이벤트를 읽어와 처리 REST와 같은 방식으로 이벤트를 외부에 제공
  • 23. 이벤트 저장소 구현 ❏ EventEntry ❏ 이벤트 저장소에 보관할 이벤트 데이터 ❏ Id, Type, Content-Type, Payload, Timestamp ❏ EventStore ❏ 이벤트를 저장하고 조회하는 인터페이스 ❏ JdbcEventStore ❏ JDBC를 이용한 EventStore구현 클래스 ❏ EventApi ❏ REST API를 이용해서 이벤트 목록을 제공하는 컨트롤러
  • 24. 이벤트 저장을 위한 이벤트 핸들러 구현 ❏ 발생한 이벤트를 이벤트 저장소에 추가하는 로컬 이벤트 핸들러
  • 25. REST API 구현 ❏ Offset과 limit의 웹 요청 파라미터를 이용해서 EventStore#get을 실행하고 그 결과를 JSON으로 리턴 ❏ API를 사용하는 클라이언트 동작
  • 27. 포워더 구현 ❏ API 방식에서 클라이언트의 구현과 유사 ❏ 일정 주기로 EventStore로부터 이벤트를 읽어와 이벤트 핸들러에 전달 ❏ 마지막으로 전달한 이벤트의 offset을 기억 해 두었다가 다음 조회 시점에 마지막으로 처리한 offset부터 이벤트를 조회하여 처리
  • 28. 이벤트 적용 시 추가 고려사항 ❏ 이벤트 소스(이벤트 발생주체)를 EventEntry에 추가할지 여부 ❏ 특정 주체가 발생한 이벤트만 조회하는 기능을 구현할 수 있게됨 ❏ 포워더에서 전송 실패를 얼마나 허용할 것이냐 ❏ 이벤트 손실 ❏ 로컬 핸들러를 이용한 비동기 구현에서는 이벤트 처리 실패 시 이벤트 유실 ❏ 이벤트 순서 보장 ❏ 이벤트 재처리 ❏ 이벤트 처리를 멱등으로 처리- 중복 발생이나 중복처리에 대한 부담을 줄여줌