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

요약

  • 7장. 사례연구 - 백엔드 마이크로서비스 구현에 대한 내용
    • 도서 대출 마이크로서비스 개발 (나머지 부분)
      • 내부 영역 - 리포지토리 개발
      • 외부 영역 - REST 컨트롤러 개발
      • 외부 영역 - 아웃바운드 어댑터 개발(동기 호출)
        • 타 서비스에 대한 동기 호출: 페인 클라이언트 연결
        • EnableFeignClients 처리

메모

7.1.8 내부 영역 - 리포지토리 개발

  • RentalRepository는 Spring Data JPA의 Repository 인터페이스를 확장함.
    • 이것은 데이터의 CRUD(Create, Read, Update, Delete) 처리를 담당하며, 이러한 기본 CRUD 메서드 외에도 필요에 따라 추가 메서드를 제공함.
  • 리포지토리 패턴은 도메인 계층과 인프라스트럭처 계층을 분리하여 계층 간의 결합도를 낮추는 역할을 함.
    • 이 패턴은 도메인 객체의 생명주기, 즉 영속성을 관리함.
  • Spring Data JPA를 사용하면 반복적인 SQL 문 작성을 피할 수 있으며, 런타임 시 동적으로 구현체를 주입하여 필요한 기능을 제공함.
    • 예를 들어, findByUserId 메서드는 사용자 일련번호로 검색하는 추가적인 기능을 제공함.
    • 이런 식으로 메서드 이름에 따라 자동으로 쿼리가 생성되어 실행됨.
  • 이 섹션의 중요한 부분은 내부 영역인 도메인 모델과 서비스의 구현을 완료하고 이것이 리포지토리를 통해 저장되는 방법을 설명함.
    • 이 내부 영역의 기능은 서비스 인터페이스를 통해 외부 영역에 공개됨.
    • 내부 영역의 구조는 특정 기술에 의존하지 않아, 도서 대출 업무를 이해하는 데 있어 누구나 쉽게 접근할 수 있음.
    • 이것이 바로 도메인 모델링의 큰 장점임

7.1.9 외부 영역 - REST 컨트롤러 개발

  • REST 컨트롤러는 프런트엔드에 제공할 API를 발행하며, 이를 통해 비즈니스 로직이 활용됨
    • 이 과정에서 비즈니스 로직 처리는 내부 영역의 서비스 구현체에 위임되며, 컨트롤러는 주로 API 변환 작업을 수행함.
  • 이어서, 대출 서비스의 REST 컨트롤러인 RentalResource의 예시가 주어짐.
    • 이 컨트롤러에서는 도서 대출 API와 도서 반납 API를 제공함.
    • 각 API는 HTTP 표준 메서드인 POST와 DELETE를 사용하며, 리소스명은 도서 대출과 도서 반납의 기능을 명확하게 표현함.
  • REST 컨트롤러는 서비스를 호출하여 필요한 비즈니스 로직을 처리하며, 이를 통해 도서 대출과 도서 반납 처리를 수행함.
  • 도서 대출 API의 처리 흐름은 다음과 같음
    1. HTTP POST를 사용해 사용자와 대출할 도서의 일련번호를 받음.
    2. 도서 일련번호로 도서 서비스를 호출하고 도서 정보를 확인함.
    3. 내부 영역의 서비스를 호출해 도서 대출을 수행함.
    4. 처리된 Rental 정보를 DTO로 변환하여 HTTP 요청의 본문으로 담아 클라이언트에 반환함.
  • 이렇게 REST 컨트롤러를 통해 외부와의 API 약속을 통해 내부 영역의 도메인 기능을 적절히 공개하게 됨.
    • 다음 섹션에서는 도서 서비스를 동기 호출하여 상세 도서 정보를 가져오는 외부 영역 아웃바운드 처리에 대해 설명함.

7.1.10 외부 영역 - 아웃바운드 어댑터 개발(동기 호출)

  • 아웃바운드 어댑터는 서비스와 REST API 컨트롤러가 다른 서비스에 데이터를 요청하거나 전송하는 과정을 도와줌.
  • 예를 들어, 도서 대출 REST 컨트롤러(RentalResource)는 도서 마이크로서비스의 정보를 검증하고 상세 정보를 요청하기 위해 도서 마이크로서비스에 대한 REST 클라이언트(BookClient)를 사용함.
    • 또한 도서 대출이 완료되면, 도서의 상태를 변경하고 도서가 대출 중임을 알리는 처리를 위해 아웃바운드 비동기 어댑터를 통해 메시지 이벤트를 전송함.
  • 이러한 아웃바운드 어댑터 처리의 구현을 이해하기 위해, 두 가지 주요 요소를 살펴볼 예정임
    1. 페인 라이브러리를 활용한 동기 메시지 호출(BookClient)
    2. 카프카 메시지 큐를 활용한 비동기 메시지 전송(RentalKafkaProducer)
  • 페인 라이브러리와 카프카 메시지 큐를 이용하여 다른 서비스와의 데이터 교환 및 비즈니스 로직의 실행을 돕는 아웃바운드 어댑터의 역할과 구현에 대해 더 자세히 알아보게 됨.

타 서비스에 대한 동기 호출: 페인 클라이언트 연결

  • 페인은 Spring Cloud Netflix 라이브러리로서, REST 기반 동기 서비스 호출을 추상화함.
    • 이를 사용하면 인터페이스만 구현해도 HTTP 통신을 위한 구체 클라이언트가 생성되므로 웹 서비스 클라이언트 작성이 용이해짐.
  • 페인을 사용하기 위해서는 페인과 히스트릭스 설정을 수정해야 함.
    • 이 설정은 application.yml 파일에서 진행됨.
    • 여기서 주의할 점은 페인과 히스트릭스 설정에서 히스트릭스의 설정이 우선시된다는 것임.
    • 따라서 스레드 타임아웃 값 등을 적절히 설정해야 함.
  • 그 다음으로는 BookClient라는 페인 클라이언트를 구현함.
    • 이 BookClient는 도서 마이크로서비스에 대한 동기 호출을 위한 REST 클라이언트 역할을 함.
    • 구현한 BookClient는 도서 대출 서비스(Rental Service)에서 사용됨.
  • BookClient는 도서 정보를 반환하기 위해 findBookInfo 메서드를 사용함.
    • 이 메서드를 사용하여 Book 서비스의 REST API를 호출하고, 그 결과로 BookInfoDTO라는 객체를 반환받음.
  • 그리고 도서 서비스에서 BookInfoDTO를 수신용 객체로 사용하므로, 해당 클래스에서 생성자를 선언하면 오류가 발생할 수 있음을 주의해야 함.
  • BookClient를 사용하는 측에서는 RentalResource 클래스에서 BookClient 인스턴스를 생성하고 필요한 메서드를 호출하여 통신을 수행함.
  • 마지막으로 페인 클라이언트의 호출을 받는 도서 마이크로서비스의 구현을 보면, 도서 정보를 조회하는 API를 제공하고 있음.
    • 이 API는 클라이언트가 호출하면 도서 정보를 BookInfoDTO로 만들어 반환함.
    • 이 때, 도서 마이크로서비스에서는 생성자가 필요하여 BookInfoDTO에 생성자를 선언한 것이 특징임.

EnableFeignClients 처리

  • 페인 클라이언트를 사용하려면, 해당 서비스의 애플리케이션에 @EnableFeignClients 애너테이션을 추가해야 함.
    • 이 애너테이션은 스프링 부트 애플리케이션에서 @FeignClient 애너테이션으로 선언된 모든 인터페이스를 찾아 구현체를 생성함.
  • 예를 들어, RentalApp 클래스에 @EnableFeignClients 애너테이션을 추가하여 스프링 부트가 BookClient 인터페이스에 대한 구현체를 생성하도록 만들 수 있음.
    • 이 설정 이후에는 비동기 메시지 전송 처리를 위해 카프카를 사용하여 구현할 계획이라고 말함.

댓글

Designed by JB FACTORY