◈ 이 책에서 다루는 내용 ◈
◆ 스프링 부트를 사용한 리액티브 마이크로서비스 구축
◆ 스프링 클라우드를 사용해 복원력 및 확장성 있는 마이크로서비스 개발
◆ 스프링 시큐리티 및 OAuth 2.1/OIDC를 사용해 공개 API 보호
◆ 도커를 사용해 개발, 테스트 환경과 상용 환경 사이의 격차 해소
◆ 쿠버네티스를 사용한 마이크로서비스 배포 및 관리
◆ 이스티오를 사용한 보안성, 관찰 가능성, 트래픽 관리 편의성 향상
◆ JUnit, Testcontainers, 그래들(Gradle), 배시(Bash)를 사용해 자동화된 마이크로서비스 테스트 작성 및 실행
◈ 이 책의 대상 독자 ◈
쿠버네티스를 컨테이너 오케스트레이터(container orchestrator)로 사용하고 이스티오를 서비스 메시(service mesh)로 사용해, 기반 마이크로서비스 환경을 구축하고 온프레미스(onpremise)나 클라우드로 배포하는 방법을 배우려는 자바, 스프링 개발자와 아키텍트를 위한 책이다. 마이크로서비스 아키텍처(microservice architecture)에 익숙하지 않더라도 문제없이 읽을 수 있다.
◈ 이 책의 구성 ◈
1장, ‘마이크로서비스 소개’에서는 이 책의 기본 전제인 마이크로서비스의 필수 개념과 디자인 패턴을 설명한다.
2장, ‘스프링 부트 소개’에서는 스프링 부트와 책의 앞부분에서 사용할 오픈소스 프로젝트를 소개한다. RESTful API 개발에 사용하는 스프링 웹플럭스, OpenAPI 기반 API 문서를 생성하는 springdoc-openapi, SQL 및 NoSQL 데이터베이스에 데이터를 저장할 때 사용하는 스프링 데이터, 메시지 기반의 마이크로서비스에서 사용하는 스프링 클라우드 스트림, 마이크로서비스를 컨테이너로 실행하는 도커 등을 소개한다.
3장, ’공조 마이크로서비스 집합’에서는 생성 공조 마이크로서비스 집합을 생성하는 방법을 설명한다. 스프링 이니셜라이저(Spring Initializr)를 사용해 스프링 프레임워크 5.3 및 스프링 부트 2.5 기반의 골격 프로젝트를 생성하고 세 가지 핵심 서비스를 만든다. 또한 세 가지 핵심 서비스에서 얻은 정보를 집계해 복합적 결과를 만드는 복합 서비스도 만든다. 3장의 뒷부분에선 스프링 웹플럭스(Spring WebFlux)를 기반으로 기본적인 RESTful API를 추가하는 방법을 배우며, 4장에서는 더 많은 기능을 마이크로서비스에 추가한다.
4장, ‘도커를 사용한 마이크로서비스 배포’에서는 도커를 사용해 마이크로서비스를 배포하는 방법을 설명한다. Dockerfile이나 docker-compose 파일을 이용해 전체 마이크로서비스 환경을 하나의 커맨드로 시작하는 방법을 배우고, 여러 스프링 프로필을 사용해 도커용 구성과 이외의 구성을 분리해서 처리하는 방법도 살펴본다.
5장, ‘OpenAPI를 사용한 API 문서화’에서는 OpenAPI를 사용해, 마이크로서비스에서 공개하는 API를 빠르게 문서화하는 방법을 배운다. 서비스 코드에 붙인 애노테이션(annotation)을 검사해 OpenAPI 기반의 API 문서를 생성하는 springdoc-openapi와 웹 브라우저에서 API를 테스트하는 스웨거 UI(Swagger UI)를 사용해본다.
6장, ‘영속성 추가’에서는 마이크로서비스 데이터에 영속성을 부여하는 방법을 배운다. 스프링 데이터를 사용해 두 핵심 마이크로서비스의 데이터를 문서 데이터베이스인 MongoDB에 저장 및 접근하게 하고, 나머지 마이크로서비스의 데이터는 관계형 데이터베이스인 MySQL에 두고 접근하게 한다. 통합 테스트를 실행할 때는 Testcontainers를 사용해 데이터베이스를 시작한다.
7장, ‘리액티브 마이크로서비스 개발’에서는 리액티브(reactive) 방식을 사용해야 하는 이유와 사용 시기, 종단 간(end-to-end) 리액티브 서비스를 개발하는 방법을 배운다. 논블로킹(non-blocking) 동기 방식 RESTful API, 이벤트 기반 비동기 방식 서비스를 개발하고 테스트하는 방법도 배운다. 또한 MongoDB용 리액티브 논블로킹 드라이버 사용 방법과 일반적인 MySQL용 블로킹 코드 사용 방법을 배운다.
8장, ‘스프링 클라우드 소개’에서는 이 책에서 사용하는 스프링 클라우드 및 스프링 클라우드 컴포넌트를 소개한다.
9장, ‘넷플릭스 유레카를 사용한 서비스 검색’에서는 스프링 클라우드에 넷플릭스 유레카(Netflix Eureka)를 사용해 서비스 검색 기능을 추가하는 방법을 알아본다. 즉 넷플릭스 유레카 기반의 서비스 검색 서버를 시스템 환경에 추가하고, 스프링 클라우드 로드 밸런서(LoadBalancer)를 사용해 다른 마이크로서비스를 찾도록 마이크로서비스를 구성한다. 또한 자동으로 마이크로서비스를 등록하는 방법과 스프링 클라우드 로드 밸런서를 통해 전달된 트래픽을 활성화된 새 인스턴스로 자동 로드 밸런싱하는 방법을 배운다.
10장, ‘스프링 클라우드 게이트웨이를 에지 서버로 사용’에서는 스프링 클라우드 게이트웨이를 사용해 마이크로서비스를 에지 서버(edge server) 뒤로 숨기고, 골라낸 일부 API만 외부 소비자에게 공개하는 방법을 배운다. 또한 외부 소비자가 볼 수 없도록 마이크로서비스 내부의 복잡성을 숨기는 방법을 살펴본다. 즉 스프링 클라우드 게이트웨이 기반의 에지 서버를 시스템 환경에 추가하고 공개 API만 노출하도록 에지 서버를 구성한다.
11장, ‘API 접근 보안’에서는 OAuth 2.0 및 OpenID Connect를 사용해 공개 API를 보호하는 방법을 설명한다. Spring Authorization Server 기반의 OAuth 2.0 권한 서버를 시스템 환경에 추가하는 방법과 해당 권한 서버에서 발급한 유효한 접근 토큰을 가진 클라이언트만 에지 서버와 복합 서비스에 접근할 수 있도록 구성하는 방법을 배운다. 또한 에지 서버를 통해 권한 부여 서버를 공개하고 HTTPS를 사용해 외부 소비자와의 통신을 보호하는 방법을 알아본다. 마지막으로, 내부 OAuth 2.0 인증 서버를 외부 OpenID Connect 공급자인 Auth0로 교체하는 방법을 배운다.
12장, ‘구성 중앙화’에서는 하나의 중앙 구성 저장소에서 모든 마이크로서비스의 구성 파일을 가져오고, 구성 서버를 사용해 런타임(runtime)에 마이크로서비스로 구성을 배포하는 방법을 배운다. 또한 시스템 환경에 스프링 클라우드 컨피그 서버(Spring Cloud Config Server)를 추가하고 스프링 컨피그 서버(Spring Config Server)에서 구성을 가져오도록 마이크로서비스를 구성하는 방법을 살펴본다.
13장, ‘Resilience4j를 사용한 복원력 개선’에서는 Resilience4j의 기능을 이용해 연쇄 장애(chain of failure) 같은 안티 패턴(anti-pattern)을 방지하는 방법을 설명하며, 복합 서비스에 재시도 메커니즘과 서킷 브레이커(circuit breaker)를 추가하는 방법을 배운다. 서킷이 열려 있을 때 빠른 실패 로직이 작동하도록 서킷 브레이커를 구성하는 방법과 폴백 메서드(fallback method)를 사용해 최적화된 응답을 생성하는 방법도 배운다.
14장, ‘분산 추적’에서는 집킨(Zipkin)을 사용해 추적 정보를 수집하고 시각화하는 방법을 설명한다. 또한 스프링 클라우드 슬루스(Spring Cloud Sleuth)로 요청에 추적 ID를 추가해 공조 마이크로서비스 간의 요청 체인을 시각화하는 방법을 배운다.
15장, ‘쿠버네티스 소개’에서는 쿠버네티스의 핵심 개념과 샘플 디플로이먼트(sample deployment) 생성 방법을 설명한다. 미니큐브(Minikube)를 사용해 개발 및 테스트 용도의 쿠버네티스를 로컬에 설치하는 방법을 배운다.
16장, ‘쿠버네티스에 마이크로서비스 배포’에서는 쿠버네티스에 마이크로서비스를 배포하는 방법을 설명하며, 헬름(Helm)을 사용해 쿠버네티스에 배포할 마이크로서비스를 패키징하고 구성하는 방법을 배운다. 테스트 환경, 상용 환경 등 다양한 런타임 환경에 헬름을 사용해 마이크로서비스를 배포한다. 또한 쿠버네티스 서비스 객체와 kube-proxy 런타임 컴포넌트를 기반으로 하는, 쿠버네티스에 내장된 서비스 검색 기능으로 넷플릭스 유레카를 대체하는 방법을 배운다.
17장, ‘쿠버네티스로 기존 시스템 환경 대체’에서는 앞에서 소개한 스프링 클라우드 서비스를 쿠버네티스 기능으로 대체하는 방법을 설명한다. 스프링 클라우드 컨피그 서버를 쿠버네티스 시크릿과 컨피그맵(ConfigMap)으로 대체하는 이유와 방법을 배운다. 또한 스프링 클라우드 게이트웨이를 쿠버네티스 인그레스(Kubernetes Ingress) 객체로 대체하는 방법과 cert-manager를 사용해 외부 HTTPS 엔드포인트를 위한 인증서를 자동으로 프로비저닝하고 갱신하는 방법을 배운다.
18장, ‘서비스 메시를 사용해 관찰 가능성 및 관리 편의성 개선’에서는 서비스 메시 개념을 소개하고 이스티오를 사용해 쿠버네티스에 서비스 메시를 구현하는 방법을 설명한다. 서비스 메시를 사용해 마이크로서비스 환경의 복원력, 보안, 트래픽 관리, 관찰 가능성을 향상하는 방법을 배운다.
19장, ‘EFK 스택을 사용한 로깅 중앙화’에서는 일래스틱서치(Elasticsearch), 플루언티드(Fluentd), 키바나(Kibana)를 사용해 마이크로서비스의 로그 스트림(log stream)을 수집, 저장, 시각화하는 방법을 설명한다. 미니큐브에 EFK 스택을 배포하는 방법과 EFK 스택으로 수집한 로그 레코드를 분석하는 방법, 여러 마이크로서비스가 관련된 요청을 처리하면서 발생하는 마이크로서비스 로그 출력을 찾는 방법을 배운다. 또한 EFK 스택을 사용해 근본 원인 분석을 수행하는 방법을 알아본다.
20장, ‘마이크로서비스 모니터링’에서는 프로메테우스와 그라파나를 이용해 쿠버네티스에 배포된 마이크로서비스를 모니터링하는 방법을 설명한다. 기존 그라파나 대시보드를 활용해 다양한 유형의 메트릭을 모니터링하는 방법과 직접 대시보드를 만드는 방법을 배운다. 마지막으로, 그라파나에서 특정 메트릭에 임곗값을 구성하고, 이를 초과하면 이메일을 전송하는 경고를 생성하는 방법을 배운다.
21장, ‘맥OS용 설치 지침’에서는 맥OS(MacOS)에 이 책에서 사용하는 도구를 설치하는 방법을 설명한다.
22장, ‘윈도우용 설치 지침’에서는 윈도우 PC에 리눅스용 윈도우 하위 시스템 v2(WSL 2, Windows Subsystem for Linux 2)를 사용해 이 책에서 사용하는 도구를 설치하는 방법을 설명한다.
23장, ‘자바 마이크로서비스의 네이티브 컴파일’에서는 스프링 네이티브(Spring Native) 베타 버전과 그랄VM 네이티브 이미지 컴파일러(GraalVM native-image compiler)를 사용해 스프링 기반 마이크로서비스를 네이티브 코드로 컴파일하는 방법을 설명한다. 자바 VM(Java Virtual Machine) 기반 마이크로서비스보다 시작 속도가 월등히 빠른 마이크로서비스를 생성할 수 있다.
각 장의 말미에는 해당 장에서 다루는 내용을 정리하는 데 도움이 되는 간단한 질문이 몇 개씩 있다. 질문에 대한 답은 깃허브 저장소에 있는 Assessments 파일에 있다.
◈ 옮긴이의 말 ◈
시스템 통합이나 엔터프라이즈 업계에서 일하는 자바 개발자라면 갑작스럽게 밀어닥친 마이크로서비스 열풍과 이를 보조하는 도커, 쿠버네티스 등 컨테이너 기반 환경의 인기에 부담감을 느낄 수밖에 없을 것이다. 좀 더 유연하고 확장성 있는 서비스를 위한 시대적인 요구에 따른 것이라곤 하지만, 개발 자체가 아닌 기반 환경의 변화에 따라 맞닥뜨린 급격한 학습 곡선은 개발자에게 그리 달가운 상황은 아니기 때문이다.
이런 새로운 변화에 따른 학습이 필요하다고 느낀다면 이 책이 좋은 선택이 될 것이다. 개발자와 아키텍트가 편하게 볼 수 있도록 이론과 실습을 적절히 조합했고, 스프링 부트와 스프링 클라우드를 이용해 마이크로서비스를 구축하는 방법을 설명한다. 또한 다양한 오픈소스 도구를 도입해야 하는 이유와 스프링 애플리케이션과의 연동 방법을 친절하게 알려준다. 넓은 범위를 다루지만 각 기술 요소의 소개보다는 소스 코드 중심으로 실무에 필요한 범위에 맞춰 핵심을 전달하는 책이라고 말할 수 있다.