10장 이벤트
10장 이벤트
10.1 시스템 간 강결합 문제
- 강결합 분리, 이벤트로 처리하는 것도 방법이다.
- 그리고 다른 쓰레드로 분리해서 처리하는 것도 가능해진다.
10.2 이벤트 개요
-
10.2.1 이벤트 관련 구성요소
- 이벤트는 이벤트 내용. 이벤트 핸들러 등으로 구성된다.
10.2.2 이벤트의 구성
- 이벤트 종류.
- 이벤트 발생 시간.
- 추가 데이터.
- 이벤트 전파 방법? : Events.raise(new XXEvent()); 를 사용함.
10.2.3 이벤트 용도
- 트리거
- 주문을 하면 예매 결과를 sms나 이메일로 발생시키자!
- 시스템 간 데이터 동기화
10.2.4 이벤트 장점
- 기능 확장에 용이.
- 로직의 분리.
10.3 이벤트, 핸들러, 디스패처 구현
- 이벤트 클래스 : 이벤트를 표현
- 디스패처 : 스프링이 제공하는 ApplicationEventPublisher를 이용. 이것이 이벤트 핸들러에서 내용을 넘기는 것임.
- Events : 이벤트를 발행한다.(Events.raise(new XXEvents))ApplicationEventPublisher를 이용한다.
- 이벤트 헨들러 : 이벤트를 수신해서 처리한다.
10.3.1 이벤트 클래스
- pass XXEvent 이런 클래스로 정의한다.
10.3.2 Events 클래스와 ApplicationEventPublisher
- 스프링에서 제공하는게 아니라, 이벤트를 직접 구현해서 사용해서 사용하고 있었다.
10.3.3 이벤트 발생과 이벤트 핸들러
- Events.raise
- 자세히 보니 내부적으로
ApplicationEventPublisher의 publishEvent(new )- 형식.
- “@EventLIsneter”
- 이벤트 핸들러 메서드(인자로 이벤트)
- 내용 : 이벤트에서 값을 꺼내서 필요한 로직들 실행.
- 이벤트 핸들러 메서드(인자로 이벤트)
10.3.4 흐름 정리
10.4 동기 이벤트 처리 문제
- 생각해볼만한 문제
- 이벤트를 처리하는 코드가 동기로 실행되었을때 이벤트 실행이 너무 늦어서 성능에 악영향이면?
- 비동기로 처리할 방법은?
- 외부 서비스실행에 실패했을때 반드시 트랜잭션 롤백 처리를 해야할까? 아니면 상관 없을까?
- 성능과 트랜잭션 문제를 최소화 하기 위해서는
- 이벤트를 동기로 처리하거나.
- 이벤트와 트랜잭션을 연계하자.
- 이벤트를 처리하는 코드가 동기로 실행되었을때 이벤트 실행이 너무 늦어서 성능에 악영향이면?
10.5 비동기 이벤트 처리
- 주문을 취소하자 마자 결제를 취소하지 않아도 괜찮긴 함.
- 이런걸 비동기로 처리하자.
- 별도의 쓰레드에게 할당하는 방식으로 비동기 처리가 가능하겠죠?
- 이런걸 비동기로 처리하자.
10.5.1 로컬 핸들러 비동기 실행
- 로컬(같은 프로그램)에서 하는 방법
- “@EnableAsync” 사용.
- 이벤트 핸들러 메시지에 “@Async” 사용하기.
10.5.2 메시징 시스템을 이용한 비동기 구현
- 카프카나 레빗 엠큐를 이용한 구현을 의미함.
- 글로벌 트랜잭션을 이용할수도 있지만 지원하지 않는 메시징 시스템 존재.
10.5.3 이벤트 저장소를 이용한 비동기 처리
- 포워더 사용
- 포워더가 저장소 조회해서 이벤트 핸들러 실행
- api를 이용하는 방식.
- api가 저장소에서 조회하는 기능을 가짐.
- 이벤트 핸들러가 주기적으로 api를 호출하여 실행해야할 것이 있으면 실행하는 방식.
- 이벤트 저장소 구현 - EventEntry : 보관할 데이터 - EventStore : 저장하고 조회 인터페이스 제공 - JdbcEventStore : 구현체. jdbc 기술 이용 - EventApi : 이벤트 목록을 제공하는 컨트롤러 - 구체적으로 작업해야할 때 이책의 소스코드를 참고할만할듯.
10.6 이벤트 적용 시 추가 고려 사항
- 이벤트 소스를 이벤트엔트리에 추가할지?
- 누가 이벤트를 트리거 할지도 제어 하고 싶다면 적용.
- 포워더는 전송 실패를 얼마나 허용?
- 이벤트 손실?
- 이벤트 실행순서는 ?
- 이벤트 재처리 방식은?
10.6.1 이벤트 처리와 DB 트랜잭션 고려
- 호출하는 로직의 트랜잭션이 성공했을 때만 이벤트를 핸들링 하고 싶다면 쓸수 있는 것.
- “@TransactionalEventListener”
- 이벤트 저장소로 DB를 사용한다면?
- 이벤트 발생 코드와 이벤트 저장처리를 한 트랜잭션으로 처리.
- 이러면 이벤트 발생에 문제 발생시 이벤트 저장처리가 롤백 되니 이벤트 자체가 발생되지 않음.
- 이벤트 발생 코드와 이벤트 저장처리를 한 트랜잭션으로 처리.
This post is licensed under CC BY 4.0 by the author.