마이크로서비스 도입에 필요한 스프링 부트 핵심 가이드!
마이크로서비스 도입에 필요한 스프링 부트 사용법을 확실하게 배우자!
개발과 운영이 까다로운 마이크로서비스를 올바르게 이해하고, 마이크로서비스 애플리케이션을 개발할 때 필요한 스프링 부트에 집중해서 설명한다. 스프링 부트의 자동 설정 기능부터 JPA, REST-API, 영속성 프레임워크와 레디스, 그리고 스프링 프레임워크에서 제공하는 스케줄링 기능과 스프링 이벤트를 사용하는 방법까지 순서대로 들여다보면서 스프링 애플리케이션을 보다 완성도 있게 개발할 수 있다.
400개의 길고 짧은 예제를 통해 실전 감각을 올리자!
이 책에서는 실무에서 서비스를 개발하면서 부딪힐 수 있는 여러 상황들을 예제로 설명한다. 400개의 길고 짧은 예제를 통해 ‘스프링 투어’라는 가상의 여행 예약 서비스를 조금씩 발전시키면서 여러 서비스가 결합된 서비스로의 전환 과정을 보여준다. 이 과정 안에서 스프링 부트로 마이크로서비스 컴포넌트를 개발하는 방법을 보다 쉽게 이해할 수 있을 것이다.
1장 마이크로서비스 아키텍처
1.1 모놀리식 아키텍처 소개
__1.1.1 모놀리식 아키텍처 장점
__1.1.2 모놀리식 아키텍처 단점
1.2 마이크로서비스 아키텍처 소개
__1.2.1 마이크로서비스 아키텍처 장점
__1.2.2 마이크로서비스 아키텍처 단점
1.3 마이크로서비스 아키텍처 설계
__1.3.1 서비스 세분화 원칙
__1.3.2 도메인 주도 설계(DDD)의 바운디드 컨텍스트
__1.3.3 단일 책임 원칙
__1.3.4 가벼운 통신 프로토콜
__1.3.5 외부 공개 인터페이스
__1.3.6 마이크로서비스마다 독립된 데이터 저장소
__1.3.7 정리
1.4 스프링 투어의 아키텍처 변화
__1.4.1 스프링 투어의 시작
__1.4.2 서비스 안정성 확보
__1.4.3 확장의 시작
__1.4.4 데이터 저장소의 확장
__1.4.5 마이크로서비스 아키텍처의 시작
1.5 12 요소 애플리케이션
__1.5.1 코드베이스: 버전 관리되는 하나의 코드베이스와 다양한 배포
__1.5.2 의존성: 명시적으로 선언할 수 있고 분리할 수 있는 의존성
__1.5.3 설정: 환경 변수를 이용한 설정
__1.5.4 지원 서비스: 지원 서비스는 연결된 리소스로 처리
__1.5.5 빌드, 릴리스, 실행: 소스 빌드와 실행은 완전히 분리되어야 한다
__1.5.6 프로세스: 애플리케이션은 하나 이상의 무상태 프로세스로 실행되어야 한다
__1.5.7 포트 바인딩: 포트 바인딩을 통한 서비스 공개
__1.5.8 동시성: 프로세스들을 통한 수평 확장
__1.5.9 폐기 가능: 프로세스는 빠르게 시작해야 하고 안정적으로 종료해야 한다
__1.5.10 Dev 환경과 Production 환경 일치
__1.5.11 로그: 로그는 이벤트 스트림으로 다룬다
__1.5.12 admin 프로세스: 시스템 유지 보수를 위한 일회성 프로세스
1.6 정리 64
2장 프레임워크와 스프링 부트
2.1 스프링 투어가 스프링 부트를 선택한 이유
2.2 스프링 프레임워크
__2.2.1 POJO 기반의 경량 컨테이너
__2.2.2 복잡한 비즈니스 영역의 문제를 쉽게 개발하고 운영하기 위한 철학
__2.2.3 모듈식 프레임워크
__2.2.4 높은 확장성과 범용성, 생태계 시스템
__2.2.5 엔터프라이즈 애플리케이션에 적합한 오픈 소스 경량급 프레임워크
2.3 스프링 부트 소개
__2.3.1 단독 실행 가능한 스프링 애플리케이션
__2.3.2 간편한 설정을 위한 ‘스타터’ 의존성 제공
__2.3.3 스프링 기능을 자동 설정하는 ‘자동 구성’ 제공
__2.3.4 모니터링 지표, 헬스 체크를 위한 ‘액추에이터’
__2.3.5 XML 설정을 위한 일이 필요 없음
__2.3.6 애플리케이션에 내장된 WAS
2.4 스프링 부트 애플리케이션 시작하기
__2.4.1 Maven을 사용하여 프로젝트를 구성하는 방법
__2.4.2 스프링 이니셜라이저를 사용하여 프로젝트를 구성하는 방법
__2.4.3 IntelliJ의 이니셜라이저를 사용하여 프로젝트를 구성하는 방법
__2.4.4 스프링 스타터에 포함된 pom.xml 분석
__2.4.5 @SpringBootApplication 애너테이션과 메인 클래스
__2.4.6 스프링 애플리케이션 예제
2.5 정리
3장 스프링 애플리케이션 기본
3.1 스프링 빈 사용
__3.1.1 @Bean 애너테이션
3.2 자바 설정
__3.2.1 @Configuration
__3.2.2 @ComponentScan
__3.2.3 @Import
3.3 스테레오 타입 스프링 빈 사용
3.4 의존성 주입
__3.4.1 의존성
__3.4.2 애너테이션 기반 설정의 의존성 주입
__3.4.3 자바 설정의 의존성 주입
3.5 ApplicationContext
3.6 스프링 빈 스코프
3.7 스프링 빈 생명주기 관리
3.8 스프링 빈 고급 정의
__3.8.1 @Primary 애너테이션
__3.8.2 @Lazy 애너테이션
3.9 스프링 투어가 오해한 스프링 빈
4장 스프링 웹 MVC 개요
4.1 HTTP 프로토콜
__4.1.1 HTTP 상태 코드
__4.1.2 HTTP 특징
4.2 스프링 웹 MVC 프레임워크
__4.2.1 MVC 패턴
__4.2.2 DispatcherServlet
__4.2.3 서블릿 스택과 스레드 모델
__4.2.4 스프링 부트 설정
4.3 REST-API 설계
__4.3.1 HTTP 메서드별 REST-API 예제
__4.3.2 REST-API 특성과 설계
4.4 간단한 REST-API 예제
__4.4.1 @ResponseBody와 HttpMessageConverter
5장 스프링 MVC를 이용한 REST-API 개발
5.1 REST-API: GET, DELETE 메서드 매핑
__5.1.1 호텔 정보 조회 API 명세서
__5.1.2 Controller 클래스 구현
__5.1.3 @GetMapping 애너테이션
__5.1.4 @PathVariable 애너테이션
__5.1.5 @RequestParam 애너테이션
__5.1.6 @DeleteMapping 애너테이션
5.2 REST-API 응답 메시지 처리
__5.2.1 @JsonProperty와 @JsonSerialize 애너테이션: JSON 마셜링 예제
__5.2.2 JsonSerializer와 JsonDeserializer 예제
__5.2.3 @JsonFormat 애너테이션
__5.2.4 열거형 클래스 변환
5.3 REST-API POST, PUT 매핑
5.4 ResponseEntity 응답과 Pageable, Sort 클래스
__5.4.1 ResponseEntity 클래스
__5.4.2 페이지네이션과 정렬 파라미터를 위한 Pageable 클래스
__5.4.3 Pageable 자동 설정
5.5 REST-API 검증과 예외 처리
__5.5.1 JSR-303을 사용한 데이터 검증
__5.5.2 @Valid 애너테이션과 예제
__5.5.3 Validator 인터페이스를 사용한 검증
__5.5.4 @ControllerAdvice와 @ExceptionHandler 예외 처리
5.6 미디어 콘텐츠 내려받기
6장 웹 애플리케이션 서버 구축하기
6.1 웹 애플리케이션 기본 설정
__6.1.1 웹 애플리케이션의 설정 메커니즘
__6.1.2 WebMvcConfigurer를 사용한 설정
__6.1.3 DispatcherServlet 설정
6.2 HttpMessageConverter와 REST-API 설정
__6.2.1 HttpMessageConverter 설정
__6.2.2 ObjectMapper와 스프링 빈을 이용한 애플리케이션 설정
6.3 Interceptor와 ServletFilter 설정
__6.3.1 HandlerInterceptor 인터페이스
__6.3.2 Filter 인터페이스
6.4 Application.properties 설정
__6.4.1 @Value 애너테이션
__6.4.2 @ConfigurationProperties와 @ConfigurationPropertiesScan
6.5 Profile 설정
__6.5.1 Profile 변수 값 설정
__6.5.2 프로파일별 application.properties 설정
__6.5.3 @Profile 애너테이션과 스프링 빈 설정
__6.5.4 @Profile 애너테이션과 인터페이스를 사용한 확장
__6.5.5 Environment 인터페이스
6.6 REST-API와 국제화 메시지 처리
__6.6.1 message.properties 파일 설정
__6.6.2 MessageSource 인터페이스
__6.6.3 스프링 부트 프레임워크의 자동 설정 구성
__6.6.4 LocaleResolver와 LocaleChangeInterceptor 설정 예제
6.7 로그 설정
__6.7.1 Logger 선언과 사용
__6.7.2 logback-spring.xml
__6.7.3 중앙 수집 로그
6.8 애플리케이션 패키징과 실행
__6.8.1 메이븐 패키징
__6.8.2 도커 이미지 생성
7장 스프링 AOP와 테스트, 자동 설정 원리
7.1 스프링 AOP
__7.1.1 AOP 용어 정리
__7.1.2 어드바이스 종류와 설명
__7.1.3 스프링 AOP와 프록시 객체
__7.1.4 포인트 컷과 표현식
__7.1.5 JoinPoint와 ProceedingJoinPoint
__7.1.6 관점 클래스 예제
__7.1.7 애너테이션을 사용한 AOP
7.2 스프링 부트 테스트
__7.2.1 스프링 부트 테스트 설정
__7.2.2 Junit 사용 예제
__7.2.3 @SpringBootTest를 사용한 스프링 부트 테스트
__7.2.4 @TestConfiguration을 사용한 테스트 환경 설정
__7.2.5 @MockBean을 사용한 테스트 환경 설정
__7.2.6 테스트 슬라이스 애너테이션
__7.2.7 스프링 부트 웹 MVC 테스트 예제
__7.2.8 JPA 테스트
7.3 스프링 부트 자동 설정
8장 데이터 영속성
8.1 JPA
__8.1.1 JPA 소개
__8.1.2 ORM과 SQL Mapper 비교
__8.1.3 JPA 장단점
8.2 MySQL 실행 환경 설정 458
__8.2.1 도커를 사용한 MySQL 실행 환경 설정
__8.2.2 테이블 설계
8.3 Spring Data JPA 기능과 설정
__8.3.1 Spring Data JPA 기능
__8.3.2 Spring Data JPA 자동 설정과 필수 스프링 빈
__8.3.3 Spring Data JPA 설정
__8.3.4 Hikari DataSource 설정
8.4 엔터티 클래스 설계
__8.4.1 엔터티 클래스와 @Entity 애너테이션
__8.4.2 엔터티 클래스 기본 키 설정
__8.4.3 열거형과 @Enumerated
__8.4.4 Date 클래스와 @Temporal
__8.4.5 엔터티 클래스 속성 변환과 AttributeConverter
__8.4.6 엔터티 클래스 상속과 @MappedSuperClass
8.5 리포지터리 개발과 JpaRepository
8.6 Spring Data JPA의 쿼리 메서드 기능
__8.6.1 메서드 이름으로 쿼리 생성
__8.6.2 예제와 테스트 케이스
__8.6.3 @Query 애너테이션을 사용한 쿼리 사용
8.7 트랜잭션과 @Transactional
__8.7.1 @Transactional 애너테이션
__8.7.2 @Transactional의 propagation 속성
__8.7.3 @Transactional 애너테이션의 isolation 속성
__8.7.4 트랜잭션 테스트 예제
__8.7.5 @Transactional을 사용할 때 주의 사항
8.8 EntityManager
__8.8.1 EntityManager와 영속성 컨텍스트
__8.8.2 영속성 컨텍스트의 특징
8.9 엔터티 연관 관계 설정
__8.9.1 연관 관계 설계
__8.9.2 일대다 연관 관계 설정
__8.9.3 영속성 전이와 로딩, 고아 객체
__8.9.4 다대일 연관 관계 설정
__8.9.5 양방향 관계 설정
__8.9.6 다대다 연관 관계 설정
__8.9.7 일대일 연관 관계 설정
8.10 엔터티 상태 이벤트 처리
8.11 트랜잭션 생명주기 동기화 작업
__8.11.1 스프링 부트 프레임워크의 OSIV 설정
9장 애플리케이션 통합: REST-API
9.1 RestTemplate 클래스
__9.1.1 RestTemplate 구조
__9.1.2 RestTemplate 스프링 빈 설정
__9.1.3 Connection Timeout과 Read Timeout 설정
__9.1.4 RestTemplate 클래스
__9.1.5 RestTemplate 예제
__9.1.6 keep-alive와 Connection Pool 설정
9.2 WebClient
10장 레디스와 스프링 캐시
10.1 레디스 소개 및 아키텍처
__10.1.1 레디스 센티넬 아키텍처
__10.1.2 레디스 클러스터 아키텍처
__10.1.3 레디스 자료 구조
__10.1.4 레디스 유효 기간
10.2 Spring Data Redis 사용
__10.2.1 RedisAutoConfiguration 자동 설정
__10.2.2 레디스 도커 설정
10.3 Lettuce 라이브러리와 커넥션 설정
__10.3.1 RedisConnectionFactory 설정
10.4 레디스 문자열 예제와 RedisSerializer 설정
10.5 레디스 분산 락 사용 예제
10.6 레디스 Sorting 구현 예제
10.7 레디스 Pub-Sub 구현 예제
__10.7.1 토픽과 메시지 객체
__10.7.2 게시자 예제
__10.7.3 구독자 예제
__10.7.4 게시자와 구독자 테스트
10.8 스프링 프레임워크 캐시
__10.8.1 Cache와 CacheManager 인터페이스
__10.8.2 캐시 애너테이션
11장 스프링 스케줄링 태스크
11.1 스케줄링 설정
__11.1.1 SchedulingConfigurer를 사용한 TaskScheduler 설정
__11.1.2 ScheduledAnnotationBeanPostProcessor와 TaskScheduler 설정
11.2 스케줄링 태스크 정의
__11.2.1 cron 속성과 클론 표현식
__11.2.2 fixedDelay 속성
__11.2.3 fixedRate 속성
11.3 배치 서버 아키텍처
__11.3.1 단독 배치 서버 구성
__11.3.2. 젠킨스와 REST-API 서버군 구성
__11.3.3 @Scheduled와 REST-API 서버군 구성
12장 스프링 이벤트
12.1 스프링 이벤트 장점
12.2 사용자 정의 이벤트 처리
12.3 비동기 사용자 정의 이벤트 처리
12.4 @Async 애너테이션을 사용한 비동기 이벤트 처리
12.5 @EventListener
12.6 스프링 애플리케이션 이벤트
12.7 트랜잭션 시점에 구독한 이벤트 처리
부록 A 예제 코드 사용법
A.1 예제 코드 실행하기
__A.1.1 실행 환경 설정
__A.1.2 예제 코드의 구조 및 실행
A.2 도커 이미지 생성하기
__A.2.1 도커 설치
__A.2.2 도커 이미지 관련 명령어들
__A.2.3 도커 컨테이너 명령어들
__A.2.4 도커 이미지 저장소 관련 명령어들
찾아보기
독자의견 남기기