[이 책의 구성]1부 '기초'1장 '클라우드 네이티브 애플리케이션'과 2장 '부트캠프: 스프링 부트와 클라우드 파운드리 소개'에서는 클라우드 네이티브 사고(thinking)의 필요성에 대해 살펴보고 스프링 부트와 클라우드 파운드리를 소개한다.3장 '12요소 애플리케이션 설정'에서는 스프링 부트 애플리케이션을 설정하는 방법을 알아본다. 이 내용은 책 전반에 걸쳐 계속 나온다.4장 '테스트'에서는 가장 단순한 컴포넌트에서 분산 시스템에 이르기까지 스프링 애플리케이션을 테스트하는 방법에 대해 알아본다.5장 '애플리케이션 마이그레이션'에서는 일반적인 보통의 애플리케이션을 클라우드 파운드리와 같은 클라우드 플랫폼으로 이전하는 데 필요한 리팩토링을 가볍게 살펴보고, 여러분이 클라우드 플랫폼으로부터 필요한 가치를 얻을 수 있도록 도와줄 것이다.2부 '웹 서비스'6장 'REST API'에서는 스프링으로 RESTful HTTP 서비스를 만들어본다. 이 장에서 다루는 내용은 API 개발과 도메인 주도 개발에서 많이 사용된다.7장 '라우팅'에서는 분산 시스템에서 요청(request)의 출입을 제어하는 일반적인 방법을 알아본다.8장 '엣지 서비스'에서는 외부로부터의 요청을 받아들이는 첫 번째 관문 역할을 하는 서비스를 만드는 방법을 알아본다.3부 '데이터 통합'9장 '데이터 관리'에서는 스프링 데이터를 사용해서 스프링 애플리케이션에서 데이터를 관리하는 방법을 알아본다. 여기에서 다루는 내용은 도메인 주도 사고의 기초가 된다.10장 '메시징'에서는 스프링의 이벤트 주도, 메시징 중심 아키텍처를 이용해서 분산 서비스와 데이터를 통합하는 방법을 알아본다.11장 '배치 프로세스와 태스크'에서는 클라우드 파운드리 같은 클라우드 플랫폼의 확장성을 이용해서 오래 지속되는 작업부하를 처리하는 방법을 알아본다.12장 '데이터 통합'에서는 분산 시스템에서 상태를 관리하는 몇 가지 방법을 알아본다.4부 '운영 환경'13장 '관측 가능한 시스템'에서는 관측성(observability)과 운영을 지원하는 시스템을 만드는 방법을 알아본다.14장 '서비스 브로커'에서는 클라우드 파운드리 같은 플랫폼을 지원하는 서비스 브로커를 만드는 방법을 알아본다. 서비스 브로커는 메시지 큐, 데이터베이스, 캐시처럼 상태를 가진 서비스를 클라우드 플랫폼에 연결해준다.15장 '지속적 전달'에서는 지속적 전달 뒤에 숨어있는 중요한 개념을 살펴본다. 이 책에서는 마지막 장에 해당하지만, 클라우드 네이티브를 향한 여러분의 여정에서는 출발점에 해당한다.5부 '부록'부록 A '자바 EE와 스프링 부트'에서는 스프링 부트 애플리케이션을 자바 EE 환경에 통합하는 방법을 살펴본다. 마지막으로, 한국어판 특별 부록 B '클라우드 파운드리 환경의 준비와 활용'에서는 클라우드 파운드리를 준비하고 애플리케이션을 배포하며 서비스를 준비하는 방법에 대해 알아본다.[이 책의 독자 대상]이 책은 스프링 부트, 스프링 클라우드와 클라우드 파운드리를 이용해서 더 나은 소프트웨어를 더 빠르게 만들고 싶어하는 자바/JVM 개발자를 주요 대상으로 한다. 마이크로서비스라는 용어에 대해 들어본 적이 있고, 하늘 높이 치솟는 스프링 부트의 인기를 느끼고 있으며, 오늘날 대부분의 기업들이 왜 클라우드 파운드리를 사용하는지 궁금하다면, 이 책은 바로 여러분을 위한 책이다.[지은이의 말]소프트웨어는 모두를 평등하게 한다. 소프트웨어는 코드를 통해 사람들에게 새로운 길을 제시하기도 한다. 소프트웨어는 고객에게 가치를 전달할 수 있으며, 사람들의 삶을 송두리째 바꾸기도 한다. 우리 책 『클라우드 네이티브 자바』의 한국어판이 출간된다니 영광이다. 더 많은 사람에게 수많은 길을 터주고 때로는 사람들의 삶을 바꾸는 소프트웨어를 만드는 데 이 책이 조금이라도 기여하기를 바란다. 이 책을 통해 여러분의 코드를 실 서비스로 배포하는 여행을 즐기기를!- 조쉬 롱(Josh Long) / 『클라우드 네이티브 자바』 저자, 스프링 개발자 애드버킷 우리의 책 『클라우드 네이티브 자바』가 한국어로 번역되다니! 윤진과 명운 님, 현희 님, 한국의 번역팀에 감사한다. 클라우드 애플리케이션에서 사용되는 패턴은 이전과 유사한 것도 있고, 새로운 것들도 존재한다. 자바 스프링 개발자들이 클라우드 기반의 애플리케이션을 구현하는 데 어떤 점들을 살펴야 하는지 이 책에 담기 위해 노력했다. 확장성이란 단순히 서버의 숫자를 늘려갈 수 있음을 의미하는 것이 아니다. 더 많은 요청과 워크로드를 처리하기 위해 그에 적합한 기법들을 사용해야 한다. 이런 방법은 애플리케이션의 규모가 크건 작건 언제나 적용될 수 있어야 하며, 이를 통해 각자의 기능을 하는 신축성 있는 애플리케이션을 모아서 하나의 거대한 서비스를 이룰 수 있다. 지난 2016년 한국 방문에서 발표했던 책을 한글로 공개할 수 있게 되어 매우 기쁘며, 많은 스프링 사용자에게 도움이 되기를 바란다.- 케니 바스타니(Kenny Bastani) / 『클라우드 네이티브 자바』 저자, 스프링 개발자 애드버킷 [옮긴이의 말]“소프트웨어를 유지한다는 것은 ‘이전처럼 동작하게 하는 것'이 아니다. ‘변화하는 세상에서도 항상 유용하게 만드는 것’이다.” 스프링 부트 프로젝트의 리드인 피보탈의 필 웹(Phil Webb)은 스프링원 플랫폼 2017 발표(https://youtu.be/MQamx7-bCVI)에서 원자 이론학자 제시카 커(Jessica Kerr)의 말을 인용했다. 오늘날 웹 또는 모바일 기반의 서비스를 제공하는 대부분의 회사는 소프트웨어와 데이터를 다루는 능력, 그 자체가 곧 경쟁력이다. 아이디어를 동작하는 소프트웨어로 구현하고, 이 소프트웨어를 가능한 한 빨리 고객에게 전달해서 그 가치를 검증하는 일을 반복하는 것은 사업의 성패에 매우 중요하다. 필 웹은 그날 발표에서 스프링 프로젝트와 스프링 프레임워크가 발표된 해에 함께 출시된 노키아 6610의 전화기를 예로 들었다. 노키아 6610은 현재도 시장에서 구매할 수 있으며 심지어 수리도 가능하지만 오늘날 아무도 이 전화기를 쓰지 않는다. 대신, 모두가 더 많은 기능이 탑재된 최신 스마트폰을 사용한다. ‘전화기’에 대한 세상의 인식이 바뀌었기 때문이다. 이처럼 변화를 수용하지 못한 기기는 시장에서 외면을 받기 마련이다. 반면 스프링 프로젝트는 여전히 많은 서비스 애플리케이션에서 사용되고 있으며 심지어 최근에는 더욱 더 많은 사용자를 확보하는 중이다. 그 오랜 세월 동안 스프링은 꾸준히 시장의 변화를 반영해 왔기 때문이다. 이어서 필 웹은 스프링 부트 애플리케이션을 시작하고자 할 때 사용하는 스프링 이니셜라이저(http://start.spring.io)의 통계를 예로 들었다. 스프링 MVC에 적용된 다양한 뷰(View) 기술 중 타임리프(Thymeleaf)는 여전히 개발자들이 많이 사용하지만, 벨로시티(Velocity)의 경우는 그 사용량이 점점 줄어들다가 결국 사라졌다. 어느 시점에 스프링 이니셜라이저에서 이 벨로시티의 사용량이 제로가 된 이유는 스프링 팀에서 벨로시티를 더 이상 지원하지 않기로 결정했기 때문이다. 벨로시티 프로젝트는 더 이상 활발하게 진행되지 않고 업데이트가 이루어지지 않았기 때문에, 스프링 사용자들에게 안정성, 보안 등의 측면에서 악영향을 미칠수 있는 벨로시티를 제외했다는 것이다. 피보탈의 클라우드 파운드리 연구 개발 총괄인 온시 파쿠리(Onsi Fakuhouri)는 스프링원 플랫폼 2017 발표(https://youtu.be/_uB5bBsMZIk)에서 "우리가 개념적으로 설정한 목적지에 다다르는 과정은 상상에서처럼 올곧은 것이 아니라 수많은 난관과 어려움이 산재해 있으며, 그런 어려움을 모두 헤치고 막상 도착한 곳은 원했던 목적지가 아닐 수도 있다."고 말했다. 따라서 이런 거대한 위험을 안고 가는 것보다는, 관찰-선택-학습으로 이어지는 과정을 반복해야 한다고 덧붙였다. 우리가 초행길에서 목적지를 찾아 갈 때도 이런 방법을 적용해 볼 수 있다. 스마트폰에서 먼저 지도와 주변 지형을 살피고, 비교하고, 이동한다. 원하는 목적지에 더 빠르게 도달하려면 이 과정을 더 빠르게 반복할 수 있으면 된다. 스프링 프로젝트의 생존에서 우리는 온시가 말한 관찰-실행-학습의 반복 예를 살펴볼 수 있다. 스프링은 이 방법을 바탕으로 시장의 개발자들의 요구를 살피고, 이를 반영해서 그 결과를 관찰한다. 그 결과로 스프링 부트 프로젝트가 탄생했고, 스프링 클라우드 프로젝트가 탄생했다. 시장의 클라우드 기반 애플리케이션에 대한 요구는 더욱 더 강력해졌고, 이는 비단 더 높은 가용성 및 확장성뿐만 아니라 더 잦은 변화를 스프링 프레임워크에서 수용해야 함을 의미했다. 따라서 오늘날의 수많은 스프링 프로젝트는 시장의 변화에 대한 요구를 수용하고 적용했기 때문에 노키아 전화기가 처한 상황과는 다르게 성공적으로 살아남은 결과물인 것이다. 그리고 오늘도 다양한 스프링 프로젝트들이 이 과정을 반복하고 있다. 스프링 부트는 더 이상 우리가 XML 설정에 고통받지 않아도 되는 방법을 제공한다. 매번 반복해야 하는 동일한 설정은 스프링 부트 팀이 제공하고, 개발자들은 필요한 기능을 의존관계 주입을 통해 이전과는 다른 방법으로 사용할 수 있다. 이 외에도 스프링 부트는 ‘재사용성’을 기반으로 한 다양한 장점을 제공한다. 이에 더하여, 스프링 클라우드는 여러분이 클라우드 기반의 애플리케이션을 구현하고자 할 때, 이 분야에 이미 선도적인 애플리케이션을 만들고 있는 넷플릭스나 아마존이 사용하는 기술을 스프링 부트의 방법으로 사용할 수 있도록 제공한다. 누군가가 이미 해결한 어려운 문제를 풀 때, 스프링에 익숙한 개발자라면 넷플릭스가 사용하는 주요 개념을 거의 즉시 적용 가능한 것이다. 뿐만 아니라, 클라우드는 이전에 있어왔던 도구와 이전에는 없었던 도구들을 API 공개를 통해 사용할 수 있게 하는 능력을 제공한다. 오래전부터 있어왔던 관계형 데이터베이스는 예전처럼 서버에 운영팀이 설치해 주는 식으로 준비되지 않는다. 데이터베이스 생성을 위한 API를 사용하면, 개발자는 필요한 데이터베이스를 즉시 얻을 수 있다. 관계형 데이터베이스뿐만 아니라 최근에는 다양한 메시지 큐, NoSQL 데이터베이스, 머신러닝 도구, 데이터소스 간 데이터 이동 지원을 위한 다양하고도 새로운 도구들을 함께 지원한다. 이런 도구들을 개발자의 랩탑이나 데스크탑, 또는 서버에 매번 설치하는 것은 굉장히 어려운 일이다. 넷플릭스는 얼마 전, 풀 사이클 개발자(Full Cycle Developer)라는 개념을 자사의 기술 블로그에 발표했다(https://bit.ly/2k91j0b). 풀 사이클 개발자란 애플리케이션의 수명 주기 전체를 다룰 수 있는 개발자를 말한다. 소프트웨어 수명 주기는 디자인, 개발, 테스트, 배포, 운영, 지원의 흐름을 말한다. 거의 대부분의 조직에서, 하나하나의 단계는 전문가들이 자신의 분야만 다루는 형태로 팀을 조직한다. 이런 조직 문화에서는 그 앞단계나 뒷단계를 자신의 일이 아닌 것으로 취급하거나, 전문성이 없으므로 서로 관여하지 않는 문화로 발전한다. 서로 관여하지 않는 사람들, 팀들이 공통된 하나의 소프트웨어에 관여하는 방식은 소프트웨어를 유지하는 데 상당한 비용이 들며, 더욱이 소프트웨어의 필요성을 유지하는 데 매우 해로운 방법이다. 이에 반해 넷플릭스는 자사의 모든 개발자가 자신이 만든 코드를 스스로 운영할 수 있는 방법을 만들어 적용하고 있다. 즉 소프트웨어 수명 주기 전체를 개발자가 직접 관리하게 하는 것이다. 이것이 가능한 핵심 요인은 바로 개발자들에게 사용이 편리한 다양한 플랫폼 도구를 제공하는 것이다. 자신의 소프트웨어를 직접 운용할 때 필요한 관찰을 쉬운 모니터링으로 제공하고, 실행을 배포와 연결로서 지원하며, 로그와 로그의 분석을 통한 학습을 위한 도구를 제공하는 것이다. 그리고 클라우드 파운드리는 정확히 이 지점에 위치한다. 모니터링, 로깅, 배포와 애플리케이션의 운영 환경 제공을 통해 개발자들은 풀 사이클 개발자에 한걸음 더 가까워질 수 있을 것이다.스프링 애플리케이션과 이 스프링 애플리케이션이 동작하는 클라우드 파운드리 환경의 조합을 통해, 여러분은 필 웹과 온시 파쿠리가 언급한 "시장의 변화에 적응하고, 언제나 필요한 애플리케이션으로 유지할 수 있는데 필요한 관찰-실행-학습의 반복"을 더욱 빠르게 실행할 수 있다. 클라우드 파운드리가 없어도 직접 서버를 설정하는 방법을 사용할 수 있겠지만, 이 방법이 클라우드 파운드리가 제공하는 방법보다 빨라지기 위해서는 아마도 수많은 별도의, 그리고 누군가는 이미 했던 일의 반복일 것이다. 이 시간에 스프링 애플리케이션 자체에 집중하는 것이, 여러분에게 더 도움이 되지 않을까 한다. 이 책 『클라우드 네이티브 자바』에서는 예전의 개발 방식에 익숙한 개발자들에게 '현 시대에 필요한 개념과 기술'을 스프링의 방법으로 제공할 것이다. 따라서 스프링에 익숙한 개발자라면, 빠른 속도로 현대 개발 기술을 습득할 수 있도록 돕는 역할을 수행하리라 믿는다. 이 책은 여러분의 소프트웨어가 항상 유용할 수 있도록, 변화를 수용할 수 있는 스프링 도구들을 소개한다. 이일민 님이 지은 『토비의 스프링』이 클라우드 시대 이전의 자바 개발자에게 스프링의 길을 열어준 책이라면, 이 『클라우드 네이티브 자바』는 클라우드가 기본인 시대에 필요한 기술을 스프링 개발자들에게 전달하는 입문서와 같은 책이다. 또한, 이 책에서는 클라우드 파운드리를 소개하며 여러분이 작성한 스프링 애플리케이션이 클라우드의 장점을 바탕으로 동작하는 환경을 제공하는 동시에, 스프링 애플리케이션에 필요한 다양한 서비스들을 즉시 준비해서 연결할 수 있는 방법을 설명한다. 애플리케이션과 데이터 서비스 간 사용하는 '바인딩(binding)'이라는 방법은, 개발자가 데이터소스에 대한 네트워크 정보나 인증 정보 등을 알 필요가 없도록 시스템에서 연결을 제공하는 것을 말한다. 즉 연결에 필요한 정보들은 시스템이 알아서 처리하게 하고, 개발자는 필요한 데이터소스의 이름만 알면 애플리케이션에 바인딩해서 사용할 수 있는 환경을 제공한다. 이것은 개발 편의만을 제공하는 것이 아니라, 클라우드 환경 위에서 언제든 생성되고 사라질 수 있는 정보의 취급 방법을 변경함으로써 확장성과 가용성을 높이는 방법이기도 하다. 아울러, 바인딩뿐만 아니라, 마이크로서비스 구현을 위한 기법들도 소개한다. 마이크로서비스에 관한 대부분의 첫 질문이 데이터의 분리에 관한 것인데, 9장, '데이터 관리'에서는 경계 지어진 컨텍스트를 바탕으로 일반적인 리테일 서비스의 데이터 구분 방법과, 각 데이터에 맞는 데이터 스토어 선택 방법을 스프링 코드와 함께 알려준다. 이 책에서 다루는 내용은 생각보다 매우 광범위하며, 저자들의 폭넓은 설명은 빠른 변화의 수용과 클라우드 기반 환경에서의 애플리케이션 구동에 필요한 내용을 전반적으로 아우른다. 독자들은 이 책 한 권만으로도 다른 수많은 서적을 별도로 읽어 취합해야 볼 수 있는 내용을 한꺼번에 둘러 볼 수 있으며, 필요한 경우에는 좀 더 알고자 하는 부분을 특정해서 서술하는 다른 책을 살펴보는 방식의 접근을 취할 수 있다. "꼭 바꿔야 할 필요는 없다. 생존은 의무가 아니다." 이 역설적 표현은 시장에서의 생존이 각자의 선택이며, 시대의 변화에 따른 적응에 실패하는 것을 의미한다. 이 책은 변화하는 환경에 적응하고 생존하기에 관심이 있는 엔터프라이즈 스프링 개발자분들께 스프링 전문가들이 선사하는 최고의 선물일 것이다. - 옮긴이 일동90년대 후반, 2000년대 초반을 지나 개인 컴퓨터와 인터넷의 발달은 동시에 서버 시장과 서버 애플리케이션의 확산을 불러왔다. 이후 모바일 폭발로 불리는 현상이 스마트폰의 등장과 함께 발생하며, 폭발적으로 성장한 클라이언트 요청 규모를 처리가 가능한 클라우드가 등장했다. 이 새로운 환경에 적합한 애플리케이션을 만들면, 이 거대한 클라이언트 요청에 부합하여 전례없는 규모의 확장과 빠른 배포가 가능하다. 이 책은 자바 스프링 개발자들에게 이러한 확장과, 더 빠른 배포에 적합한 '클라우드 네이티브' 애플리케이션을 만드는 데 필요한 기술을 담고 있다. 클라우드에 관심 있는 엔터프라이즈 자바 개발자 분들에게 꼭 필요한 책이다. - 정윤진마이크로서비스라는 말을 들어본 지 5년이 넘은 것 같습니다. 작게 나누어 빨리 만들고 빨리 실패하고 빨리 진화시키는 일이 말처럼 쉬운 일은 아니지만 분명한 장점이 있기 때문에 많은 시행 착오에도 불구하고 꾸준히 시도되고 있습니다. 이제는 여기에서 한걸음 더 나아가 배포 환경을 클라우드로 가져가면서 데브옵스로의 전환이 시작되고 있습니다. 이 책은 클라우드 네이티브 개발의 A to Z와 같은 책으로서 개념 정리 및 상세한 예제를 통해 여러분을 클라우드 네이티브 개발의 세계로 이끌어 줄 것입니다. - 오명운마이크로서비스 아키텍처는 이제 클라우드 기반의 분산 환경을 기반으로 하는 애플리케이션 개발 분야에서 주류 아키텍처로 자리매김하고 있지만, 제대로 된 마이크로서비스 아키텍처를 구축하고 이를 기반으로 확장성 있는 애플리케이션을 개발하는 것은 결코 쉬운 일이 아닙니다. 저는 지금 약 5년째 마이크로서비스 기반의 애플리케이션을 C#으로 개발 중이지만, 이 책을 번역하면서 자바 개발자들에 대한 부러움에 몸서리를 칠 수밖에 없었습니다. 마이크로서비스를 구현하기 위해 필요한 모든 플랫폼이 준비된 환경이 제게도 허락되었다면 저의 지난 5년이 이처럼 어렵고 힘들지는 않았을 테지요. 이 책은 클라우드 네이티브 애플리케이션을 마이크로서비스 아키텍처를 기반으로 개발하고 운영하기 위해 필요한 정보를 폭넓게 다루는 효과적인 입문서입니다. 단순히 클라우드 파운드리라는 플랫폼의 소개를 넘어, 효율적이고 확장가능하며, 신뢰할 수 있고 스스로 회복할 수 있는 분산 애플리케이션 개발에 대한 기법과 노하우가 고스란히 담겨있는 이 책은, 마이크로서비스라는 바다를 항해하는 데 꼭 필요한 길잡이가 되어 줄 것입니다. 클라우드 및 분산 환경에 대한 저자들의 폭넓은 노하우와 전문성, 그리고 이에 뒤지지 않는 경험과 역량을 보유하신 역자분들의 노력이 결집된 이 책을 통해 마이크로서비스 아키텍처로의 첫 발을 자신있게 내딛으시기를 바랍니다. - 장현희