토비의 스프링 3.1 Vol. 2 스프링의 기술과 선택
XML 대신 자바코드를 이용해서 스프링을 개발할 수 있는 최신 빈 설정 기법부터 편리한 RESTful 스타일의 웹 컨트롤러 작성 기법까지 스프링 3.0과 스프링 3.1의 최신 기술을 상세하게 소개하고 그 중에서 자신에게 맞는 최적의 기술을 선택하고 조합할 수 있는 기준과 활용전략을 다룬다.
『토비의 스프링 3.1』은 스프링을 처음 접하거나 스프링을 경험했지만 스프링이 어렵게 느껴지는 개발자부터 스프링을 활용한 아키텍처를 설계하고 프레임워크를 개발하려고 하는 아키텍트에 이르기까지 모두 참고할 수 있는 스프링 완벽 바이블이다
대한민국 전자정부 표준 프레임워크 스프링을 설명하는 No. 1 베스트셀러!
호주의 IT서비스 기업인 이프릴의 대표 컨설턴트. 엔터프라이즈 오픈소스 커뮤니티인 오픈시드의 대표와 한국스프링사용자모임(KSUG)의 공동설립자이기도 하다. 8비트 컴퓨터 시절 프로그래밍의 매력에 빠져 10여 년간 취미로 프로그래밍을 즐겨오다 전문 개발자의 길로 들어서서 17년째 소프트웨어 개발과 교육, 컨설팅 일을 해오고 있다. 2004년부터 스프링을 이용해서 기업과 학교, 인터넷 서비스 업체의 시스템을 개발해왔고 스프링을 기반으로 한 애플리케이션 프레임워크 제작 컨설팅과 스프링 개발자 교육을 해오고 있다. JCO 컨퍼런스에서 세 차례 스프링을 주제로 발표했고 기묘, 이프릴, KSUG 등을 통해 스프링 세미나를 진행하기도 했다. 스프링과 오픈소스 기술에 관련된 정보와 경험을 공유하는 블로그(toby.epril.com)를 운영하고 있다.
1장 IoC 컨테이너와 DI
1.1 IoC 컨테이너: 빈 팩토리와 애플리케이션 컨텍스트
1.1.1 IoC 컨테이너를 이용해 애플리케이션 만들기
POJO 클래스
설정 메타정보
1.1.2 IoC 컨테이너의 종류와 사용 방법
StaticApplicationContext
GenericApplicationContext
GenericXmlApplicationContext
WebApplicationContext
1.1.3 IoC 컨테이너 계층구조
부모 컨텍스트를 이용한 계층구조 효과
컨텍스트 계층구조 테스트
1.1.4 웹 애플리케이션의 IoC 컨테이너 구성
웹 애플리케이션의 컨텍스트 계층구조
웹 애플리케이션의 컨텍스트 구성 방법
루트 애플리케이션 컨텍스트 등록
서블릿 애플리케이션 컨텍스트 등록
1.2 IoC/DI를 위한 빈 설정 메타정보 작성
1.2.1 빈 설정 메타정보
빈 설정 메타정보 항목
1.2.2 빈 등록 방법
XML: 《bean》 태그
XML: 네임스페이스와 전용 태그
자동인식을 이용한 빈 등록: 스테레오타입 애노테이션과 빈 스캐너
자바 코드에 의한 빈 등록: @Configuration 클래스의 @Bean 메소드
자바 코드에 의한 빈 등록: 일반 빈 클래스의 @Bean 메소드
빈 등록 메타정보 구성 전략
1.2.3 빈 의존관계 설정 방법
XML: 《property》, 《constructor-arg》
XML: 자동와이어링
XML: 네임스페이스와 전용 태그
애노테이션: @Resource
애노테이션: @Autowired/@Inject
@Autowired와 getBean(), 스프링 테스트
자바 코드에 의한 의존관계 설정
빈 의존관계 설정 전략
1.2.4 프로퍼티 값 설정 방법
메타정보 종류에 따른 값 설정 방법
PropertyEditor와 ConversionService
컬렉션
Null과 빈 문자열
프로퍼티 파일을 이용한 값 설정
1.2.5 컨테이너가 자동등록하는 빈
ApplicationContext, BeanFactory
ResourceLoader, ApplicationEventPublisher
systemProperties, systemEnvironment
1.3 프로토타입과 스코프
1.3.1 프로토타입 스코프
프로토타입 빈의 생명주기와 종속성
프로토타입 빈의 용도
DI와 DL
프로토타입 빈의 DL 전략
1.3.2 스코프
스코프의 종류
스코프 빈의 사용 방법
커스텀 스코프와 상태를 저장하는 빈 사용하기
1.4 기타 빈 설정 메타정보
1.4.1 빈 이름
XML 설정에서의 빈 식별자와 별칭
애노테이션에서의 빈 이름
1.4.2 빈 생명주기 메소드
초기화 메소드
제거 메소드
1.4.3 팩토리 빈과 팩토리 메소드
1.5 스프링 3.1의 Ioc 컨테이너와 DI
1.5.1 빈의 역할과 구분
빈의 종류
컨테이너 인프라 빈과 전용 태그
빈의 역할
1.5.2 컨테이너 인프라 빈을 위한 자바 코드 메타정보
IoC/DI 설정 방법의 발전
자바 코드를 이용한 컨테이너 인프라 빈 등록
1.5.3 웹 애플리케이션의 새로운 IoC 컨테이너 구성
1.5.4 런타임 환경 추상화와 프로파일
환경에 따른 빈 설정정보 변경 전략과 한계
런타임 환경과 프로파일
활성 프로파일 지정 방법
프로파일 활용 전략
1.5.5 프로퍼티 소스
프로퍼티
스프링에서 사용되는 프로퍼티의 종류
프로파일의 통합과 추상화
프로퍼티 소스의 사용
@PropertySource와 프로퍼티 파일
웹 환경에서 사용되는 프로퍼티 소스와 프로퍼티 소스 초기화 오브젝트
1.6 정리
2장 데이터 액세스 기술
2.1 공통 개념
2.1.1 DAO 패턴
DAO 인터페이스와 DI
예외처리
2.1.2 템플릿과 API
2.1.3 DataSource
학습 테스트와 통합 테스트를 위한 DataSource
오픈소스 또는 상용 DB 커넥션 풀
JDNI/WAS DB 풀
2.2 JDBC
2.2.1 스프링 JDBC 기술과 동작원리
스프링의 JDBC 접근 방법
스프링 JDBC가 해주는 작업
2.2.2 SimpleJdbcTemplate
SimpleJdbcTemplate 생성
SQL 파라미터
SQL 실행 메소드
SQL 조회 메소드
SQL 배치 메소드
2.2.3 SimpleJdbcInsert
SimpleJdbcInsert 생성
SimpleJdbcInsert 실행
2.2.4 SimpleJdbcCall
SimpleJdbcCall 생성
SimpleJdbcCall 실행
2.2.5 스프링 JDBC DAO
2.3 iBatis SqlMaps
2.3.1 SqlMapClient 생성
iBatis 설정파일과 매핑파일
SqlMapClient를 위한 SqlMapClientFactoryBean 등록
2.3.2 SqlMapClientTemplate
등록, 수정, 삭제
조회
SqlMapClientCallback
2.4 JPA
2.4.1 EntityManagerFactory 등록
LocalEntityManagerFactoryBean
JavaEE 5 서버가 제공하는 EntityManagerFactory
LocalContainerEntityManagerFactoryBean
트랜잭션 매니저
2.4.2 EntityManager와 JpaTemplate
JpaTemplate
애플리케이션 관리 EntityManager와 @PersistenceUnit
컨테이너 관리 EntityManager와 @PersistenceContext
@PersistenceContext와 확장된 퍼시스턴스 컨텍스트
JPA 예외 변환
JPA 예외 변환 AOP
2.5 하이버네이트
2.5.1 SessionFactory 등록
LocalSessionFactoryBean
AnnotationSessionFactoryBean
트랜잭션 매니저
2.5.2 Session과 HibernateTemplate
HibernateTemplate
SessionFactory.getCurrentSession()
2.6 트랜잭션
2.6.1 트랜잭션 추상화와 동기화
PlatformTransactionManager
트랜잭션 매니저의 종류
2.6.2 트랜잭션 경계설정 전략
코드에 의한 트랜잭션 경계설정
선언적 트랜잭션 경계설정
프록시 모드: 인터페이스와 클래스
AOP 방식: 프록시와 AspectJ
2.6.3 트랜잭션 속성
트랜잭션 전파: propagation
트랜잭션 격리수준: isolation
트랜잭션 제한시간: timeout
읽기전용 트랜잭션: read-only, readOnly
트랜잭션 롤백 예외: rollback-for, rollbackFor, rollbackForClassName
트랜잭션 커밋 예외: no-rollback-for, noRollbackFor, noRollbackForClassName
2.6.4 데이터 액세스 기술 트랜잭션의 통합
트랜잭션 매니저별 조합 가능 기술
ORM과 비 ORM DAO를 함께 사용할 때의 주의사항
2.6.5 JTA를 이용한 글로벌/분산 트랜잭션
독립형 JTA 트랜잭션 매니저
WAS 트랜잭션 매니저의 고급 기능 사용하기
2.7 스프링 3.1의 데이터 액세스 기술
2.7.1 persistence.xml 없이 JPA 사용하기
2.7.2 하이버네이트 4 지원
LocalSessionFactoryBean
LocalSessionFactoryBuilder
2.7.3 @EnableTransactionManager 295
2.8 정리
3장 스프링 웹 기술과 스프링 MVC
3.1 스프링의 웹 프레젠테이션 계층 기술
3.1.1 스프링에서 사용되는 웹 프레임워크의 종류
스프링 웹 프레임워크
스프링 포트폴리오 웹 프레임워크
스프링을 기반으로 두지 않는 웹 프레임워크
3.1.2 스프링 MVC와 DispatcherServlet 전략
DispatcherServlet과 MVC 아키텍처
DispatcherServlet의 DI 가능한 전략
3.2 스프링 웹 애플리케이션 환경 구성
3.2.1 간단한 스프링 웹 프로젝트 생성
루트 웹 애플리케이션 컨텍스트
서블릿 웹 애플리케이션 컨텍스트 등록
스프링 웹 프로젝트 검증
3.2.2 스프링 웹 학습 테스트
서블릿 테스트용 목 오브젝트
테스트를 위한 DispatcherServlet 확장
ConfigurableDispatcherServlet을 이용한 스프링 MVC 테스트
편리한 DispatcherServlet 테스트를 위한 AbstractDispatcherServletTest
3.3 컨트롤러
3.3.1 컨트롤러의 종류와 핸들러 어댑터
Servlet과 SimpleServletHandlerAdapter
HttpRequestHandler와 HttpRequestHandlerAdapter
Controller와 SimpleControllerHandlerAdapter
AnnotationMethodHandlerAdapter
3.3.2 핸들러 매핑
BeanNameUrlHandlerMapping
ControllerBeanNameHandlerMapping
ControllerClassNameHandlerMapping
SimpleUrlHandlerMapping
DefaultAnnotationHandlerMapping
기타 공통 설정정보
3.3.3 핸들러 인터셉터
HandlerInterceptor
핸들러 인터셉터 적용
3.3.4 컨트롤러 확장
커스텀 컨트롤러 인터페이스와 핸들러 어댑터 개발
3.4 뷰
3.4.1 뷰
InternalResourceView와 JstlView
RedirectView
VelocityView, FreeMarkerView
MarshallingView
AbstractExcelView, AbstractJExcelView, AbstractPdfView
AbstractAtomFeedView, AbstractRssFeedView
XsltView, TilesView, AbstractJasperReportsView
MappingJacksonJsonView
3.4.2 뷰 리졸버
InternalResourceViewResolver
VelocityViewResolver, FreeMarkerViewResolver
ResourceBundleViewResolver, XmlViewResolver, BeanNameViewResolver
ContentNegotiatingViewResolver
3.5 기타 전략
3.5.1 핸들러 예외 리졸버
AnnotationMethodHandlerExceptionResolver
ResponseStatusExceptionResolver
DefaultHandlerExceptionResolver
SimpleMappingExceptionResolver
3.5.2 지역정보 리졸버
3.5.3 멀티파트 리졸버
RequestToViewNameTranslator
3.6 스프링 3.1의 MVC
3.6.1 플래시 맵 매니저 전략
플래시 맵
플래시 맵 매니저
플래시 맵 매니저 전략
3.6.2 WebApplicationInitializer를 이용한 컨텍스트 등록
루트 웹 컨텍스트 등록
서블릿 컨텍스트 등록
3.7 정리
4장 스프링 @MVC
4.1 @RequestMapping 핸들러 매핑
4.1.1 클래스/메소드 결합 매핑정보
@RequestMapping 애노테이션
타입 레벨 매핑과 메소드 레벨 매핑의 결합
메소드 레벨 단독 매핑
타입 레벨 단독 매핑
4.1.2 타입 상속과 매핑
매핑정보 상속의 종류
제네릭스와 매핑정보 상속을 이용한 컨트롤러 작성
4.2 @Controller
4.2.1 메소드 파라미터의 종류
HttpServletRequest, HttpServletResponse
HttpSession
WebRequest, NativeWebRequest
Locale
InputStream, Reader
OutputStream, Writer
@PathVariable
@RequestParam
@CookieValue
@RequestHeader
Map, Model, ModelMap
@ModelAttribute
Errors, BindingResult
SessionStatus
@RequestBody
@Value
@Valid
4.2.2 리턴 타입의 종류
자동 추가 모델 오브젝트와 자동생성 뷰 이름
ModelAndView
String
void
모델 오브젝트
Map/Model/ModelMap
View
@ResponseBody
4.2.3 @SessionAttributes와 SessionStatus
도메인 중심 프로그래밍 모델과 상태 유지를 위한 세션 도입의 필요성
@SessionAttributes
SessionStatus
등록 폼을 위한 @SessionAttributes 사용
스프링 목 오브젝트와 AbstractDispatcherServletTest를 이용해 세션 테스트 만들기
4.3 모델 바인딩과 검증
4.3.1 PropertyEditor
디폴트 프로퍼티 에디터
커스텀 프로퍼티 에디터
@InitBinder
WebBindingInitializer
프로토타입 빈 프로퍼티 에디터
4.3.2 Converter와 Formatter
Converter
ConversionService
Formatter와 FormattingConversionService
바인딩 기술의 적용 우선순위와 활용 전략
4.3.3 WebDataBinder 설정 항목
allowedFields, disallowedFields
requiredFields
fieldMarkerPrefix
fieldDefaultPrefix
4.3.4 Validator와 BindingResult, Errors
Validator
JSR-303 빈 검증 기능
BindingResult와 MessageCodeResolver
MessageSource
4.3.5 모델의 일생
HTTP 요청으로부터 컨트롤러 메소드까지
컨트롤러 메소드로부터 뷰까지
4.4 JSP 뷰와 form 태그
4.4.1 EL과 spring 태그 라이브러리를 이용한 모델 출력
JSP EL
스프링 SpEL
지역화 메시지 출력
4.4.2 spring 태그 라이브러리를 이용한 폼 작성
단일 폼 모델
《spring:bind》와 BindingStatus
4.4.3 form 태그 라이브러리
《form:form》
《form:input》
《form:label》
《form:errors》
《form:hidden》
《form:password》, 《form:textarea》
《form:checkbox》, 《form:checkboxes》
《form:radiobutton》, 《form:radiobuttons》
《form:select》, 《form:option》, 《form:options》
커스텀 UI 태그 만들기
4.5 메시지 컨버터와 AJAX
4.5.1 메시지 컨버터의 종류
JSON을 이용한 AJAX 컨트롤러: GET JSON
JSON을 이용한 AJAX 컨트롤러: POST(JSON) JSON
4.6 mvc 네임스페이스
《mvc:annotation-driven》
《mvc:interceptors》
《mvc:view-controller》
4.7 @MVC 확장 포인트
4.7.1 AnnotationMethodHandlerAdapter
SessionAttributeStore
WebArgumentResolver
ModelAndViewResolver
4.8 URL과 리소스 관리
4.8.1 《mvc:default-servlet-handler/》를 이용한 URL 관리
디폴트 서블릿과 URL 매핑 문제
《mvc:default-servlet-handler/》
4.8.2 《url:resource/》를 이용한 리소스 관리
4.9 스프링 3.1의 @MVC
4.9.1 새로운 RequestMapping 전략
@RequestMapping 메소드와 핸들러 매핑 전략의 불일치
HandlerMethod
@RequestMapping 전략 선택
4.9.2 @RequestMapping 핸들러 매핑: RequestMappingHandlerMapping
요청 조건
요청 조건의 결합 방식
4.9.3 @RequestMapping 핸들러 어댑터
파라미터 타입
확장 포인트
4.9.4 @EnableWebMvc와 WebMvcConfigurationSupport를 이용한 @MVC 설정
@EnableWebMvc와 WebMvcConfigurer
@MVC 설정자 빈 등록 방법
@MVC 전략용 설정 빈 등록
4.10 정리
5장 AOP와 LTW
5.1 애스펙트 AOP
5.1.1 프록시 기반 AOP
프록시 기반 AOP 개발 스타일의 종류와 특징
자동 프록시 생성기와 프록시 빈
프록시의 종류
5.1.2 @AspectJ AOP
@AspectJ를 이용하기 위한 준비사항
@Aspect 클래스와 구성요소
포인트컷 메소드와 애노테이션
어드바이스 메소드와 애노테이션
파라미터 선언과 바인딩
@AspectJ를 이용한 AOP의 학습 방법과 적용 전략
5.2 AspectJ와 @Configurable
5.2.1 AspectJ AOP
5.2.2 빈이 아닌 오브젝트에 DI 적용하기
DI 애스펙트
@Configurable
로드타임 위버와 자바 에이전트
5.3 로드타임 위버(LT)
5.4 스프링 3.1의 AOP와 LTW
5.4.1 AOP와 LTW를 위한 애노테이션
@EnableAspectJAutoProxy
@EnableLoadTimeWeaving
5.5 정리
6장 테스트 컨텍스트 프레임워크
6.1 테스트 컨텍스트 프레임워크
6.1.1 테스트 프레임워크와 컨텍스트 테스트
테스트용 애플리케이션 컨텍스트 캐싱과 설정파일
컨텍스트 설정의 상속과 컨텍스트 로더
6.1.2 테스트 코드의 테스트 컨텍스트 활용
테스트 컨텍스트로부터 DI 받기
공유 컨텍스트 사용 시 주의할 점
6.2 트랜잭션 지원 테스트
6.2.1 테스트의 트랜잭션 지원 필요성
DAO 단독 테스트
롤백 테스트
6.2.2 트랜잭션 지원 테스트 작성 방법
트랜잭션 매니저
@Transactional 테스트
ORM 롤백 트랜잭션 테스트의 주의사항
트랜잭션 지원 테스트에 DBUnit 이용하기
6.3 스프링 3.1의 컨텍스트 테스트 프레임워크
6.3.1 자바 코드 설정정보와 프로파일 활용
@Configuration 클래스 테스트
@ActiveProfile
6.4 정리
7장 스프링의 기타 기술과 효과적인 학습 방법
7.1 스프링 기술과 API를 효과적으로 학습하는 방법
7.1.1 빈으로 등록되는 스프링 클래스와 DI
구현 인터페이스 분석
프로퍼티 분석
DI/확장 포인트 분석
7.2 IoC 컨테이너 DI
7.2.1 BeanPostProcessor와 BeanFactoryPostProcessor
BeanPostProcessor
BeanFactoryPostProcessor
7.3 SpEL
7.3.1 SpEL 사용 방법
7.4 OXM
7.4.1 Marshaller/Unmarshaller 인터페이스
7.4.2 OXM 기술 어댑터 클래스
7.5 리모팅과 웹 서비스, EJB
7.5.1 익스포터와 프록시
익스포터
프록시
7.5.2 RESTful 서비스 템플릿
7.5.3 EJB 서비스 이용
7.6 태스크 실행과 스케줄링
7.6.1 TaskExecutor 서비스 추상화
7.6.2 TaskScheduler
7.6.3 task 네임스페이스
《task:executor》
《task:scheduler》
《task:scheduled-tasks》와 《task:scheduled》
7.6.4 애노테이션을 이용한 스케줄링과 비동기 태스크 실행
@Scheduled
@Async
7.7 캐시 추상화(스프링 3.1)
7.7.1 애노테이션을 이용한 캐시 속성 부여
@Cacheable
@CacheEvict와 @CachePut
애노테이션을 이용한 캐시 기능 설정
7.7.2 캐시 매니저
7.8 @Enable 애노테이션을 이용한 빈 설정정보 모듈화
7.8.1 @Import와 @Configuration 상속
@Import를 이용한 단순 재사용
@Configuration 클래스 상속과 오버라이딩을 이용한 확장 방법
7.8.2 @Enable 전용 애노테이션과 ImportAware
@Enable 애노테이션 적용
ImportAware 인터페이스를 이용한 옵션 지정
7.8.3 빈 설정자
7.8.4 ImportSelector와 ImportBeanDefinitionRegistrar
7.9 정리
부록 A 스프링 모듈
A.1 스프링 모듈의 종류와 특징
A.1.1 스프링 모듈 이름
A.1.2 스프링 모듈 추가
수동 추가
Maven/Ivy 자동 추가
A.1.3 스프링 모듈 목록
A.2 스프링 모듈의 의존관계
A.2.1 모듈별 의존관계
ASM 모듈
Core 모듈
Beans 모듈
AOP 모듈
Expression 모듈
Context 모듈
Context.Support 모듈
Transaction 모듈
JDBC 모듈
ORM 모듈
Web 모듈
Web.Servlet 모듈
Web.Portlet 모듈
Web.Struts 모듈
JMS 모듈
Aspects 모듈
Instrument 모듈
Instrument.Tomcat 모듈
Test 모듈
부록 B 스프링 의존 라이브러리
B.1 의존 라이브러리의 종류와 특징
B.1.1 의존 라이브러리 이름
B.1.2 의존 라이브러리 추가
수동 추가
자동 추가
B.2 모듈별 의존 라이브러리 의존관계
B.2.1 필수 라이브러리
B.2.2 모듈별 선택 라이브러리
ASM 모듈
Core 모듈
Beans 모듈
AOP 모듈
Expression 모듈
Context 모듈
Context.Support 모듈
Transaction 모듈
JDBC 모듈
ORM 모듈
Web 모듈
Web.Servlet 모듈
Web.Portlet 모듈
Web.Struts 모듈
JMS 모듈
Aspects 모듈
Instrument 모듈
Instrument.Tomcat 모듈