토비의 스프링 3.1 Vol 1: 스프링의 이해와 원리
Description
대한민국 전자정부 표준 프레임워크 스프링을 설명하는 No. 1 베스트셀러!

단순한 예제를 스프링 3.0과 스프링 3.1의 기술을 적용하며 발전시켜 나가는 과정을 통해 스프링의 핵심 프로그래밍 모델인 IoC/DI, PSA, AOP의 원리와 이에 적용된 다양한 디자인 패턴, 프로그래밍 기법을 이해할 수 있도록 도와준다. 이어지는 에서 상세히 소개하는 스프링 3.0과 스프링 3.1의 방대한 기술을 쉽게 이해하고 효과적으로 응용하는 데 필요한 기반 지식을 쌓도록 도와준다.

『토비의 스프링 3.1』은 스프링을 처음 접하거나 스프링을 경험했지만 스프링이 어렵게 느껴지는 개발자부터 스프링을 활용한 아키텍처를 설계하고 프레임워크를 개발하려고 하는 아키텍트에 이르기까지 모두 참고할 수 있는 스프링 완벽 바이블이다.
저자

이일민

저자이일민은호주의IT서비스기업인이프릴의대표컨설턴트다.엔터프라이즈오픈소스커뮤니티인오픈시드의대표이며한국스프링사용자모임(KSUG)의공동설립자이기도하다.8비트컴퓨터시절프로그래밍의매력에빠져10여년간취미로프로그래밍을즐겨오다전문개발자의길로들어서서19년째소프트웨어개발과교육,컨설팅일을해오고있다.2004년부터스프링을이용해서기업과학교,인터넷서비스업체의시스템을개발해왔고스프링을기반으로한애플리케이션프레임워크제작컨설팅과스프링개발자교육을해오고있다.JCO컨퍼런스에서세차례스프링을주제로발표했고기묘,이프릴,KSUG등을통해스프링세미나를진행하기도했다.스프링과오픈소스기술에관련된정보와경험을공유하는블로그를운영하고있다.

목차

1장오브젝트와의존관계
1.1초난감DAO
1.1.1User
1.1.2UserDao
1.1.3main()을이용한DAO테스트코드
1.2DAO의분리
1.2.1관심사의분리
1.2.2커넥션만들기의추출
UserDao의관심사항
중복코드의메소드추출
변경사항에대한검증:리팩토링과테스트
1.2.3DB커넥션만들기의독립
상속을통한확장
1.3DAO의확장
1.3.1클래스의분리
1.3.2인터페이스의도입
1.3.3관계설정책임의분리
1.3.4원칙과패턴
개방폐쇄원칙
높은응집도와낮은결합도
전략패턴
1.4제어의역전(IoC)
1.4.1오브젝트팩토리
팩토리
설계도로서의팩토리
1.4.2오브젝트팩토리의활용
1.4.3제어권의이전을통한제어관계역전
1.5스프링의IoC
1.5.1오브젝트팩토리를이용한스프링IoC
애플리케이션컨텍스트와설정정보
DaoFactory를사용하는애플리케이션컨텍스트
1.5.2애플리케이션컨텍스트의동작방식
1.5.3스프링IoC의용어정리
1.6싱글톤레지스트리와오브젝트스코프
1.6.1싱글톤레지스트리로서의애플리케이션컨텍스트
서버애플리케이션과싱글톤
싱글톤패턴의한계
싱글톤레지스트리
1.6.2싱글톤과오브젝트의상태
1.6.3스프링빈의스코프
1.7의존관계주입(DI)
1.7.1제어의역전(IoC)과의존관계주입
1.7.2런타임의존관계설정
의존관계
UserDao의의존관계
UserDao의의존관계주입
1.7.3의존관계검색과주입
1.7.4의존관계주입의응용
기능구현의교환
부가기능추가
1.7.5메소드를이용한의존관계주입
1.8XML을이용한설정
1.8.1XML설정
connectionMaker()전환
userDao()전환
XML의의존관계주입정보
1.8.2XML을이용하는애플리케이션컨텍스트
1.8.3DataSource인터페이스로변환
DataSource인터페이스적용
자바코드설정방식
XML설정방식
1.8.4프로퍼티값의주입
값주입
value값의자동변환
1.9정리

2장테스트
2.1UserDaoTest다시보기
2.1.1테스트의유용성
2.1.2UserDaoTest의특징
웹을통한DAO테스트방법의문제점
작은단위의테스트
자동수행테스트코드
지속적인개선과점진적인개발을위한테스트
2.1.3UserDaoTest의문제점
2.2UserDaoTest개선
2.2.1테스트검증의자동화
2.2.2테스트의효율적인수행과결과관리
JUnit테스트로전환
테스트메소드전환
검증코드전환
JUnit테스트실행
2.3개발자를위한테스팅프레임워크JUnit
2.3.1JUnit테스트실행방법
IDE
빌드툴
2.3.2테스트결과의일관성
deleteAll()의getCount()추가
deleteAll()과getCount()의테스트
동일한결과를보장하는테스트
2.3.3포괄적인테스트
getCount()테스트
addAndGet()테스트보완
get()예외조건에대한테스트
테스트를성공시키기위한코드의수정
포괄적인테스트
2.3.4테스트가이끄는개발
기능설계를위한테스트
테스트주도개발
2.3.5테스트코드개선
@Before
픽스처
2.4스프링테스트적용
2.4.1테스트를위한애플리케이션컨텍스트관리
스프링테스트컨텍스트프레임워크적용
테스트메소드의컨텍스트공유
테스트클래스의컨텍스트공유
@Autowired
2.4.2DI와테스트
테스트코드에의한DI
테스트를위한별도의DI설정
컨테이너없는DI테스트
DI를이용한테스트방법선택
2.5학습테스트로배우는스프링
2.5.1학습테스트의장점
2.5.2학습테스트예제
JUnit테스트오브젝트테스트
스프링테스트컨텍스트테스트
2.5.3버그테스트
2.6정리

3장템플릿
3.1다시보는초난감DAO
3.1.1예외처리기능을갖춘DAO
JDBC수정기능의예외처리코드
JDBC조회기능의예외처리
3.2변하는것과변하지않는것
3.2.1JDBCtry/catch/finally코드의문제점
3.2.2분리와재사용을위한디자인패턴적용
메소드추출
템플릿메소드패턴의적용
전략패턴의적용
DI적용을위한클라이언트/컨텍스트분리
3.3JDBC전략패턴의최적화
3.3.1전략클래스의추가정보
3.3.2전략과클라이언트의동거
로컬클래스
익명내부클래스
3.4컨텍스트와DI
3.4.1JdbcContext의분리
클래스분리
빈의존관계변경
3.4.2JdbcContext의특별한DI
스프링빈으로DI
코드를이용하는수동DI
3.5템플릿과콜백
3.5.1템플릿/콜백의동작원리
템플릿/콜백의특징
JdbcContext에적용된템플릿/콜백
3.5.2편리한콜백의재활용
콜백의분리와재활용
콜백과템플릿의결합
3.5.3템플릿/콜백의응용
테스트와try/catch/finally
중복의제거와템플릿/콜백설계
템플릿/콜백의재설계
제네릭스를이용한콜백인터페이스
3.6스프링의JdbcTemplate
3.6.1update()
3.6.2queryForInt()
3.6.3queryForObject()
3.6.4query()
기능정의와테스트작성
query()템플릿을이용하는getAll()구현
테스트보완
3.6.5재사용가능한콜백의분리
DI를위한코드정리
중복제거
템플릿/콜백패턴과UserDao
3.7정리

4장예외
4.1사라진SQLException
4.1.1초난감예외처리
예외블랙홀
무의미하고무책임한throws
4.1.2예외의종류와특징
4.1.3예외처리방법
예외복구
예외처리회피
예외전환
4.1.4예외처리전략
런타임예외의보편화
add()메소드의예외처리
애플리케이션예외
4.1.5SQLException은어떻게됐나?
4.2예외전환
4.2.1JDBC의한계
비표준SQL
호환성없는SQLException의DB에러정보
4.2.2DB에러코드매핑을통한전환
4.2.3DAO인터페이스와DataAccessException계층구조
DAO인터페이스와구현의분리
데이터액세스예외추상화와DataAccessException계층구조
4.2.4기술에독립적인UserDao만들기
인터페이스적용
테스트보완
DataAccessException활용시주의사항
4.3정리

5장서비스추상화
5.1사용자레벨관리기능추가
5.1.1필드추가
Level이늄
User필드추가
UserDaoTest테스트수정
UserDaoJdbc수정
5.1.2사용자수정기능추가
수정기능테스트추가
UserDao와UserDaoJdbc수정
수정테스트보완
5.1.3UserService.upgradeLevels()
UserService클래스와빈등록
UserServiceTest테스트클래스
upgradeLevels()메소드
upgradeLevels()테스트
5.1.4UserService.add()
5.1.5코드개선
upgradeLevels()메소드코드의문제점
upgradeLevels()리팩토링
User테스트
UserServiceTest개선
5.2트랜잭션서비스추상화
5.2.1모아니면도
테스트용UserService대역
강제예외발생을통한테스트
테스트실패의원인
5.2.2트랜잭션경계설정
JDBC트랜잭션의트랜잭션경계설정
UserService와UserDao의트랜잭션문제
비즈니스로직내의트랜잭션경계설정
UserService트랜잭션경계설정의문제점
5.2.3트랜잭션동기화
Connection파라미터제거
트랜잭션동기화적용
트랜잭션테스트보완
JdbcTemplate과트랜잭션동기화
5.2.4트랜잭션서비스추상화
기술과환경에종속되는트랜잭션경계설정코드
트랜잭션API의의존관계문제와해결책
스프링의트랜잭션서비스추상화
트랜잭션기술설정의분리
수직,수평계층구조와의존관계
5.3서비스추상화와단일책임원칙
단일책임원칙
단일책임원칙의장점
5.4메일서비스추상화
5.4.1JavaMail을이용한메일발송기능
JavaMail메일발송
5.4.2JavaMail이포함된코드의테스트
5.4.3테스트를위한서비스추상화
JavaMail을이용한테스트의문제점
메일발송기능추상화
테스트용메일발송오브젝트
테스트와서비스추상화
5.4.4테스트대역
의존오브젝트의변경을통한테스트방법
테스트대역의종류와특징
목오브젝트를이용한테스트
5.5정리

6장AOP
6.1트랜잭션코드의분리
6.1.1메소드분리
6.1.2DI를이용한클래스의분리
DI적용을이용한트랜잭션분리
UserService인터페이스도입
분리된트랜잭션기능
트랜잭션적용을위한DI설정
트랜잭션분리에따른테스트수정
트랜잭션경계설정코드분리의장점
6.2고립된단위테스트
6.2.1복잡한의존관계속의테스트
6.2.2테스트대상오브젝트고립시키기
테스트를위한UserServiceImpl고립
고립된단위테스트활용
UserDao목오브젝트
테스트수행성능의향상
6.2.3단위테스트와통합테스트
6.2.4목프레임워크
Mockito프레임워크
6.3다이내믹프록시와팩토리빈
6.3.1프록시와프록시패턴,데코레이터패턴
데코레이터패턴
프록시패턴
6.3.2다이내믹프록시
프록시의구성과프록시작성의문제점
리플렉션
프록시클래스
다이내믹프록시적용
다이내믹프록시의확장

출판사 서평

★이책에서다루는내용★

★DIJ/JavaConfig,OXM,@MVC,SpEL,Task,REST등의스프링3.0의최신기술소개
JavaEE6의JSR-303과자바코드를이용한최첨단DI기술,XML매핑을위한OXM,기존MVC를완벽하게대체한강력한웹프레임워크인@MVC,스프링공식EL인SpEL,JSR-303(BeanValidation)과새로운컨버터와포매터활용방법,각종비동기작업을위한Task기능,REST템플릿사용법등스프링3.0의새로운기능을기존스프링기술과함께상세히소개한다.

★런타임추상화,프로파일,프로퍼티소스,캐시추상화,발전된@MVC,플래시맵등스프링3.1의최신기술소개
프로파일을이용한다이내믹한빈설정기술,통합된프로퍼티소스,더욱강력해진@MVC핸들러작성,플래시맵활용방법과AOP를이용한캐시추상화등스프링3.1의최신기술과달라진점을자세히소개한다.

★스프링기술선택을위한상세한기술비교,선택기준제시
같은기술에도수많은옵션을제공하는스프링의특성때문에기술선택에고민하는개발자를위해서스프링이제공하는다양한기술옵션을비교하고,환경에따른적절한선택을위한기준을제공해준다.

★@Enable빈설정모듈화기법소개
스프링3.1의최신자바코드빈설정기법을이용해서재사용가능한빈설정모듈을만드는방법을스프링3.1에적용된실전예를기준으로상세하게설명한다.

★스프링애플리케이션아키텍처설계와스프링기반프레임워크제작을위한완벽가이드
스프링을이용한엔터프라이즈애플리케이션아키텍처작성을위한다양한아키텍처소개와전략분석,스프링을기반으로한사내프레임워크제작에꼭필요한스프링확장기법을소개한다.

★이책의구성★

스프링이공개된지이미9년째이고많은개발자가스프링을사용해애플리케이션을개발해오고있다.그럼에도적지않은수의개발자들은스프링의핵심가치와혜택을충분히누리지못하는듯하다.스프링의가치를제대로누리며사용하려면스프링을제대로공부해야한다.스프링을효과적으로익히려면다음의세가지단계를통해스프링을학습해야한다.

▶스프링의핵심가치와원리에대한이해
▶스프링의기술에대한지식과선택기준정립
▶스프링의적용과확장

이책은이세가지단계를따라서스프링을공부하려는사람을대상으로쓰여진책으로,Vol.1에서는첫단계인‘핵심가치와원리에대한이해’를중심으로하고,Vol.2에서는두번째단계인‘스프링기술에대한지식과선택’을집중해서다룬다.세번째단계인확장에대해서는책의여러곳에서다양한전략과예제,힌트를제공한다.하지만본격적으로응용과확장에대한지식을쌓는일은독자들의몫이다.각자의상황에맞게처음두단계에서배운지식을응용해스프링을확장해보는훈련을해야한다.

의구성과예제

Vol.1에서는간단한예제를만들어가는과정을통해스프링의기본원리와핵심기술을설명한다.스프링은개발자가만드는코드가얹혀서동작하는프레임워크다.프레임워크의가장중요한목적은개발자가일정한틀을따라효과적으로애플리케이션을개발하도록돕는것이다.따라서프레임워크를잘이해하려면프레임워크를사용했을때애플리케이션코드가어떻게만들어지는지자세히살펴봐야한다.

Vol.1에서는각장마다스프링프레임워크를사용하지않고개발한단순한코드를먼저작성해보고,여러단계를거쳐최종적으로스프링프레임워크를활용한코드로발전시킨다.프레임워크를적용하지않았을때의코드와적용후의코드를비교하면서스프링프레임워크를사용하면어떤식으로코드가만들어져야하는지를설명한다.

Vol.1에서다루는내용은Vol.2에서본격적으로소개할스프링의다양한기술을이해하는데중요한기반이된다.스프링에적용된기본패턴과기반이되는원리를Vol.1에서설명하는순서에따라학습해두면이후에스프링의개별기술과API를익힐때많은도움이될것이다.

1장부터7장까지는사용자관리기능을구현하는하나의예제를만드는과정을단계적으로설명한다.예제는처음부터끝까지모두연결된다.코드를지속적으로개선하면서발전시키기때문에코드가계속바뀌고새로운클래스가추가되거나사라지기도한다.에이콘출판사홈페이지에서내려받을수있는소스코드의예제들은각장에서코드가바뀌는주요절별로제공된다.가능하면Vol.1의예제는책의내용을참고해서직접따라해보기를권장한다.코드가만들어지고개선되고발전하는과정을직접체험하는것이Vol.1의내용을이해하는데가장좋은방법이다.

스프링3.1의새로운기술을다루는7.6절을제외한나머지모든예제는스프링3.0을기준으로사용할라이브러리를소개한다.모든내용은스프링3.1에서도동일하게적용되므로스프링3.1을이용해예제를작성해도무방하다.소스코드파일에는스프링3.0과3.1버전으로각각작성된Vol.1의예제프로젝트가담겨있다.

[별도소스코드제공]

-이책에들어있는모든예제의소스코드
-스프링3.0과스프링3.1의기술활용법을보여주는학습테스트코드
-스프링@MVC를이용한웹애플리케이션프로젝트

★이책의대상독자★

이책은스프링을이용해서엔터프라이즈자바애플리케이션을개발하려는모든개발자를대상으로한다.이책을공부하기위해서는자바언어와JDBC를이용한DB프로그래밍,그리고기초적인웹개발지식이필요하다.Vol.2에는스프링외의서드파티프레임워크나JavaEE표준기술을스프링에통합해서사용하는내용이일부포함되어있다.이런내용을살펴볼때는관련기술에대한지식이추가로필요할수있다.

★스프링3.1의새로운기능★

스프링3.1에추가된주요한기능과특징은다음과같다.

강화된자바코드를이용한빈설정
스프링3.1은스프링3.0부터지원하기시작한자바코드를이용한빈설정방식을대폭확장해서스프링빈설정의거의모든영역으로확대했다.기존에XML로작성했던스프링설정정보를3.1에서는자바코드로대체할수있다.XML을전혀사용하지않고스프링애플리케이션을작성할수도있다.자바코드를이용한빈설정을위해다양한애노테이션이추가됐다.XML의전용커스텀태그를대체할수있는,@Enable로시작하는전용애노테이션도제공된다.

런타임환경추상화
스프링애플리케이션이실행되는런타임환경정보를추상화한환경오브젝트가컨테이너를통해제공된다.실행환경에따라달라지는빈설정을효과적으로관리할수있는프로파일과각종프로퍼티정보를컨테이너를통해일관된방식으로제공할수있게해주는프로퍼티소스가환경오브젝트가제공하는주요기능이다.

JPA지원확장과하이버네이트4지원
하이버네이트4지원기능이새롭게추가됐다.JPA를이용할때보다편리하게설정정보를작성할수있는편리한기능도추가됐다.

새로운DispatcherServlet전략과플래시맵
스프링3.0에서사용되던DispatcherServlet전략의일부가새롭게설계된전략으로대체됐다.이를통해MVC기능을확장하기가편리해졌다.Post/Redirect/Get패턴에사용할수있는플래시맵기능도추가됐다.

캐시추상화
AOP를이용한메소드레벨의캐시추상화기능이추가됐다.이를이용해캐시구현기술에독립적인방식으로애플리케이션빈에캐시기능을적용할수있게됐다.맵을이용한간단한캐시구현부터ehcache를이용한고급캐시기술까지지원한다.

★『토비의스프링3.1』추천의글★

스프링의아버지로드존슨은'객체지향설계는특정구현기술보다,심지어자바보다도더중요하다.'고말했다.『토비의스프링3』책은그가치를잘담아냈다.테스트하기쉬운코드,구성요소의역할과책임을섬세하게나누는설계등이책에서강조하는기법은프로그래밍을하는사람이면누구나새겨볼만한내용이다.거기에비해어쩌면최신기술의소개라는측면은부차적일지도모른다.그럼에도최신스프링3.1에맞춰개정판이나온다는소식은반갑기그지없다.이제이책이단순히흘러가는트렌드를잡는책이아니라『수학의정석』처럼꾸준히개정되며늘우리에게지식과통찰을주는스테디셀러로자리잡기를기원한다.
-정상혁/NHNTechnologyService신규서비스개발팀차장

스프링활용법뿐아니라그원리까지쉽게이해할수있도록풀어서설명하는이책은대규모프로젝트에서정형화된업무로직의반복된구현에지친SI개발자분들에게학습의즐거움과더나은코드를만들어가는과정에서실력이늘어가는개발의재미를다시금느끼게해줄것입니다.최근들어서는3.0에서3.1,3.2로발전해나가는스프링의발전방향을눈여겨보는분들도많을것이다.이처럼매우적절한시기에스프링3.1을다루는개정판까지나온다니,클라우드,빅데이터등점점복잡해지는IT환경의변화를수용하기위해스프링이어떻게변해가는지도이책을통해엿볼수있을것입니다.
-김승권/금융분야독립컨설턴트

★『토비의스프링3』추천의글★

저자인이일민씨를아는사람에게는긴설명이필요없겠지만,잘모르는분을위해이책의고유한가치를몇가지떠올려봤다.
첫째,뛰어난강사이기도한저자의효과적인강의스타일을담아낸책의이야기전개다.저자는대뜸스프링이가진기술을나열하기보단친숙한자바코드(초난감DAO)를내밀었다.책을읽어가면점차독자는흔히쓰이던코드의문제점에공감하고,여러가지방식으로개선해가는여정을함께한다.책과함께고민한독자라면여정의끝에서스프링을쓰는이유와어떤게올바른사용법인지배울수있다.사실이런전개는정말뛰어난외국서적에서는종종볼수있는방식이지만,한글기술서로한정하면가히독보적이라할수있다.
둘째,사상과활용법을모두담은넓은효용성이다.시중에두꺼운기술서는드물지않지만,이책은API설명이나화면캡처로지면을할애하지않았다.책전반부는객체지향프로그래밍관점에서어떤코드가좋은코드인지를다루면서왜스프링을써야하는지를설명하고,후반부는스프링을구성하는요소기술을올바르게사용하는방법을빠짐없이설명하고있음을상기하면책의두께는놀랍도록얇다(?).학습과제에만초점을맞출수있도록구성한장의구성과단계별예제는SoC(SeparationofConcerns)를통해방대한내용을모두담아내기위해저자가각고해노력한결과물이다.
셋째,책의내용과예제코드의정확함이다.프로그래밍서적으로공부할때예제가작동하지않아시간을허비한경험이있는개발자는드물지않다.1부는테스트주도로진행하고,2부도예제전부가테스트코드형태로만들어져결함을막았다.한편개념설명을위해다이어그램을활용하고코드에도충분한부연설명을붙인결과,섬세하고정확한내용이만들어졌다.
변변한책이없던시절스프링을이해하기위해어쩔수없이스프링소스코드를봤다.스프링소스코드는객체를조직화하는설계에대한모범답안과도같았다.하지만방대한코드만보고의도를모두익힐수는없었다.그후에로드존슨의책을반복해읽으면서스프링을이해할수록감탄하고또감탄했다.다행스럽게도지금스프링을공부하는여러분에게는더나은방법을제시할수있다.로드존슨이했던이야기를로드존슨은할수없는우리말로읽을수있다.그리고진정한고수개발자로꾸준히노력해온이일민씨의노하우를함께배울수있다.
-안영회(http://younghoe.info)
한국스프링사용자모임공동설립자,(주)아이티와이즈컨설팅컨설턴트

이책은스프링의핵심가치를전달하는데집중하고있다.로드존슨이쓴『J2EEDevelopmentwithoutEJB』이후로지금까지출간된스프링서적중에서이책만큼스프링의핵심가치를제대로전달한책은보지못