요약
- 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의 처리 흐름은 다음과 같음
- HTTP POST를 사용해 사용자와 대출할 도서의 일련번호를 받음.
- 도서 일련번호로 도서 서비스를 호출하고 도서 정보를 확인함.
- 내부 영역의 서비스를 호출해 도서 대출을 수행함.
- 처리된 Rental 정보를 DTO로 변환하여 HTTP 요청의 본문으로 담아 클라이언트에 반환함.
- 이렇게 REST 컨트롤러를 통해 외부와의 API 약속을 통해 내부 영역의 도메인 기능을 적절히 공개하게 됨.
- 다음 섹션에서는 도서 서비스를 동기 호출하여 상세 도서 정보를 가져오는 외부 영역 아웃바운드 처리에 대해 설명함.
7.1.10 외부 영역 - 아웃바운드 어댑터 개발(동기 호출)
- 아웃바운드 어댑터는 서비스와 REST API 컨트롤러가 다른 서비스에 데이터를 요청하거나 전송하는 과정을 도와줌.
- 예를 들어, 도서 대출 REST 컨트롤러(RentalResource)는 도서 마이크로서비스의 정보를 검증하고 상세 정보를 요청하기 위해 도서 마이크로서비스에 대한 REST 클라이언트(BookClient)를 사용함.
- 또한 도서 대출이 완료되면, 도서의 상태를 변경하고 도서가 대출 중임을 알리는 처리를 위해 아웃바운드 비동기 어댑터를 통해 메시지 이벤트를 전송함.
- 이러한 아웃바운드 어댑터 처리의 구현을 이해하기 위해, 두 가지 주요 요소를 살펴볼 예정임
- 페인 라이브러리를 활용한 동기 메시지 호출(BookClient)
- 카프카 메시지 큐를 활용한 비동기 메시지 전송(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 인터페이스에 대한 구현체를 생성하도록 만들 수 있음.
- 이 설정 이후에는 비동기 메시지 전송 처리를 위해 카프카를 사용하여 구현할 계획이라고 말함.
댓글