실습을 통해 프로덕션 수준의 API를
설계, 테스트, 보안, 배포 및 유지보수 하는 방법을 배워
애플리케이션의 기능을 향상시켜 보자!
스프링은 자바를 사용해 확장 가능하고 신뢰할 수 있는 웹 애플리케이션을 구축할 때 사용 가능한 강력하고 널리 사용되는 프레임워크이며, 스프링 부트는 스프링 기반 애플리케이션의 설정과 구성을 단순화시켜 주는 인기 소프트웨어이다. 이 책은 웹 개발 시에 참고할 수 있는 스프링 6와 스프링 부트 3에 대한 깊이 있는 가이드로, 현대적이고 견고한 웹 API 및 서비스 구축에 대한 실용적인 지식을 제공한다.
이 책은 RESTful 웹 서비스 기본 지식, 스프링에 대한 개념 이해, API 스펙 설계를 포함한 API 개발에 필수적인 다양한 주제를 다루며 비동기 API 설계, 보안, 사용자 인터페이스 설계, API 테스트, 웹 서비스 배포 등을 설명한다. 나아가 실전 애플리케이션에 필요한 다양한 유형의 API 구축에 참조할 수 있는 실제 수준의 샘플 앱을 제공한다. 이 샘플 앱을 통해 설계 및 사양, 구현, 테스트, 배포를 포함한 전체 API 개발 주기에 대해 이해하게 될 것이다.
이 책에 대한 학습을 마치고 나면, Spring 6와 Spring Boot 3를 사용해 확장 가능하고 유지보수 가능한 현대적인 API를 설계, 개발, 테스트 및 배포하는 방법을 배우게 될 뿐만 아니라 애플리케이션의 보안과 신뢰성을 강화하고 전반적인 기능을 향상시키는 베스트 프랙티스를 익히게 될 것이다.
Contents
[1부] RESTful 웹 서비스
▣ 01장: RESTful 웹 서비스 기본사항
기술 요구 사항
REST API 소개
__REST의 역사
__REST의 기본사항
리소스와 URI 다루기
__URI 구문
__URL이란
__URN이란
HTTP 메소드와 상태 코드 살펴보기
__POST
__GET
__PUT
__DELETE
__PATCH
__HTTP 상태 코드
HATEOAS이란
REST API 설계 베스트 프랙티스
__엔드포인트 경로에서 리소스의 이름을 지정할
__동사형이 아닌 명사형 단어를 사용
__엔드포인트 경로에서 컬렉션 리소스의 이름을 지정할 때 복수형을 사용
__하이퍼미디어 사용(HATEOAS)
__API 버전 관리
__중첩된 리소스
__API 보안
__문서 유지 관리
__권장되는 상태 코드 준수
__캐싱 보장
__단위시간당 요청량 제한(Rate limit) 유지 관리
전자 상거래 앱 소개
요약
질문
답변
추가 읽을거리
▣ 02장: 스프링의 개념과 REST API
기술 요구 사항
스프링 패턴과 패러다임 이해하기
__IoC란
__DI란
__AOP란
IoC 컨테이너 이해하기
Bean과 그 범위 정의하기
__@ComponentScan 애노테이션
__Bean의 범위
자바를 사용하여 bean 설정
__@Import 애노테이션
__@DependsOn 애노테이션
DI 코딩 방법
__생성자로 의존성 정의
__설정자 메소드로 의존성 정의
__클래스 프로퍼티를 사용한 의존성 정의
애노테이션을 사용하여 bean의 메타데이터 설정
__@Autowired 사용 방법
__타입별 일치(Match by type)
__한정자별 일치(Match by qualifier)
__이름으로 일치(Match by name)
__@Primary의 목적은 무엇일까?
__@Value는 언제 사용할까?
AOP용 코드 작성
스프링 부트를 사용하는 이유
서블릿 디스패처의 중요성 이해
요약
질문
답변
추가 읽을거리
▣ 03장: API 명세 및 구현
기술 요구 사항
OAS로 API 설계
OAS의 기본 구조 이해
__OAS의 메타데이터 절
__OAS의 servers와 tags 절
OAS의 컴포넌트(components) 절
OAS의 경로(path) 절
OAS를 스프링 코드로 변환
OAS 코드 인터페이스 구현
전역 예외 처리기 추가
API 구현 테스트
요약
질문
답변
추가 읽을거리
▣ 04장: API를 위한 비즈니스 로직 작성
기술 요구 사항
서비스 설계 개요
Repository 컴포넌트 추가
__@Repository 애노테이션
__데이터베이스 및 JPA 설정
__데이터베이스 및 시드 데이터 스크립트
__엔터티 추가
__리포지토리 추가
서비스 컴포넌트 추가
하이퍼미디어 구현
서비스와 HATEOAS로 컨트롤러 향상
API 응답에 ETag 추가
API 테스트
요약
질문
답변
추가 읽을거리
▣ 05장: 비동기 API 설계
기술 요구 사항
리액티브 스트림 이해하기
__발행자(Publisher)
__구독자(Subscriber)
__구독(Subscription)
__프로세서(Processor)
스프링 웹플럭스 살펴보기
__리액티브 API 이해
__리액티브 코어
DispatcherHandler 이해하기
__컨트롤러
__함수형 엔드포인트
전자 상거래 앱용 리액티브 API 구현
__리액티브 API용 OpenAPI Codegen 변경
__build.gradle에 리액티브 의존성 추가
__예외 처리
__컨트롤러에 대한 전역 예외 처리
__API 응답에 하이퍼미디어 링크 추가
__엔터티 정의
__리포지토리 추가
__서비스 추가
__컨트롤러 구현 추가
__애플리케이션에 H2 콘솔 추가
__애플리케이션 설정 추가
__리액티브 API 테스트
요약
질문
답변
추가 읽을거리
[02부] 보안, UI, 테스트, 배포
▣ 06장: 권한부여와 인증을 통해 REST 엔드포인트 보호하기
기술 요구 사항
스프링 시큐리티 및 JWT를 사용한 인증 구현
__Gradle에 필요한 의존성 추가하기
__OAuth 2.0 리소스 서버를 사용한 인증 방법
__JWT의 구조
JWT로 REST API에 보안 적용하기
__새로운 API 추가하기
__데이터베이스 테이블에 리프레시 토큰 저장하기
__JWT 관리자 구현하기
새로운 API 구현
__findUserByUsername() 메소드 구현하기
__REST 컨트롤러 구현
__웹 기반 보안 설정
CORS와 CSRF의 구성
권한부여(authorization)에 대한 이해
__역할과 권한
보안 관련 테스트하기
요약
질문
답변
추가 읽을거리
▣ 07장: 사용자 인터페이스 설계하기
기술 요구 사항
React 기초
__리액트 앱 만들기
__기본 구조와 파일에 대해 알아보자
__package.json 파일에 대한 이해
__React 앱의 부트스트랩
리액트 컴포넌트 및 기타 기능에 대해 알아보자
__JSX에 대해 알아보자
__리액트 훅에 대해 이해해보자
__테일윈드(Tailwind)를 사용해 컴포넌트 스타일링하기
프로덕션 배포에 불필요한 스타일을 제거하도록 설정
__리액트에 테일윈드 포함시키기
전자상거래 앱 컴포넌트 디자인하기
Fetch를 이용해 API 호출하기
__제품 정보를 가져오는 API 클라이언트 작성하기
__제품 목록 페이지 코딩하기
인증 기능 구현하기
__커스텀 useToken 후크 만들기
__Login 컴포넌트 작성
__커스텀 cart context의 구현
__Cart 컴포넌트 작성하기
__Order 컴포넌트 작성하기
__루트(App) 컴포넌트 작성
__애플리케이션 실행하기
요약
질문
답변
추가 읽을거리
▣ 08장: API 테스트
기술 요구 사항
API와 코드를 수동으로 테스트하기
테스트 자동화
__단위 테스트
__AssertJ 어서션을 사용해 테스트하기
__코드 커버리지
__통합 테스트하기
요약
질문
답변
추가 읽을거리
▣ 09장: 웹서비스 배포하기
기술 요구 사항
컨테이너화란 무엇일까?
도커(Docker) 이미지 빌드하기
__도커란 무엇인가?
__이미지를 빌드하는 그래들 태스크 실행
쿠버네티스에 애플리케이션 배포하기
요약
질문
답변
추가 읽을거리
[03부] gRPC, 로깅, 모니터링
▣ 10장: gRPC 시작하기
기술 요구 사항
gRPC 동작방식
__REST 대 gRPC
__웹 브라우저와 모바일 앱에서 gRPC 서버를 호출할 수 있을까?
__gRPC 아키텍처란
__gRPC가 Protocol Buffer를 사용하는 방법
서비스 정의의 이해
RPC 수명 주기 살펴보기
__수명 주기에 영향을 주는 이벤트
__gRPC 서버 및 gRPC 스텁 이해
에러 처리와 에러 상태 코드
요약
질문
답변
추가 읽을거리
▣ 11장: gRPC API 개발 및 테스트
기술 요구 사항
API 작성
__프로젝트 설정
__결제 게이트웨이 기능 작성
gRPC 서버 개발
__gRPC 서버 구현
__gRPC 서버 클래스 구현
__gRPC 서버 테스트
에러 처리 구현
gRPC 클라이언트 개발
__gRPC 클라이언트 구현
__gRPC 서비스 테스트
마이크로서비스란?
__전통적인 모놀리식 디자인
__서비스 기반 모놀리식 디자인
__마이크로서비스 디자인
요약
질문
답변
추가 읽을거리
▣ 12장: 서비스에 로깅 및 트레이싱 추가
기술 요구 사항
ELK 스택을 활용한 로깅 및 트레이싱
ELK 스택의 이해
ELK 스택 설치
gRPC 코드에서 로깅 및 트레이싱 구현
__gRPC 서버 코드 변경
__gRPC 클라이언트 코드 변경
__로깅 및 트레이싱 변경사항 테스트
Zipkin과 Micrometer로 분산 트레이싱 하기
요약
질문
답변
추가 읽을거리
[04부] GraphQL
▣ 13장: GraphQL 시작하기
기술 요구 사항
GraphQL 알아보기
__GraphQL의 간략한 역사
__GraphQL과 REST 비교
GraphQL 기본 학습
__쿼리 타입 살펴보기
__뮤테이션 타입 살펴보기
__서브스크립션 타입 살펴보기
GraphQL 스키마 설계
__스칼라 타입의 이해
__프래그먼트 이해
__인터페이스 이해
__유니온 타입 이해
__인풋 타입 이해
__GraphQL 도구를 사용한 스키마 설계
GraphQL 쿼리와 뮤테이션 테스트
__N+1 문제 해결
__N+1 문제 이해란 무엇인가?
N+1 문제의 솔루션
요약
질문
답변
추가 읽을거리
▣ 14장: GraphQL API 개발 및 테스트
기술 요구 사항
GraphQL 용 워크플로우와 도구
GraphQL 서버 구현
__gRPC 서버 프로젝트 생성
__GraphQL DGS 의존성 추가
__GraphQL 스키마 추가
__커스텀 스칼라 타입 추가
__API 문서화
GraphQL 쿼리 구현
GraphQL 쿼리용 페처 작성
__Product용 데이터 페처 작성
__Product 컬렉션용 데이터 페처 작성
__데이터 페처 메소드를 사용한 필드 해석기 작성
__N+1 문제를 해결하기 위한 데이터 로더 작성
GraphQL 뮤테이션 구현
GraphQL 서브스크립션 구현 및 테스트
__GraphQL용 WebSocket 서브-프로토콜 이해
__Insomnia 웹소켓을 이용한 GraphQL 서브스크립션 테스트
GraphQL API 인스트루먼테이션
__커스텀 헤더 추가
__Micrometer와 통합
테스트 자동화
__GraphQL 쿼리 테스트
__GraphQL 뮤테이션 테스트
__자동화된 테스트 코드를 이용한 GraphQL 서브스크립션 테스트
요약
질문
답변
추가 읽을거리
Author
소라브 샤르마,문종민,박천구,김광영
오라클의 수석 개발 관리자로 업계에서 20년 이상의 경험을 가지고 있다. 그는 자바, 자바스트립트, 오라클 DB를 사용해 온프레미스 및 클라우드 기반 애플리케이션을 설계하는 관리자이자 아키텍트이다. 소라브는 선도적인 기업들과 협력해 엔터프라이즈 제품 및 애플리케이션을 제공했고, 팀을 이끌며 N-tier 및 클라우드 기반 웹 애플리케이션을 개념화, 모델링, 설계 및 개발하는 것에 전문가 수준의 역량을 가지고 있다. 또한, 마이크로서비스 기반 솔루션 개발과 다양한 유형의 워크플로 및 오케스트레이션 엔진 구현도 경험했으며 지속적으로 학습하며 책과 교육을 통해 지식을 공유하고 있다.
오라클의 수석 개발 관리자로 업계에서 20년 이상의 경험을 가지고 있다. 그는 자바, 자바스트립트, 오라클 DB를 사용해 온프레미스 및 클라우드 기반 애플리케이션을 설계하는 관리자이자 아키텍트이다. 소라브는 선도적인 기업들과 협력해 엔터프라이즈 제품 및 애플리케이션을 제공했고, 팀을 이끌며 N-tier 및 클라우드 기반 웹 애플리케이션을 개념화, 모델링, 설계 및 개발하는 것에 전문가 수준의 역량을 가지고 있다. 또한, 마이크로서비스 기반 솔루션 개발과 다양한 유형의 워크플로 및 오케스트레이션 엔진 구현도 경험했으며 지속적으로 학습하며 책과 교육을 통해 지식을 공유하고 있다.