10.1 시스템 간 강결합 문제
- 짧으니 한번 읽어보자
10.2 이벤트 개요
- 이벤트의 용도
- 트리거
- 주문을 취소하면 환불처리한다.
- 북마크 상세조회가 발생하면 로그 테이블에 저장한다.
- 예약이 발생하면 메일을 발송한다.
- 데이터 동기화
- 짜장면의 가격을 변경하면 외부 시스템에 짜장면의 가격이 바뀌었음을 동기화 해 주어야 한다.
- 이벤트의 장점
- 결합도를 낮출수 있다
10.3 이벤트, 핸들러, 디스패처 구현
- 이벤트 클래스
- OrderCanceledEvent
- BookmarkGotDetailedEvent
Events
/ApplicationEventPublisher
- 참고 -
ApplicationContext
는ApplicationEventPublisher
를 상속하고 있다.
10.4 동기 이벤트 처리 문제
- 이벤트를 동기로 처리하면
- 외부 시스템의 성능 저하
- 트랜잭션
- 에 대한 고민이 필요해진다.
해결방법 1. 이벤트를 비동기로 처리
해결방법 2. 이벤트와 트랜잭션을 연계
10.5 비동기 이벤트 처리
- 이벤트 처리하기로 마음먹은 요구사항을 ‘A 하면 이어서 B 하라' 에서
- ‘A 하면 최대 언제까지 B 하라' 로 바꿀 수 있는 요구사항은 비동기 처리가 가능하다.
이벤트를 비동기 처리 하는 네 가지 방식
- 로컬 핸들러를 비동기로 실행하기
@EnableAsync
,@Async
- 이벤트 핸들러를 별도 스레드로 실행한다.
- 메시지 큐를 사용하기
- Kafka/RabbitMQ
- 이벤트저장소와 이벤트 포워더 사용하기/ 이벤트 저장소와 이벤트 제공 API 사용하기
- DB 에 저장후 포워딩/제공
- 이벤트 발생 순서를 유지해야 하는 경우 사용하면 좋다.
10.6 이벤트 적용 시 추가 고려 사항
- 트랜잭션
@TransactionalEventListener
-