콘텐츠로 이동

2021 11 05

2021-11-05

의존성 리팩터링 미션

  • 도메인 이벤트 - 강한 결합 vs 느슨한 결합 - 외부 서비스가 정상이 아닐 경우 트랜잭션 처리가 애매해짐 - 외부 서비스 성능에 직접적인 영향을 받는 문제가 있음 - 도메인 객체에 서비스를 전달하면 X - "비동기 이벤트"를 사용하면 두 시스템간의 결합을 크게 낮출 수 있음!
  • 이벤트 - 이벤트 구성 요소 - 이벤트가 발생한다 == 상태가 변경됐다 - - 도메인 모델에서 이벤트 주체 == 엔티티, 밸류, 도메인 서비스 - 도메인 객체 == 도메인 로직을 실행해 상태가 바뀌면 관련 이벤트 발생 - 이벤트 핸들러는 이벤트 생성 주체가 발생한 이벤트에 반응 - 이벤트 생성 주체 <--- 이벤트 디스패처 ---> 이벤트 핸들러

    - 이벤트의 구성 - 과거의 것을 표현하기에 네이밍은 과거 시제로 - 이벤트 핸들러가 작업을 수행하는데 필요한 최소한의 데이터를 담을 것

    - 이벤트 용도 - 도메인의 상태가 바뀔 때, 후처리를 위한 트리거로 사용가능 - 이벤트의 두 번째 용도는 다른 시스템 간의 데이터 동기화

    - 이벤트 장점 - 서로 다른 도메인 로직 섞이는 것을 방지 - 이벤트 핸들러를 통한 용이한 기능 확장

    - 비동기 이벤트 처리 - 로컬 핸들러를 비동기로 실행 - 메시지 큐 사용 - 이벤트 저장소, 이벤트 포워더, 이벤트 제공 API

    - 스프링에서는? - ApplicationEventPublisher - ApplicationEvent 상속 - ApplicationEventPublisher.publishEvent(); - ApplicationEventPublisherAware - ApplicationListener 상속 - @EventListener - @Order - @Async (@EnableAsync)

스프링부트 이벤트리스너

  • Spring Event(1) - 스프링 4.2 이하 - ApplicationEvent를 상속받아 구현한 이벤트 객체 - ApplicationListener 인터페이스를 구현한 이벤트 리스너
  • Spring Event(2) - 스프링 4.2 부터 - @EventListener를 활용한 이벤트 정의