[1부 기본편]1장 스프링 개요1.1 스프링이란?1.2 스프링의 다양한 프로젝트1.3 스프링 프레임워크 개요1.4 스프링 시큐리티 개요1.5 스프링 부트 개요1.6 스프링의 탄생과 개발 조직1.7 스프링이 인기 있는 이유2장 웹 애플리케이션 개요2.1 웹 애플리케이션이란?2.2 MPA2.3 SPA2.4 프로그램의 역할2.5 처리 흐름3장 DI의 개념3.1 DI란?3.2 DI로 무엇을 할까?3.3 DI 설명을 위한 클래스와 인터페이스 소개3.4 객체를 준비하는 간편한 방법3.5 DI 사용법3.6 다시, DI란?3.7 DI와 인터페이스실습4장 DI 컨테이너4.1 외부에서 직접 객체를 준비할 때의 문제점4.2 DI 컨테이너를 사용한 솔루션4.3 DI 컨테이너 관련 기본 용어4.4 JavaConfig에 설정 정보 작성하기4.5 Bean 정의 작성하기5장 스테레오타입 애너테이션5.1 스테레오타입 애너테이션이란?5.2 스테레오타입 애너테이션의 종류5.3 인젝션 지시5.4 컴포넌트 스캔5.5 DI 컨테이너를 생성하고 Bean 가져오기5.6 3가지 인젝션 방법_5.6.1 생성자 인젝션_5.6.2 Setter 인젝션_5.6.3 필드 인젝션5.7 같은 타입의 Bean이 여러 개 존재할 때 인젝션 방법실습6장 프로파일로 설정 전환하기6.1 프로파일이란?6.2 환경별 프로파일6.3 프로파일 사용법6.4 활성화할 프로파일 지정하기실습7장 JavaConfig와 @Bean 메서드7.1 JavaConfig란?7.2 여러 개의 JavaConfig 클래스 불러오기_7.2.1 AnnotationConfigApplicationContext 클래스의 생성자 인수로 지정하기_7.2.2 @Import로 가져오기_7.2.3 컴포넌트 스캔하기7.3 @Bean 메서드란?7.4 인젝션7.5 적절한 Bean 정의 방법 선택하기7.6 〈bean〉 태그의 Bean 정의가 존재하는 이유7.7 라이브러리의 클래스를 Bean으로 정의하기7.8 JavaConfig와 프로파일실습8장 스프링 JDBC: 데이터베이스 접근8.1 스프링과 데이터베이스 접근_8.1.1 다른 라이브러리와의 연동_8.1.2 스프링 데이터_8.1.3 스프링 JDBC8.2 자바와 데이터베이스 접근8.3 스프링 JDBC란?8.4 JDBC와 스프링 JDBC의 비교8.5 스프링 JDBC의 활용 사례8.6 JdbcTemplate 클래스8.7 검색 계열 처리_8.7.1 하나의 컬럼만 가져오기_8.7.2 레코드를 Map 객체로 변환해서 가져오기_8.7.3 레코드를 Entity 객체로 변환해서 가져오기8.8 갱신 계열 처리_8.8.1 INSERT 문_8.8.2 UPDATE 문_8.8.3 DELETE 문8.9 JdbcTemplate 클래스의 Bean 정의실습9장 선언적 트랜잭션9.1 트랜잭션이란?9.2 웹 애플리케이션의 트랜잭션9.3 트랜잭션과 커넥션9.4 트랜잭션을 자체적으로 제어할 때의 문제점9.5 스프링의 선언적 트랜잭션9.6 트랜잭션의 내부 구조9.7 PlatformTransactionManager의 구상 클래스9.8 PlatformTransactionManager의 Bean 정의9.9 @Transactional을 활성화하는 설정9.10 로그 출력 방법실습10장 스프링 부트로 생산성 향상하기10.1 라이브러리 준비하기10.2 자동 설정_10.2.1 자동 설정의 메커니즘_10.2.2 자동 설정의 프로퍼티10.3 내장 AP 서버10.4 스프링 부트를 사용할 때 DI 컨테이너를 생성하는 방법10.5 스프링 부트에서 오해하기 쉬운 것들실습11장 스프링 MVC + Thymeleaf11.1 MVC란?11.2 스프링 MVC란?11.3 Thymeleaf란?11.4 간단한 예제_11.4.1 pom.xml 설정하기_11.4.2 Controller 클래스 생성하기_11.4.3 View 작성하기_11.4.4 스프링 부트로 실행하기_11.4.5 브라우저에서 확인하기11.5 전체 처리 흐름11.6 Service 객체 인젝션11.7 핸들러 메서드와 @XxxMapping11.8 요청 파라미터 가져오기11.9 View에 데이터 전달하기11.10 Thymeleaf로 데이터 참조하기11.11 List 객체 참조하기11.12 입력 화면과 입력 검사11.13 Bean Validation을 이용한 입력 검사11.14 입력 화면 표시 방법11.15 입력 화면 템플릿 파일11.16 입력 검사 방법11.17 오류 문구 설정11.18 요청 파라미터를 사용한 핸들러 메서드 호출11.19 예외 핸들링실습12장 RESTful 웹 서비스 만들기12.1 웹 서비스란?12.2 최근의 개발 프로젝트와 웹 서비스 _12.2.1 SPA와 웹 서비스_12.2.2 마이크로서비스와 웹 서비스12.3 REST란?12.4 REST의 규칙_12.4.1 URL로 리소스 식별하기_12.4.2 HTTP 메서드로 리소스 조작하기_12.4.3 응답 바디의 데이터 형식_12.4.4 요청 바디의 데이터 형식_12.4.5 상태 코드 활용하기_12.4.6 헤더 활용하기_12.4.7 서버 측을 무상태로 만들기12.5 스프링 MVC의 REST 지원12.6 HTTP 메서드와 @XxxMapping12.7 HttpMessageConverter로 요청/응답 데이터 변환하기12.8 상태 코드 지정하기12.9 요청 헤더 참조하기12.10 응답 헤더 지정하기12.11 참조 계열 REST API 만들기실습13장 갱신 계열 REST API 만들기13.1 갱신 계열 HTTP 메서드13.2 PUT의 요청과 응답13.3 요청 바디 변환13.4 PUT에 대응하는 핸들러 메서드13.5 POST의 요청과 응답13.6 POST에 대응하는 핸들러 메서드13.7 DELETE의 요청과 응답13.8 DELETE에 대응하는 핸들러 메서드13.9 예외 발생 시 상태 코드 지정하기실습14장 스프링 시큐리티14.1 인증과 인가_14.1.1 인증이란?_14.1.2 인가란?14.2 스프링 시큐리티 인증의 개요14.3 스프링 시큐리티 인가의 개요14.4 스프링 시큐리티의 필터14.5 시큐리티 필터 체인 설정하기14.6 요청 인가14.7 로그인 화면14.8 인가 실패 시 오류 화면14.9 인증용 데이터 가져오기14.10 화면 표시 인가14.11 인증한 사용자 정보를 화면에 표시하기14.12 메서드 인가14.13 CSRF 대응14.14 스프링 시큐리티를 통한 CSRF 대응실습[2부 실무편]15장 싱글톤과 스레드 세이프15.1 싱글톤과 Bean15.2 싱글톤과 스레드 세이프15.3 스레드 세이프하지 않은 코드15.4 스레드 세이프한 코드15.5 Bean으로 관리하지 않는 객체실습16장 스프링 JDBC: JOIN 결과 가져오기16.1 테이블 JOIN 예제16.2 컬럼명 중복 문제16.3 JOIN한 레코드 매핑하기16.4 DataClassRowMapper의 단점16.5 RowMapper 인터페이스로 해결하기16.6 일대다 변환16.7 ResultSetExtractor 인터페이스16.8 실제 개발 프로젝트에 적용하기실습17장 데이터베이스 접근 시 예외 처리17.1 데이터베이스 접근 방식과 예외 문제17.2 범용 예외 클래스로 해결하기17.3 DataAccessException 클래스의 대표적인 서브 클래스17.4 DataAccessException 클래스의 처리 흐름실습18장 트랜잭션 전파18.1 트랜잭션 전파란?18.2 트랜잭션 전파 설정하기18.3 REQUIRED의 동작18.4 REQUIRED_NEW의 동작18.5 REQUIRED_NEW가 필요한 상황18.6 주의 사항실습19장 세션 스코프19.1 세션 스코프란?19.2 세션 스코프의 활용 사례19.3 스프링 MVC와 세션 스코프19.4 세션 스코프의 Bean19.5 세션 스코프의 Proxy19.6 세션 스코프의 Bean 정의19.7 세션 스코프의 Bean 인젝션19.8 세션 스코프의 Bean 조작_19.8.1 사용자 입력 시 ReservationInput 객체를 저장한다_19.8.2 신청 확정 시 ReservationInput 객체를 가져온다_19.8.3 신청 완료 시 ReservationInput 객체를 삭제한다19.9 여러 개의 Controller에서 세션 스코프 Bean 공유하기실습20장 플래시 스코프20.1 갱신 처리 후 화면 표시20.2 리다이렉트로 해결하기(PRG 패턴)20.3 리다이렉트 출발지와 목적지의 데이터 공유20.4 플래시 스코프로 해결하기20.5 PRG 패턴과 플래시 스코프 적용하기실습21장 Security Context 활용21.1 스프링 시큐리티의 필터21.2 인증한 사용자의 정보와 Security Context21.3 ThreadLocal과 Security Context21.4 Controller의 핸들러 메서드 인수로 받기21.5 HTML에 사용자 정보 삽입하기21.6 SecurityContextHolder.getContext로 가져오기실습22장 RESTful 웹 서비스 호출22.1 RestTemplate 클래스22.2 RestTemplate과 HttpMessageConverter22.3 RestTemplate 클래스의 주요 메서드22.4 GET을 위한 메서드22.5 POST를 위한 메서드22.6 PUT을 위한 메서드22.7 DELETE를 위한 메서드22.8 RestTemplate 객체 준비하기_22.8.1 DI 컨테이너를 사용하지 않는 경우 _22.8.2 DI 컨테이너를 사용하는 경우22.9 RestTemplate 클래스22.10 응답의 상세 데이터를 참조하는 경우22.11 요청의 상세 데이터를 설정하는 경우22.12 WebClient 클래스실습23장 프로퍼티 외부화23.1 외부화한 프로퍼티를 설정하는 곳23.2 프로퍼티 불러오기23.3 application.properties와 프로파일23.4 프로퍼티를 가져오는 방법_23.4.1 @Value 사용법_23.4.2 @ConfigurationProperties 사용법실습24장 자동 테스트와 스프링의 테스트 지원24.1 수동 테스트와 자동 테스트24.2 대표적인 자동 테스트24.3 웹 애플리케이션과 자동 테스트 패턴24.4 단위 테스트와 Mock24.5 스프링의 테스트 지원 기능24.6 DI 컨테이너를 생성하기 위한 애너테이션24.7 테스트 클래스24.8 JavaConfig 클래스를 자동으로 찾게 하기24.9 테스트를 실행할 때만 불러오는 application.properties실습25장 Repository 단위 테스트25.1 Repository 단위 테스트의 개요25.2 DI 컨테이너를 생성하기 위한 애너테이션25.3 DI 컨테이너 캐싱25.4 데이터베이스에 데이터 준비하기25.5 @Sql 애너테이션25.6 데이터 정리25.7 갱신 계열 처리 테스트25.8 JdbcTemplate으로 데이터 확인하기실습26장 Service 단위 테스트26.1 Service 단위 테스트의 개요26.2 Mockito란?26.3 Mockito를 사용한 Service 단위 테스트26.4 Mockito와 static 임포트26.5 Mock 객체에 동작 지정하기26.6 Mock 객체의 메서드 인수 지정하기26.7 여러 번 호출되는 Mock 객체의 메서드 지정하기26.8 Mock 객체의 메서드 호출을 확인하는 어설션26.9 Mock 객체의 메서드에 전달된 인자 확인하기26.10 Mock을 사용한 테스트의 단점실습27장 Service·Repository 통합 테스트27.1 Service·Repository 통합 테스트의 개요27.2 DI 컨테이너를 생성하기 위한 애너테이션27.3 데이터베이스에 데이터 준비하기27.4 @Sql 애너테이션27.5 데이터 정리27.6 갱신 계열 처리 테스트27.7 JdbcTemplate으로 데이터 확인하기실습28장 Controller 단위 테스트28.1 Controller 단위 테스트의 개요28.2 MockMvc란?28.3 MockMvc 사용법28.4 DI 컨테이너를 생성하기 위한 애너테이션28.5 MockMvc와 static 임포트28.6 요청 지정하기28.7 응답 어설션28.8 입력 검사 오류 어설션28.9 디버깅을 위한 로그 출력28.10 Mock 객체에 동작 지정하기실습29장 Controller·Service·Repository 통합 테스트29.1 Controller·Service·Repository 통합 테스트의 개요29.2 테스트 클래스29.3 Controller에서 세션 스코프와 플래시 스코프를 사용한 테스트실습30장 RESTful 웹 서비스 테스트30.1 RESTful 웹 서비스 테스트에 필요한 것들30.2 Controller 단위 테스트30.3 JSON 문자열 쉽게 생성하기30.4 JSONPath를 사용하여 응답 확인하기30.5 눈으로 JSON 문자열 확인하기30.6 RESTful 웹 서비스 통합 테스트_30.6.1 MockMvc를 사용한 통합 테스트_30.6.2 내장 AP 서버를 사용한 통합 테스트실습31장 스프링 시큐리티의 테스트 지원31.1 스프링 시큐리티의 테스트 지원 기능31.2 MockMvc와 연동한 스프링 시큐리티의 테스트 지원 기능31.3 인증한 사용자의 정보를 임의로 지정하기31.4 CSRF 토큰 지정하기31.5 애너테이션을 사용하는 기능31.6 메서드의 인가 테스트31.7 webEnvironment = WebEnvironment.NONE을 지정하지 않은 이유31.8 TestRestTemplate을 사용한 테스트실습32장 Selenide를 사용한 E2E 테스트32.1 E2E 테스트32.2 Selenide란?32.3 @SpringBootTest와 함께 사용하기32.4 @Sql과 함께 사용하기32.5 데이터 정리32.6 Selenide와 static 임포트32.7 브라우저 실행 방법32.8 화면 요소 참조 방법32.9 화면 요소의 검색 조건 지정하기32.10 $와 $$의 차이점32.11 화면 요소 조작하기32.12 요소의 정보 가져오기32.13 요소의 내용 어설션32.14 Selenide를 사용한 테스트실습[3부 부록]A.1 트랜잭션A.2 AP 서버A.3 인터페이스A.4 커맨드라인 인수A.5 애너테이션A.6 DataSourceA.7 내장 DBA.8 검사 예외와 비검사 예외A.9 MapA.10 ThreadLocalA.11 로그 레벨과 로거A.12 MavenA.13 클래스 패스A.14 템플릿 파일과 템플릿 엔진A.15 HTTP 요청과 HTTP 응답의 데이터 구조A.16 요청 파라미터A.17 컨텍스트 패스A.18 YAMLA.19 JSONA.20 서블릿과 서블릿 필터A.21 리다이렉트와 포워드A.22 SerializableA.23 JUnitA.24 JSONPathA.25 수강 신청 애플리케이션A.26 상품 주문 애플리케이션