Post

10장 이벤트

10장 이벤트

10.1 시스템 간 강결합 문제

  • 강결합 분리, 이벤트로 처리하는 것도 방법이다.
    • 그리고 다른 쓰레드로 분리해서 처리하는 것도 가능해진다.

10.2 이벤트 개요

-

10.2.1 이벤트 관련 구성요소

  • 이벤트는 이벤트 내용. 이벤트 핸들러 등으로 구성된다.

10.2.2 이벤트의 구성

  • 이벤트 종류.
  • 이벤트 발생 시간.
  • 추가 데이터.
  • 이벤트 전파 방법? : Events.raise(new XXEvent()); 를 사용함.

10.2.3 이벤트 용도

  1. 트리거
    1. 주문을 하면 예매 결과를 sms나 이메일로 발생시키자!
  2. 시스템 간 데이터 동기화

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 동기 이벤트 처리 문제

  • 생각해볼만한 문제
    1. 이벤트를 처리하는 코드가 동기로 실행되었을때 이벤트 실행이 너무 늦어서 성능에 악영향이면?
      1. 비동기로 처리할 방법은?
    2. 외부 서비스실행에 실패했을때 반드시 트랜잭션 롤백 처리를 해야할까? 아니면 상관 없을까?
      1. 성능과 트랜잭션 문제를 최소화 하기 위해서는
    3. 이벤트를 동기로 처리하거나.
    4. 이벤트와 트랜잭션을 연계하자.

10.5 비동기 이벤트 처리

  • 주문을 취소하자 마자 결제를 취소하지 않아도 괜찮긴 함.
    • 이런걸 비동기로 처리하자.
      • 별도의 쓰레드에게 할당하는 방식으로 비동기 처리가 가능하겠죠?

10.5.1 로컬 핸들러 비동기 실행

  • 로컬(같은 프로그램)에서 하는 방법
  • “@EnableAsync” 사용.
  • 이벤트 핸들러 메시지에 “@Async” 사용하기.

10.5.2 메시징 시스템을 이용한 비동기 구현

  • 카프카나 레빗 엠큐를 이용한 구현을 의미함.
  • 글로벌 트랜잭션을 이용할수도 있지만 지원하지 않는 메시징 시스템 존재.

10.5.3 이벤트 저장소를 이용한 비동기 처리

  1. 포워더 사용
    1. 포워더가 저장소 조회해서 이벤트 핸들러 실행
  2. api를 이용하는 방식.
    1. api가 저장소에서 조회하는 기능을 가짐.
    2. 이벤트 핸들러가 주기적으로 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.