전문가를 위한 스프링 5
스프링 개발자와 가장 오랜 시간을 함께한 스프링 중급서!
1판이 출간된 이후 5판까지 꾸준히 개정되며 스프링 중급서의 위치를 지켜왔다. 스프링 입문자가 아니라 실제로 현업에서 스프링을 개발하면서 알아야 하는 깊이 있는 정보를 체계적으로 정리하고 전달해왔다. 스프링의 기초와 핵심 개념부터 리모팅, 하이버네이트, EJB 등을 설명하면서 저자의 경험과 통찰을 담아냈다. 스프링 프레임워크를 개발하는 Pivotal 사의 현업 개발자, Pivotal 공인 스프링 개발자, 오랜 기간 스프링으로 개발한 경험자가 모여 공동 집필하며 실무에 필요한 지식을 담으려 노력했다. 또한, 모던 자바를 지원하면서 진화한 스프링 프레임워크도 설명했다.
<전문가를 위한 스프링 5>는 1~4장을 공개합니다.
목차
- 1장 스프링 소개
- 1.1 스프링이란?
- 1.1.1 스프링 프레임워크의 발전 과정
- 1.1.2 제어 역전과 의존성 주입
- 1.1.3 의존성 주입의 발전 과정
- 1.1.4 의존성 주입을 넘어서
- 1.2 스프링 프로젝트
- 1.2.1 스프링의 기원
- 1.2.2 스프링 커뮤니티
- 1.2.3 스프링 IDE(Spring Tool Suite)
- 1.2.4 스프링 시큐리티 프로젝트
- 1.2.5 스프링 부트
- 1.2.6 스프링 배치와 인티그레이션
- 1.2.7 그 외 많은 프로젝트
- 1.3 스프링의 대안
- 1.3.1 제이보스 심 프레임워크
- 1.3.2 구글 주스(Google Guice)
- 1.3.3 PicoContainer
- 1.3.4 JEE 7 컨테이너
- 1.4 정리
- 2장 스프링 시작하기
- 2.1 스프링 프레임워크 가져오기
- 2.1.1 빠르게 시작하기
- 2.1.2 깃허브에서 스프링 체크아웃하기
- 2.1.3 적절한 JDK 사용하기
- 2.2 스프링 모듈 이해하기
- 2.2.1 스프링 모듈
- 2.2.2 애플리케이션에서 사용할 모듈 선택하기
- 2.2.3 메이븐 저장소에 있는 모듈 접근하기
- 2.2.4 그레이들을 사용해 스프링 모듈 접근하기
- 2.3 스프링 문서 사용하기
- 2.4 스프링으로 Hello World 애플리케이션 만들기
- 2.4.1 Hello World 애플리케이션 만들기
- 2.4.2 스프링으로 리팩터링하기
- 2.4.3 애너테이션을 사용한 스프링 구성
- 2.5 정리
- 3장 스프링 IoC와 DI 소개
- 3.1 IoC와 DI
- 3.2 IoC의 종류
- 3.2.1 의존성 풀
- 3.2.2 문맥에 따른 의존성 룩업
- 3.2.3 생성자 의존성 주입
- 3.2.4 수정자 의존성 주입
- 3.2.5 의존성 주입 vs. 의존성 룩업
- 3.2.6 수정자 주입 vs. 생성자 주입
- 3.3 스프링의 제어 역전
- 3.4 스프링의 의존성 주입
- 3.4.1 빈과 빈 팩터리
- 3.4.2 BeanFactory 구현체
- 3.4.3 애플리케이션 컨텍스트(ApplicationContext)
- 3.5 애플리케이션 컨텍스트 구성하기
- 3.5.1 스프링 구성 옵션 설정하기
- 3.5.2 기본 구성의 개요
- 3.5.3 스프링 컴포넌트 선언하기
- 3.5.4 메서드 주입 사용하기
- 3.5.5 빈 명명 규칙 이해하기
- 3.5.6 빈 생성 방식 이해하기
- 3.5.7 의존성 해석하기
- 3.6 빈에 자동와이어링하기
- 3.6.1 자동와이어링을 사용하는 경우
- 3.7 빈 상속 설정하기
- 3.8 정리
- 4장 스프링 구성 상세와 스프링 부트
- 4.1 스프링이 애플리케이션 이식성에 미치는 영향
- 4.2 빈 라이프사이클 관리
- 4.3 빈 생성 시점에 통지 받기
- 4.3.1 빈 생성 시 메서드 실행하기
- 4.3.2 InitializingBean 인터페이스 구현하기
- 4.3.3 JSR-250 @PostConstruct 애너테이션 사용하기
- 4.3. 4 @Bean으로 초기화 메서드 선언하기
- 4.3.5 초기화 메서드 해석 순서 이해하기
- 4.4 빈 소멸 시점에 통지 받기
- 4.4.1 빈이 소멸될 때 메서드를 실행하기
- 4.4.2 DisposableBean 인터페이스 구현하기
- 4.4.3 JSR-250 @PreDestroy 애너테이션 사용하기
- 4.4. 4 @Bean을 사용해 소멸 메서드 정의하기
- 4.4.5 해석 순서 이해하기
- 4.4.6 셧다운 후크 사용하기
- 4.5 빈이 스프링을 알게(Spring Aware)하기
- 4.5.1 BeanNameAware 인터페이스 사용하기
- 4.5.2 ApplicationContextAware 인터페이스 사용하기
- 4.6 FactoryBean 사용하기
- 4.6.1 FactoryBean(s) 예제: MessageDigestFactoryBean
- 4.6.2 FactoryBean에 직접 접근하기
- 4.6.3 factory-bean과 factory-method 애트리뷰트 사용하기
- 4.7 자바빈 PropertyEditor
- 4.7.1 스프링이 기본으로 제공하는 PropertyEditor 사용하기
- 4.7.2 커스텀 PropertyEditor 만들기
- 4.8 그 외의 스프링 ApplicationContext 구성 살펴보기
- 4.8.1 MessageSource를 사용한 국제화
- 4.8.2 독립형 애플리케이션에서 MessageSource 사용하기
- 4.8.3 MessageSourceResolvable 인터페이스
- 4.8.4 애플리케이션 이벤트
- 4.9 리소스 접근하기
- 4.10 자바 클래스를 사용한 구성
- 4.10.1 자바로 ApplicationContext 구성하기
- 4.10.2 스프링 혼합 구성
- 4.10.3 자바 구성과 XML 구성 선택
- 4.11 프로파일
- 4.11.1 스프링 프로파일 기능 사용 예제
- 4.11.2 자바 구성을 사용하는 스프링 프로파일
- 4.11.3 프로파일 사용 시 고려사항
- 4.12 Environment와 PropertySource 추상화
- 4.13 JSR-330 애너테이션을 사용한 구성
- 4.14 그루비를 사용한 구성
- 4.15 스프링 부트
- 4.16 정리
- 5장 스프링 AOP 소개
- 5.1 AOP 개념
- 5.2 AOP의 종류
- 5.2.1 정적 AOP
- 5.2.2 동적 AOP
- 5.2.3 AOP 방식 선택하기
- 5.3 스프링의 AOP 지원
- 5.3.1 AOP 얼라이언스
- 5.3.2 AOP를 사용한 ‘Hello, World’
- 5.4 스프링 AOP 아키텍처
- 5.4.1 스프링 조인포인트
- 5.4.2 스프링 애스펙트
- 5.4.3 ProxyFactory 클래스
- 5.4.4 스프링에서 어드바이스 만들기
- 5.4.5 어드바이스 인터페이스
- 5.4.6 비포 어드바이스 만들기
- 5.4.7 비포 어드바이스를 사용한 메서드 접근 보호
- 5.4.8 애프터 리터닝 어드바이스 생성
- 5.4.9 어라운드 어드바이스 만들기
- 5.4.10 스로우 어드바이스 만들기
- 5.4.11 어드바이스 종류 선택하기
- 5.5 스프링의 어드바이저와 포인트컷
- 5.5.1 포인트컷 인터페이스
- 5.5.2 사용 가능한 포인트컷 구현체
- 5.5.3 DefaultPointcutAdvisor 사용하기
- 5.5.4 StaticMethodMatcherPointcut을 사용해 정적 포인트컷 생성하기
- 5.5.5 DynamicMethodMatcherPointcut을 사용해 동적 포인트컷 만들기
- 5.5.6 단순한 이름 매칭 포인트컷 사용하기
- 5.5.7 정규 표현식으로 포인트컷 만들기
- 5.5.8 AspectJ 포인트컷 표현식을 사용한 포인트컷 생성
- 5.5.9 애너테이션 매칭 포인트컷 생성
- 5.5.10 편리한 Advisor 구현체
- 5.6 프록시 이해하기
- 5.6.1 JDK 동적 프록시 사용하기
- 5.6.2 CGLIB 프록시 사용하기
- 5.6.3 프록시 성능 비교
- 5.6.4 어떤 프록시를 사용해야 할까?
- 5.7 포인트컷의 고급 활용
- 5.7.1 제어 흐름 포인트컷 사용하기
- 5.7.2 ComposablePointcut 사용하기
- 5.7.3 Composition과 Pointcut 인터페이스
- 5.7.4 포인트컷 정리
- 5.8 인트로덕션 시작하기
- 5.8.1 인트로덕션 기본
- 5.8.2 인트로덕션을 통해 객체 수정 감지하기
- 5.9 인트로덕션 정리
- 5.10 AOP 프레임워크 서비스
- 5.10.1 선언적인 AOP 구성하기
- 5.10.2 ProxyFactoryBean 사용하기
- 5.10.3 aop 네임스페이스 사용하기
- 5.11 @AspectJ 방식 애너테이션 사용하기
- 5.11.1 선언적인 스프링 AOP 구성에 대한 고려사항
- 5.12 AspectJ 연동
- 5.12.1 AspectJ 소개
- 5.12.2 싱글턴 애스펙트 사용하기
- 5.13 정리
- 6장 스프링 JDBC
- 6.1 람다식 소개
- 6.2 예제 코드에서 사용할 예제 데이터 모델
- 6.3 JDBC 인프라스트럭처 살펴보기
- 6.4 스프링 JDBC 인프라스트럭처
- 6.4.1 스프링 JDBC 개요 및 패키지
- 6.5 데이터베이스 커넥션과 데이터소스
- 6.6 임베디드 데이터베이스 기능
- 6.7 DAO 클래스에서 DataSource 사용하기
- 6.8 예외 처리
- 6.9 JdbcTemplate 클래스
- 6.9.1 DAO 클래스에서 JdbcTemplate 초기화
- 6.9.2 JdbcTemplate을 사용해 단일 값 조회하기
- 6.9.3 NamedParameterJdbcTemplate으로 네임드 파라미터 사용하기
- 6.9.4 RowMapper
를 사용해 도메인 객체 조회하기 - 6.10 ResultSetExtractor를 사용해 중첩 도메인 객체 조회하기
- 6.11 JDBC 조작을 모델링하는 스프링 클래스
- 6.12 MappingSqlQuery
를 사용해 데이터 질의하기 - 6.12.1 SqlUpdate를 사용해 데이터 수정하기
- 6.13 데이터 등록 및 생성된 키 조회하기
- 6.14 BatchSqlUpdate를 사용하는 배치 조작
- 6.15 SqlFunction으로 저장 함수 호출하기
- 6.16 스프링 데이터 프로젝트의 JDBC 확장
- 6.17 JDBC 사용 시 고려사항
- 6.18 스프링 부트 JDBC
- 6.19 정리
- 7장 스프링에서 하이버네이트 사용하기
- 7.1 예제 코드에서 사용할 예제 데이터 모델
- 7.2 하이버네이트 SessionFactory 구성
- 7.3 하이버네이트 애너테이션으로 ORM 매핑하기
- 7.3.1 단순 매핑
- 7.3.2 일대다 매핑
- 7.3.3 다대다 매핑
- 7.4 하이버네이트 Session 인터페이스
- 7.4.1 하이버네이트 쿼리 언어를 사용해 데이터 쿼리하기
- 7.4.2 지연 로딩을 하는 간단한 쿼리
- 7.4.3 연관 관계 데이터를 조회하는 쿼리
- 7.5 데이터 등록
- 7.6 데이터 수정
- 7.7 데이터 삭제
- 7.8 엔터티로 테이블을 생성하도록 하이버네이트 구성하기
- 7.9 메서드와 필드 중 어디에 애너테이션을 추가할 것인가?
- 7.10 하이버네이트를 사용할 때 고려사항
- 7.11 정리
- 8장 스프링에서 JPA2로 데이터 액세스하기
- 8.1 JPA 소개
- 8.1.1 예제 코드에서 사용할 예제 데이터 모델
- 8.1.2 JPA의 EntityManagerFactory 구성
- 8.1.3 ORM 매핑에 JPA 애너테이션 사용하기
- 8.2 JPA로 데이터베이스 조작하기
- 8.2.1 데이터 쿼리에 JPQL 사용하기
- 8.2.2 명시되지 않은 타입의 결과 쿼리하기
- 8.3 생성자 표현식을 사용한 커스텀 결과 타입 쿼리
- 8.3.1 데이터 등록하기
- 8.3.2 데이터 수정하기
- 8.3.3 데이터 삭제하기
- 8.4 네이티브 쿼리 사용하기
- 8.4.1 단순한 네이티브 쿼리 사용하기
- 8.4.2 SQL ResultSet 매핑으로 네이티브 쿼리 사용하기
- 8.5 JPA 2 크라이티리어 API로 크라이티리어 쿼리 사용하기
- 8.6 스프링 데이터 JPA 소개
- 8.6.1 스프링 데이터 JPA 라이브러리 의존성 추가
- 8.6.2 데이터베이스 조작에 스프링 데이터 JPA Repository 사용하기
- 8.7 JpaRepository 사용하기
- 8.8 스프링 데이터 JPA로 커스텀 쿼리 사용하기
- 8.8.1 엔터티 클래스의 변화 추적
- 8.9 하이버네이트 엔버스로 엔터티 버전 관리하기
- 8.9.1 엔터티 버전 관리 테이블 추가
- 8.9.2 엔터티 버전 관리에 사용할 EntityManagerFactory 구성
- 8.9.3 엔터티 버전 관리와 이력 조회를 가능하게 하기
- 8.9.4 엔터티 버전 관리 테스트
- 8.10 스프링 부트 JPA
- 8.11 JPA를 사용할 때 고려사항
- 8.12 정리
- 9장 트랜잭션 관리
- 9.1 스프링 트랜잭션 추상화 레이어 알아보기
- 9.1.1 트랜잭션 타입
- 9.2 PlatformTransactionManager 구현체
- 9.3 트랜잭션 프로퍼티 살펴보기
- 9.3.1 TransactionDefinition 인터페이스
- 9.3.2 TransactionStatus 인터페이스
- 9.4 예제 코드를 위한 데이터 모델과 인프라
- 9.4.1 의존성이 추가된 간단한 스프링 JPA 프로젝트 생성하기
- 9.4.2 예제 데이터 모델과 공통 클래스
- 9.4.3 트랜잭션 관리에 AOP 사용하기
- 9.5 프로그래밍으로 트랜잭션 사용하기
- 9.5.1 트랜잭션 관리 시 고려사항
- 9.6 스프링과 글로벌 트랜잭션
- 9.6.1 JTA 예제 구현을 위한 인프라스트럭처
- 9.6.2 JTA로 글로벌 트랜잭션 구현하기
- 9.6.3 스프링 부트 JTA
- 9.6.4 JTA 트랜잭션 매니저 사용 시 고려사항
- 9.7 정리
- 10장 타입 변환과 포매팅을 사용해 유효성 검증하기
- 10.1 의존성
- 10.2 스프링 타입 변환 시스템
- 10.2.1 PropertyEditor를 사용해 String 타입을 다른 타입으로 변환하기
- 10.3 스프링 타입 변환 소개
- 10.3.1 사용자 정의 컨버터 구현하기
- 10.3.2 ConversionService 구성
- 10.3.3 임의의 타입끼리 변환하기
- 10.4 스프링에서 필드 포매팅하기
- 10.4.1 사용자 정의 포매터 구현하기
- 10.4.2 ConversionServiceFactoryBean 구성
- 10.5 스프링에서 유효성 검증
- 10.5.1 스프링 Validator 인터페이스 사용
- 10.5.2 JSR-349 빈 유효성 검증
- 10.6 사용자 정의 검증에 @AssertTrue 사용하기
- 10.7 사용자 정의 검증에서 고려사항
- 10.8 어떤 유효성 검증 API를 사용할지 결정하기
- 10.9 정리
- 11장 태스크 스케줄링
- 11.1 태스크 스케줄링 예제에 필요한 의존성
- 11.2 스프링의 태스크 스케줄링
- 11.2.1 스프링 TaskScheduler 추상화 소개
- 11.2.2 태스크 예제 살펴보기
- 11.2.3 애너테이션을 사용한 태스크 스케줄링
- 11.2.4 스프링의 비동기 태스크 실행
- 11.3 스프링에서 태스크 실행
- 11.4 정리
- 12장 스프링 리모팅 사용하기
- 12.1 예제 데이터 모델 사용하기
- 12.2 JPA 백엔드에 필요한 의존성 추가
- 12.3 SingerService 구현 및 구성하기
- 12.3.1 SingerService 구현하기
- 12.3.2 SingerService 구성하기
- 12.3.3 서비스 노출하기
- 12.3.4 서비스 호출하기
- 12.4 스프링에서 JMS 사용하기
- 12.4.1 스프링에서 JMS 리스너 구현하기
- 12.4.2 스프링에서 JMS 메시지 전송하기
- 12.4 스프링 부트 Artemis 스타터
- 12.6 스프링에서 RESTful-WS 사용하기
- 12.6.1 RESTful 웹 서비스 소개
- 12.6.2 예제에 필요한 의존성 추가하기
- 12.6.3 가수 RESTful 웹 서비스 설계하기
- 12.6.4 스프링 MVC를 사용한 RESTful 웹 서비스 노출하기
- 12.7 Castor XML 구성하기
- 12.7.1 SingerController 구현하기
- 12.7.2 스프링 웹 애플리케이션 구성하기
- 12.7.3 curl을 사용해 RESTful-WS 테스트하기
- 12.7.4 RestTemplate을 사용해 RESTful-WS에 접근하기
- 12.7.5 스프링 시큐리티로 RESTful-WS에 보안 적용하기
- 12.8 스프링 부트를 사용하는 스프링 RESTful-WS
- 12.9 스프링에서 AMQP 사용하기
- 12.9.1 스프링 부트로 AMQP 사용하기
- 12.10 정리
- 13장 스프링 테스트
- 13.1 테스트 범주 소개
- 13.2 스프링 테스트 애너테이션 사용하기
- 13.3 로직 단위 테스트 구현하기
- 13.3.1 필요한 의존성 추가하기
- 13.3.2 스프링 MVC 컨트롤러 단위 테스트
- 13.4 통합 테스트 구현하기
- 13.4.1 필요한 의존성 추가하기
- 13.4.2 서비스 레이어 테스트에 필요한 프로파일 구성
- 13.4.3 자바 구성 버전
- 13.4.4 인프라스트럭처 클래스 구현하기
- 13.4.5 서비스 레이어의 단위 테스트
- 13.4.6 DbUnit 대신 스프링 테스트 애너테이션 사용하기
- 13.5 프런트엔드 단위 테스트 구현하기
- 13.5.1 셀레늄 소개
- 13.6 정리
- 14장 스프링에서 스크립트 언어 사용하기
- 14.1 자바에서 스크립트 언어 사용하기
- 14.2 그루비 소개
- 14.2.1 동적 타입
- 14.2.2 구문 간소화
- 14.2.3 클로저
- 14.3 스프링에서 그루비 사용하기
- 14.3.1 Singer 도메인 개발
- 14.3.2 룰 엔진 구현하기
- 14.3.3 규칙 팩터리를 스프링의 갱신 가능한 빈으로 구현하기
- 14.3.4 나이 대 규칙 테스트
- 14.4 동적 언어 코드 내장하기
- 14.5 정리
- 15장 애플리케이션 모니터링
- 15.1 스프링에서의 JMX 지원
- 15.2 스프링 빈을 JMX로 내보내기
- 15.3 자바 VisualVM으로 JMX 모니터링하기
- 15.4 하이버네이트 통계 정보 모니터링
- 15.5 스프링 부트와 JMX
- 15.6 정리
- 16장 스프링 웹 애플리케이션
- 16.1 서비스 레이어 구현 예제
- 16.1.1 예제에 사용하는 데이터 모델
- 16.1.2 DAO 레이어 구현
- 16.1.3 서비스 레이어 구현
- 16.2 SingerService 구성
- 16.3 MVC 및 스프링 MVC 소개
- 16.3.1 MVC 소개
- 16.3.2 스프링 MVC 소개
- 16.3.3 스프링 MVC WebApplicationContext 계층 구조
- 16.3.4 스프링 MVC 요청 라이프사이클
- 16.3.5 스프링 MVC 구성
- 16.3.6 스프링 MVC에서 첫 번째 뷰 구현하기
- 16.3.7 DispatcherServlet 구성
- 16.3.8 SingerController 구현하기
- 16.3.9 가수 목록 뷰 구현하기
- 16.3.10 가수 목록 뷰 테스트
- 16.4 스프링 MVC 프로젝트 구조 이해하기
- 16.5.1 DispatcherServlet 구성에서 i18n 구성
- 16.5.2 가수 목록 뷰에서 i18n 지원 기능 추가
- 16.5 국제화(i18n)
- 16.6 테마와 템플릿 사용하기
- 16.6.1 테마 지원
- 16.7 아파치 타일즈를 사용한 뷰 템플릿
- 16.7.1 템플릿 레이아웃 설계
- 16.7.2 페이지 레이아웃 컴포넌트 구현하기
- 16.8 스프링 MVC에서 타일즈 구성
- 16.9 가수 정보 뷰의 구현
- 16.9.1 URL의 뷰 매핑
- 16.9.2 가수 조회 뷰 구현
- 16.9.3 가수 편집 뷰 구현
- 16.9.4 가수 등록 뷰 구현하기
- 16.9.5 JSR-349 빈 유효성 검증 활성화
- 16.10 제이쿼리와 제이쿼리 UI 사용하기
- 16.10.1 제이쿼리와 제이쿼리 UI 소개
- 16.10.2 뷰에서 제이쿼리와 제이쿼리 UI 사용
- 16.10.3 CKEditor를 사용한 리치 텍스트 편집
- 16.10.4 jqGrid를 사용한 데이터 그리드 페이징
- 16.10.5 가수 목록 뷰에서 jqGrid 사용
- 16.10.6 서버 측에서 페이징 사용
- 16.11 파일 업로드 처리
- 16.11.1 파일 업로드 처리
- 16.11.2 파일 업로드 지원을 위한 뷰 수정
- 16.11.3 파일 업로드를 지원하도록 컨트롤러 수정하기
- 16.12 스프링 시큐리티를 사용한 웹 애플리케이션 보안
- 16.12.1 스프링 시큐리티 구성하기
- 16.12.2 애플리케이션 로그인 기능 추가
- 16.12.3 애너테이션을 사용해 컨트롤러 메서드에 보안 적용하기
- 16.13 스프링 부트로 스프링 웹 애플리케이션 생성하기
- 16.13.1 DAO 레이어 설정하기
- 16.13.2 서비스 레이어 설정하기
- 16.13.3 웹 레이어 구성
- 16.13.4 스프링 시큐리티 설정하기
- 16.14 타임리프 뷰 생성하기
- 16.15 타임리프 확장 기능 사용하기
- 16.15.1 Webjars 사용
- 16.16 정리
- 17장 웹소켓
- 17.1 웹소켓 소개
- 17.2 스프링에서 웹소켓 사용하기
- 17.3 웹소켓 API 사용하기
- 17.3.1 SockJS 사용하기
- 17.4 STOMP로 메시지 전달하기
- 17.5 정리
- 18장 스프링 프로젝트: 배치, 인티그레이션, XD, 그리고 기타
- 18.1 스프링 배치
- 18.2 JSR-352
- 18.3 스프링 부트 배치
- 18.4 스프링 인티그레이션
- 18.5 스프링 XD
- 18.6 스프링 프레임워크의 5가지 주목할 만한 기능
- 18.6.1 함수형 웹 프레임워크(Functional Web Framework)
- 18.6.2 자바 9 상호운용성
- 18.6.3 JDK 모듈화
- 18.6.4 자바 9과 스프링 웹플럭스(WebFlux)을 사용한 반응형 프로그래밍
- 18.6.5 JUnit 5 주피터(Jupiter)에 대한 스프링 지원
- 18.7 정리
- 부록 A 개발 환경 구성하기
- A.1 pro-spring-5 프로젝트 소개
- A.2 그레이들 구성 이해하기
- A.3 pro-spring-5 프로젝트 내려받기
- A.4 빌드 및 트러블슈팅
- A.5 아파치 톰캣에 애플리케이션 배포