책너두 (도메인 주도 설계로 시작하는 마이크로서비스 개발) 31일차 (~265p)

요약

  • 7장. 사례연구 - 백엔드 마이크로서비스 구현에 대한 내용
    • 도서 대출 마이크로서비스 개발 (나머지 부분)
      • 외부 영역 - 아웃바운드 어댑터 개발(비동기 호출 EDA 구현)
        • 타 서비스에 대한 비동기 호출 처리: 카프카를 이용한 EDA 구현(Rental과 Book)
        • 대출 서비스에 카프카 Producer 만들기
        • 도메인 이벤트 객체 - StockChanged.java
        • 도서 마이크로서비스에 컨슈머(Consumer) 어댑터 구현하기

메모

7.1.11 외부 영역 - 아웃바운드 어댑터 개발(비동기 호출 EDA 구현)

타 서비스에 대한 비동기 호출 처리: 카프카를 이용한 EDA 구현(Rental과 Book)

  • 대출 마이크로서비스에서 도서가 대출 또는 반납 처리될 때마다, 도서 마이크로서비스는 해당 도서의 상태를 각각 '대출 불가능'과 '대출 가능'으로 변경해야 함.
  • 서비스가 분리된 상황에서는 도메인 이벤트를 비동기 통신으로 전송하여 각 서비스의 비즈니스 일관성을 유지하게 됨.
    • 이벤트 기반 아키텍처를 통해 각 서비스는 독립성을 유지하면서, 다른 서비스의 이벤트 변화에 따라 연계될 수 있음.
  • 비동기 메시지 처리 메커니즘의 신뢰성을 보장하기 위해 메시지 큐가 필요하며, 이 책에서는 이를 위해 아파치 카프카를 사용함.

대출 서비스에 카프카 Producer 만들기

  • 아웃바운드 어댑터 인터페이스인 RentalProducer와 그 구현체인 RentalProducerImpl이 생성되어 대출 서비스와 카프카 사이의 메시지 전송을 담당함.
  • RentalProducer 인터페이스는 세 가지 메소드를 포함함.
    • 도서 서비스의 도서 상태 변경을 위한 updateBookStatus
    • 사용자 서비스의 포인트 적립을 위한 savePoints
    • 도서 카탈로그 서비스의 도서 상태 변경을 위한 updateBookCatalogStatus
      • 이 세 가지 메소드는 각각 카프카의 서로 다른 토픽(TOPIC_BOOK, TOPIC_POINT, TOPIC_CATALOG)으로 메시지를 전송함.
        • 이를 위해 RentalProducerImpl에서는 ObjectMapper를 사용해 도메인 이벤트를 문자열 메시지 형태로 변경하고, 이를 ProducerRecord에 담아서 카프카로 전송함.
  • 이 방식을 사용하면, 다음 세 가지 상황에서 비동기 이벤트 메시지를 발행할 수 있음.
    1. 도서 마이크로서비스의 도서 상태를 변경하는 경우
    2. 포인트를 적립하는 경우
    3. 도서 카탈로그 마이크로서비스의 도서 상태를 변경하는 경우
  • 이렇게 하면 도서 대출 시 도서 마이크로서비스의 도서 상태를 업데이트하기 위해 StockChanged 이벤트를 발행하고, 사용자 서비스에 포인트를 적립하는 PointChanged 이벤트를 발행하며, 도서 카탈로그 마이크로서비스의 도서 대출 상태를 변경하기 위해 BookCatalogChanged 이벤트를 발행하게 됨.
    • 이는 각 마이크로서비스의 비즈니스 로직이 독립적으로 유지되면서도 이벤트 기반으로 통합될 수 있음을 보여줌.

도메인 이벤트 객체 - StockChanged.java

  • StockChanged는 도서 재고 상태 변경을 위한 도메인 이벤트 객체로, 도서 일련번호와 도서 상태를 가지고 있음.
    • 이 도메인 이벤트 객체는 도서 마이크로서비스의 재고 상태를 변경하는 데 사용됨.
  • 서비스 구현체인 RentalServiceImpl에서는 RentalProducerService를 통해 이 도메인 이벤트를 비동기 메시지로 전송함.
    • 예를 들어, 책을 반납한 후에는 RentalProducerService.updateBookStatus(bookId, "AVAILABLE")를 호출하여 도서 마이크로서비스에서 책 상태를 "AVAILABLE"로 변경하도록 메시지를 보냄.
  • 이런 식으로 메시지가 카프카로 성공적으로 발행되면, 이제 이 메시지를 구독할 도서 마이크로서비스의 컨슈머(Consumer)를 만들 수 있음.
    • 이 컨슈머는 발행된 메시지를 받아서 도서 서비스의 상태를 실시간으로 업데이트하는 역할을 담당하게 됨.

도서 마이크로서비스에 컨슈머(Consumer) 어댑터 구현하기

  • 컨슈머는 들어오는 인바운드 어댑터이며, BookConsumer 클래스로 구현됨.
    • 이 클래스는 KafkaProperties와 BookService를 이용하여 카프카로부터 메시지를 읽고, 이 메시지를 처리함.
  • 구현된 컨슈머는 카프카로부터 메시지를 읽어, 그 메시지를 StockChanged 도메인 이벤트로 변환함.
    • 변환된 이 도메인 이벤트 정보를 사용하여 BookService를 호출하고, 도서의 재고 상태를 업데이트 함.
      • 이때 사용하는 StockChanged 클래스는 대출 마이크로서비스의 StockChanged 클래스와 동일하며, 도서 일련번호와 도서 상태를 가지고 있음.
  • 이렇게 구현된 시스템에서는, 대출이 발생하면 대출 마이크로서비스의 RentalServiceImpl에서 아웃바운드 어댑터 인터페이스인 RentalProducer를 호출하여 StockChanged 도메인 이벤트를 발행함.
    • 도서 마이크로서비스의 컨슈머인 BookConsumer는 이 도메인 이벤트를 받아 도서의 대출 상태를 변경하며, 이를 통해 전체 시스템의 비즈니스 일관성을 유지함.
  • 이 구현을 통해 내부 영역과 외부 영역을 연결하며, 다른 마이크로서비스와의 동기/비동기 호출을 위한 어댑터를 구현하였음.
    • 특히 이 어댑터는 의존성 역전의 원칙에 따라 내부 영역에 위치하므로, 어댑터의 인터페이스만 만족하면 카프카 외의 어떤 메시지 큐로도 변경될 수 있음.

댓글

Designed by JB FACTORY