스프링 프레임워크, 특히 최근 클라우드 네이티브(cloud-native) 기반 애플리케이션 구축에 많이 사용되는 스프링 부트 기반에서 데이터 액세스 기술로 인기를 끌고 있는 것이 바로 JPA(Java Persistence API)다. 개별 데이터베이스 시스템마다 네이티브(native) 쿼리를 작성해야 하는 MyBatis나 코드에 직접 쿼리를 작성하는 JDBC 기반 개발은 DBMS 대상을 확대하기가 쉽지 않지만, JPA의 경우 간단한 설정 변경만으로 여러 DBMS와 버전을 손쉽게 지원하는 특징을 갖는다. 무엇보다도 SQL 중심이 아닌 객체지향적 설계 및 개발 방식을 지원한다.
그러나 JPA는 기존에 익숙하던 방식이나 직관적인 다른 데이터 액세스 기술과는 달리 내부적인 처리 메커니즘을 어느 정도 알고 동작 방식을 이해해야 어려움 없이 활용할 수 있다. 즉, 학습 곡선(learning curve)이 가파르다. 특히 잘못 설계된 엔터티(entity)는 성능에 많은 영향을 주기도 하고, 정확하게 설정되지 않은 연관관계(association)는 예외가 발생하는 등의 난항을 겪는 경우가 많다.
이 책은 JPA에 대한 다양한 측면, 특히 성능과 관련된 이슈와 이에 대한 해결 방법을 다룬다. 다만 JPA의 기초를 다루지 않고 JPA 사용에 대한 기본 지식을 갖고 있어야 볼 수 있는 수준으로, JPA를 이미 사용하고 있는 개발자를 위한 레시피(recipe)와 모범 사례(best practices)를 모았다. 실용적인 레시피를 중심으로 구성되고, 각 레시피는 성능 사례 또는 성능 관련 사례를 중점적으로 다루고 있으며 여러 스타일(순수 하이버네이트 사용, 스프링 데이터 JPA 등)로 작성된 온전한 많은 예제를 포함하고 있다.
클라우드 네이티브와 마이크로서비스 아키텍처의 출현과 함께 도커와 같은 컨테이너 기반 시스템 구축과 운영은 급변하는 비즈니스와 기술 변화에 빠르게 적응하기 위한 기업에게는 필수를 넘어 기본이 됐다. 아울러 클라우드와 마이크로서비스를 적극 활용하기 위한 폴리글랏 프로그래밍(polyglot programming)과 다양한 서비스 간 통신 기술은 핵심 기술로 부각되고 있다. 특히 다양한 언어와 시스템과의 효율적인 통신을 위한 gRPC는 중요한 기술로 빠르게 자리 잡았다.
gRPC는 구글 데이터센터에서 수천 개의 여러 서비스를 연결하고자 만들어져 10년 이상 활용된 스터비(Stubby)라는 소프트웨어에서 시작됐고, 2015년 오픈소스로 공개된 이후 넷플릭스와 같은 대형 서비스에 적극적으로 활용되고 있으며, 여러 오픈소스 커뮤니티의 적극적인 지원으로 계속 발전하고 있다. 특히 현재 공식적으로 지원되는 언어는 여러 시스템 환경과 컴파일러를 포함하여 C/C++, C#, 자바, 파이썬, 루비 등의 전통적인 언어뿐만 아니라 오브젝티브C, Go, Node.js, 다트(Dart), 코틀린(Kotlin) 등 비교적 최신 언어도 포함한다.
이 책은 gRPC 기본적인 활용의 실제 사례를 기반으로 다양한 가이드를 제공할 뿐만 아니라 기존 통신 기술과의 비교를 통해 애플리케이션 간 통신을 설계하는 소프트웨어 아키텍트에게 훌륭한 지침을 제공한다. 또한 여러 통신 패턴과 내부 동작 방식을 깊이 있게 설명해 통신 기술을 포괄적으로 이해할 수 있도록 돕고, 서비스 수준의 실제 적용 시에 고려돼야 할 다양한 기술 요소를 자세하게 설명한다. 인증과 접근 통제, 서비스 확장을 위한 로드밸런싱 등의 고급 기술을 포함하며, 개발 주기에 필요한 테스팅, CI/CD 통합과 다양한 모니터링 기술도 잘 제시하고 있다.
이 책이 gRPC 통신 기술을 활용한 견고한 애플리케이션과 마이크로서비스 개발에 토대가 되기를 희망한다.