목차
옮긴이 서문 ... xvii
서문 ... xxi
감사의 글 ... xxii
이 책에 대해 ... xxvi
저자에 대해 ... xxxi
인 액션 시리즈에 대해 ... xxxi
표지 그림에 대해 ... xxxi
1부 iBATIS 소개
   1장 iBATIS의 탄생 철학
      1.1. 복합적인 솔루션 : 최고 중의 최고들로 구성하기 ... 4
        1.1.1. iBATIS의 기원 답사 ... 5
        SQL ... 5
        옛날식의 저장 프로시저(Stored Procedure) ... 7
        현대적인 저장 프로시저 ... 7
        인라인 SQL ... 8
        동적 SQL ... 9
        객체 관계 매핑 ... 11
        1.1.2. iBATIS의 장점 이해하기 ... 12
        외부로 뺀 SQL ... 12
        캡슐화된 SQL ... 14
      1.2. iBATIS가 적합한 곳 ... 15
        1.2.1. 비즈니스 객체 모델 ... 16
        1.2.2. 프리젠테이션 계층 ... 17
        1.2.3. 비즈니스 로직 계층 ... 19
        1.2.4. 퍼시스턴스 계층 ... 20
        추상 계층 ... 21
        퍼시스턴스 프레임워크 ... 21
        드라이버 혹은 인터페이스 ... 22
        1.2.5. 관계형 데이터베이스 ... 22
        무결성 ... 22
        성능 ... 23
        보안 ... 25
      1.3. 여러종류의 데이터베이스로 작업하기 ... 25
        1.3.1. 애플리케이션 데이터베이스 ... 26
        1.3.2. 기업용 데이터베이스(Enterprise Database) ... 27
        1.3.3. 독점적 데이터베이스(Proprietary Database) ... 28
        1.3.4. 레거시 데이터베이스(Legacy Database) ... 29
      1.4. iBATIS는 데이터베이스의 공통적인 문제점들을 어떻게 다루나? ... 30
        1.4.1. 소유권과 제어권 ... 30
        1.4.2. 여러 이종 시스템들에 의한 접근 ... 31
        1.4.3. 복잡한 키와 관계들 ... 32
        1.4.4. 비정규화된 혹은 과도하게 정규화된 모델 ... 33
        1.4.5. 빈약한 데이터 모델(Skinny Data Model) ... 35
      1.5. 요약 ... 37
   2장 iBATIS란 무엇인가?
      2.1. SQL 매핑하기 ... 40
      2.2. 어떻게 작동하나 ... 41
        2.2.1. 작고 간단한 시스템을 위한 iBATIS ... 43
        2.2.2. 대규모 전사적 시스템을 위한 iBATIS ... 44
      2.3. 왜 iBATIS를 사용하나? ... 45
        2.3.1. 간단함 ... 46
        2.3.2. 생산성 ... 46
        2.3.3. 성능 ... 46
        2.3.4. 관심사의 분리 ... 47
        2.3.5. 작업의 분배 ... 47
        2.3.6. 이식성 : 자바, .NET 그리고 그 외 ... 48
        2.3.7. 오픈 소스와 정직성 ... 48
      2.4. iBATIS를 사용하지 않는 경우 ... 49
        2.4.1. 개발자가 모든 것에 대해 영원한 결정권을 갖고 있을 때 ... 49
        2.4.2. 애플리케이션이 완전히 동적인 SQL을 요구할 때 ... 50
        2.4.3. 관계형 데이터베이스를 사용하지 않을 때 ... 50
        2.4.4. 그냥 작동하지 않을 경우 ... 51
      2.5. 5분 내에 사용 가능한 iBATIS ... 51
        2.5.1. 데이터베이스 준비하기 ... 52
        2.5.2. 코드 작성하기 ... 53
        2.5.3. iBATIS 설정하기(미리보기) ... 53
        2.5.4. 애플리케이션 빌드하기 ... 55
        2.5.5. 애플리케이션 실행하기 ... 56
      2.6. 미래 : iBATIS는 어디로 가는가? ... 57
        2.6.1. Apache 소프트웨어 재단 ... 57
        2.6.2. 더 간단하게, 더 작게, 더 적은 의존성으로 ... 58
        2.6.3. 더 많은 확장과 플러그인 ... 58
        2.6.4. 추가적인 플랫폼과 언어 ... 59
      2.7. 요약 ... 59
2부 iBATIS 기초
   3장 iBATIS의 설치와 설정
      3.1. iBATIS 배포판 얻기 ... 64
        3.1.1. 바이너리 배포판 ... 64
        3.1.2. 소스로부터 빌드하기 ... 65
        저장소 파헤치기 ... 65
        빌드 수행하기 ... 66
      3.2. 배포판의 구성 ... 68
      3.3. 의존성 ... 68
        3.3.1. 적재 지연을 위한 바이트코드 확장 ... 68
        3.3.2. Jakarta DBCP(Commons Database Connection Pool) ... 70
        3.3.3. 분산 캐시(Distributed Cache) ... 70
      3.4. 애플리케이션에 iBATIS 붙이기 ... 70
        3.4.1. 단독 실행 애플리케이션에서 iBATIS 사용하기 ... 71
        3.4.2. 웹 에플리케이션에서 iBATIS 사용하기 ... 71
      3.5. iBATIS와 JDBC ... 72
        3.5.1. JDBC 리소스 해제하기 ... 73
        3.5.2. SQL 주입(injection) ... 73
        3.5.3. 복잡도 낮추기 ... 74
      3.6. 계속되는 iBATIS 설정 ... 76
        3.6.1. SQL Maps 설정 파일 ... 77
        3.6.2. 〈properties〉요소 ... 78
        3.6.3. 〈settings〉요소 ... 79
        lazyLoadingEnabled ... 79
        cacheModelsEnabled ... 80
        enhancementEnabled ... 80
        useStatementNamespace ... 81
        maxRequest (비권장) ... 81
        maxSessions (비권장) ... 81
        maxTransactions (비권장) ... 81
        3.6.4. 〈typeAlias〉요소 ... 82
        3.6.5. 〈transactionManager〉요소 ... 84
        〈property〉요소 ... 85
        〈dataSource〉요소 ... 85
        3.6.6. 〈typeHandler〉요소 ... 85
        3.6.7. 〈sqlMap〉요소 ... 86
      3.7. 요약 ... 87
   4장 매핑 구문으로 작업하기
      4.1. 기본적인 사항들 ... 89
        4.1.1. 자바빈즈 생성하기 ... 89
        어떻게 빈즈를 만드나? ... 89
        빈즈 탐색 ... 92
        4.1.2. SQL Map API ... 93
        queryForObject() 메소드 ... 93
        queryForList() 메소드 ... 93
        queryForMap() 메소드 ... 94
        4.1.3. 매핑 구문의 타입들 ... 95
      4.2. 〈select〉매핑 구문 사용하기 ... 98
        4.2.1. 대입자로 인라인 파라미터 사용하기 ... 98
        4.2.2. $ 대입자로 인라인 파라미터 사용하기 ... 100
        4.2.3. SQL 주입에 대한 간단한 예 ... 101
        4.2.4. 자동 결과 맵(Automatic result maps) ... 102
        4.2.5. 관련된 데이터 조인하기 ... 104
      4.3. 매핑 파라미터 ... 104
        4.3.1. 외부 파라미터 맵 ... 105
        4.3.2. 인라인 파라미터 매핑 다시 보기 ... 106
        4.3.3. 원시타비 파라미터 ... 108
        4.3.4. 자바빈즈와 Map 파라미터 ... 108
      4.4. 인라인 결과 맵과 명시적인 결과 맵 사용하기 ... 109
        4.4.1. 원시타입의 결과(Primitive results) ... 110
        4.4.2. 자바빈즈와 Map 타입의 결과 ... 112
      4.5. 요약 ... 112
   5장 쿼리가 아닌(non-query) 구문 실행하기
      5.1. 데이터 갱신을 위한 기초 다지기 ... 115
        5.1.1. 쿼리가 아닌(non-query) 구문을 위한 SQL Map API ... 115
        insert 메소드 ... 115
        update 메소드 ... 115
        delete 메소드 ... 116
        5.1.2. 쿼리가 아닌(non-query) 매핑 구문 ... 116
      5.2. 데이터 삽입하기 ... 117
        5.2.1. 인라인 파라미터 매핑 사용하기 ... 117
        5.2.2. 외부 파라미터 맵 사용하기 ... 118
        5.2.3. 자동 생성 key ... 120
      5.3. 데이터를 수정하고 삭제하기 ... 123
        5.3.1. 동시 수정 다루기 ... 123
        5.3.2. 자식 레코드를 수정하고 삭제하기 ... 124
      5.4. 일괄 업데이트 실행하기 ... 125
      5.5. 저장 프로시저로 작업하기 ... 128
        5.5.1. 장ㆍ단점 고려하기 ... 128
        극단적이 되지 말라! ... 128
        작업에 맞는 도구 사용하기 ... 129
        5.5.2. IN, OUT 그리고 INOUT 파라미터 ... 130
      5.6. 요약 ... 133
   6장 고급 쿼리 기법
      6.1. iBATIS에서 XML 사용하기 ... 134
        6.1.1. XML 파라미터 ... 135
        6.1.2. XML로 결과 생성하기 ... 137
      6.2. 매핑 구문을 객체와 연관시키기 ... 140
        6.2.1. 복잡한 컬렉션(collection) ... 141
        데이터베이스 I/O ... 143
        'N+1 Select' 문제 살펴보기 ... 143
        위 두 문제에 대한 해결책 ... 144
        6.2.2. 적재 지연(lazy loading) ... 145
        6.2.3. N+1 Select 문제 피해가기 ... 146
      6.3. 상속 ... 148
        6.3.1. 상속 매핑하기 ... 150
      6.4. 잡다한 다른 활용법들 ... 151
        6.4.1. statement 타입과 DDL 사용하기 ... 151
        6.4.2. 매우 큰 데이터 셋 처리하기 ... 152
        더 이상 질문을 회피하지 마세요... ... 152
        더 흥미로운 로우 핸들러의 또 다른 사용 예 ... 154
      6.5. 요약 ... 159
   7장 트랜잭션
      7.1. 트랜잭션은 무엇인가? ... 160
        7.1.1. 간단한 은행 예제 ... 161
        7.1.2. 트랜잭션의 특성 이해하기 ... 162
        원자성(Atomicity) ... 163
        일관성(Consistency) ... 164
        격리성(Isolation) ... 164
        영속성(Durability) ... 165
      7.2. 자동 트랜잭션 ... 165
      7.3. 로컬 트랜잭션 ... 166
      7.4 글로벌 트랜잭션 ... 168
        7.4.1. 능동(active) 혹은 수동(passive) 트랜잭션 사용하기 ... 169
        7.4.2. 트랜잭션을 시작하고 커밋하고 종료하기 ... 170
        7.4.3. 글로벌 트랜잭션이 필요한가? ... 171
      7.5. 사용자 정의 트랜잭션 ... 171
      7.6. 트랜잭션 구분하기 ... 173
        7.6.1. 프리젠테이션 계층에서 트랜잭션 구분 짓기 ... 175
        7.6.2. 퍼시스턴스 계층에서 트랜잭션 구분 짓기 ... 176
        7.6.3. 비즈니스 로직 계층에서 트랜잭션 구분 짓기 ... 176
      7.7. 요약 ... 177
   8장 동적인 SQL 사용하기
      8.1. 동적인 WHERE 조건절 다루기 ... 180
      8.2. 동적 요소들과 친숙해지기 ... 182
        8.2.1. 〈dynamic〉요소 ... 184
        8.2.2. 이항연산 요소 ... 185
        8.2.3. 단항연산 요소 ... 186
        8.2.4. 파라미터 요소 ... 188
        8.2.5. 〈iterate〉요소 ... 189
      8.3. 모두 적용한 간단한 예제 ... 190
        8.3.1. 데이터를 가져오고 표시하는 방법을 정의하기 ... 191
        8.3.2. 데이터베이스 구조 결정하기 ... 192
        8.3.3. 정적인 형태로 SQL 작성하기 ... 192
        8.3.4. 동적인 SQL요소를 정적인 SQL에 적용하기 ... 193
      8.4. 고급 동적 SQL 기법 ... 194
        8.4.1. 결과 데이터 정의하기 ... 194
        8.4.2. 필수 입력 항목 정의하기 ... 195
        8.4.3. 정적인 형태로 SQL 작성하기 ... 196
        8.4.4. 동적 SQL 요소를 정적 SQL에 적용하기 ... 197
      8.5. 동적 SQL에 대안이 되는 접근법 ... 199
        8.5.1. 자바코드 사용하기 ... 200
        8.5.2. 저장 프로시저 사용하기 ... 204
        8.5.3. iBATIS와 비교하기 ... 206
      8.6. 동적 SQL의 미래 ... 207
        8.6.1. 간단해진 조건 요소 ... 207
        8.6.2. 표현식(Expression Language) ... 208
      8.7. 요약 ... 208
3부 iBATIS 실전
   9장 캐시를 통한 성능 향상
      9.1. 간단한 iBATIS 캐싱 예제 ... 211
      9.2. iBATIS의 캐싱에 관한 철학 ... 213
      9.3. 캐시 모델 이해하기 ... 214
        9.3.1. type ... 215
        9.3.2. readOnly 속성 ... 215
        9.3.3. seriallze 속성 ... 216
        9.3.4. readOnly와 seriallze 조합 ... 216
      9.4. 캐시 모델 내부의 요소사용하기 ... 217
        9.4.1. 캐시 비우기(Cache flushing) ... 217
        〈flushOnExecute〉 ... 218
        〈flushInterval〉 ... 219
        9.4.2. 캐시 모델 구현체의 프로퍼티 설정하기 ... 221
      9.5 캐시 모델 타입 ... 221
        9.5.1. MEMORY ... 221
        9.5.2. LRU ... 223
        9.5.3. FIFO ... 224
        9.5.4. OSCACHE ... 225
        9.5.5. 스스로 만든 캐시 모델 ... 225
      9.6. 캐싱 전략 수립하기 ... 226
        9.6.1. 읽기전용, 장기간 유지 데이터 캐싱 ... 227
        9.6.2. 읽기/쓰기 가능한 데이터 캐싱 ... 229
        9.6.3. 낡게 되는(aging) 정적 데이터 캐싱하기 ... 231
      9.7. 요약 ... 234
   10장 iBATIS 데이터 접근 객체(DAO)
      10.1. 상세한 구현 숨기기 ... 236
        10.1.1. 왜 분리하는가? ... 237
        10.1.2. 간단한 예제 ... 238
        dao.xml 설정파일 ... 239
        DaoManager 생성하기 ... 239
      10.2. DAO 설정하기 ... 241
        10.2.1. 〈properties〉요소 ... 241
        10.2.2. 〈context〉요소 ... 241
        10.2.3. 〈transactionManager〉요소 ... 242
        EXTERNAL 트랜잭션 관리자 ... 243
        HIBERNATE 트랜잭션 관리자 ... 243
        JDBC 트랜잭션 관리자 ... 243
        SIMPLE 데이터 소스 ... 243
        DBDC 데이터 소스 ... 244
        JNDI 데이터 소스 ... 245
        JTA 트랜잭션 관리자 ... 246
        OJB 트랜잭션 관리자 ... 246
        SQLMAP 트랜잭션 관리자 ... 246
        TOPLINK 트랜잭션 관리자 ... 247
        자체적으로 생성한 트랜잭션 관리자나 다른 트랜잭션 관리자를 사용하기 ... 247
        10.2.4. DAO 요소 ... 247
      10.3. 설정 팁들 ... 249
        10.3.1. 다중 서버 ... 249
        10.3.2. 다중 데이터베이스의 방언(dialect) ... 250
        10.3.3. 실행시에 설정 변경하기 ... 251
      10.4. SQL Maps DAO 구현체 예제 ... 252
        10.4.1. iBATIS를 사용하는 DAO 설정 ... 253
        10.4.2. DaoManager 인스턴스 생성하기 ... 254
        10.4.3. 트랜잭션 관리자 설정하기 ... 255
        10.4.4. 맵 읽어들이기 ... 256
        10.4.5. DAO 구현체 코딩하기 ... 259
      10.5. 요약 ... 261
   11장 DAO 더 살펴보기
      11.1. SQL Maps가 아닌 DAO 구현체 ... 264
        11.1.1. 하이버네이트 DAO 구현체 ... 264
        DAO 컨텍스트 정의하기 ... 264
        Account 테이블 매핑하기 ... 265
        실제 DAO 구현체 ... 266
        11.1.2. JDBC DAO 구현체 ... 270
        JDBC DAO 구현체 살펴보기 ... 271
      11.2. 다른 데이터 소스로 DAO 패턴 사용하기 ... 275
        11.2.1. 예제 : LDAP으로 DAO 사용하기 ... 276
        LDAP 용어 이해하기 ... 276
        자바에서 LDAP으로 매핑하기 ... 277
        11.2.2. 예제 : 웹 서비스로 DAO 사용하기 ... 281
      11.3. Spring DAO 사용하기 ... 283
        11.3.1. 코드 작성하기 ... 284
        11.3.2. 왜 iBATIS 대신에 Spring을 사용하는가? ... 285
      11.4. 개발자 스스로 DAO 계층을 생성하기 ... 286
        11.4.1. 구현체에서 인터페이스를 분리하기 ... 286
        11.4.2. 결합도 낮추기(decoupling)와 팩토리(factory) 생성하기 ... 287
      11.5. 요약 ... 290
   12장 iBATIS 확장하기
      12.1. 플러그인 가능한 컴포넌트 설계 이해하기 ... 292
      12.2. 사용자 정의 타입 핸들러로 작업하기 ... 293
        12.2.1. 사용자 정의타입 핸들러 구현하기 ... 294
        12.2.2. TypeHandlerCallback 생성하기 ... 295
        파라미터를 설정하기 ... 296
        결과 가져오기 ... 297
null 다루기 - valueOf() 메소드는 왜 존재할까? ... 298
        12.2.3. TypeHandlerCallback을 등록해서 사용하기 ... 300
      12.3. CacheController 다루기 ... 301
        12.3.1. CacheController 생성하기 ... 302
        12.3.2. CacheController의 저장, 가져오기, 삭제하기 ... 303
        12.3.3. CacheController를 등록해서 사용하기 ... 304
      12.4. 지원되지 않는 DataSource 설정하기 ... 304
      12.5. 사용자 정의 트랜잭션 관리 ... 305
        12.5.1. TransactionConfig 인터페이스 이해하기 ... 306
        12.5.2. Transaction 인터페이스 이해하기 ... 308
      12.6. 요약 ... 309
4부 iBATIS 활용하기
   13장 iBATIS 최적 활용 기법
      13.1. iBATIS에서 단위 테스트하기 ... 314
        13.1.1. 매핑 계층 단위 테스트 ... 314
        테스트용 데이터베이스 인스턴스 ... 314
        데이터베이스 스크립트 ... 316
        iBATIS 설정파일(SqlMapConfig.xml) ... 316
        iBATIS SqlMapClient 단위 테스트 ... 316
        13.1.2. 데이터 접근 객체(DAO) 단위 테스트하기 ... 317
        모의 객체로 DAO 단위 테스트하기 ... 318
        13.1.3. DAO 소비자 계층 단위 테스트 하기 ... 320
      13.2. iBATIS 설정 파일 관리하기 ... 322
        13.2.1. 클래스패스 안에 두기 ... 322
        13.2.2. 파일들을 함께 두자 ... 324
        13.2.3. 리턴타입 별로 정리하라 ... 325
      13.3. 명명 규칙 ... 325
        13.3.1. 매핑 구문의 이름 짓기 ... 325
        13.3.2. 파라미터 맵의 이름 짓기 ... 326
        13.3.3. 결과 맵 이름 짓기 ... 326
        13.3.4. XML 파일들 ... 326
        주 설정 파일 ... 326
        SQL 매핑 파일 ... 327
      13.4. 빈즈, Map 혹은 XML? ... 328
        13.4.1. 자바빈즈 ... 328
        13.4.2. Map ... 328
        13.4.3. XML ... 328
        13.4.4. 원시 타입(primitives) ... 329
      13.5. 요약 ... 329
   14장 모두 종합해서 보기
      14.1. 설계 컨셉 ... 332
        14.1.1. 계정 ... 332
        14.1.2. 카탈로그 ... 332
        14.1.3. 장바구니 ... 332
        14.1.4. 주문 ... 333
      14.2. 기술 선택 ... 333
        14.2.1. 프리젠테이션 ... 333
        14.2.2. 서비스 ... 334
        14.2.3. 퍼시스턴스 ... 334
      14.3. 스트럿츠 최적화하기 : BeanAction ... 334
        14.3.1. BaseBean ... 335
        14.3.2. BeanAction ... 335
        14.3.3. ActionContext ... 336
      14.4. 기초 닦기 ... 337
        14.4.1. src ... 337
        14.4.2. test ... 338
        14.4.3. web ... 338
        14.4.4. build ... 339
        14.4.5. devlib ... 339
        14.4.6. lib ... 339
      14.5. web.xml 설정하기 ... 340
      14.6. 프리젠테이션 설정하기 ... 342
        14.6.1. 첫 번재 단계 ... 342
        14.6.2. 프리젠테이션 빈즈 이용하기 ... 345
      14.7. 서비스 작성하기 ... 350
        14.7.1. dao.xml 설정하기 ... 351
        14.7.2. 트랜잭션 구분하기 ... 352
      14.8. DAO 작성하기 ... 354
        14.8.1. SQL Maps 설정 ... 354
        14.8.2. SQL Map ... 355
        14.8.3. 인터페이스와 구현체 ... 357
      14.9. 요약 ... 358
부록 A iBATIS.NET 빠른 시작
   A.1. iBATIS 와 iBATIS.NET 비교 ... 359
      자바 개발자자 왜 iBATIS.NET에 관심을 가져야 하는가? ... 360
      .NET 개발자는 왜 iBATIS.NET에 관심을 가져야 하는가? ... 360
      주요 차이점은 무엇인가? ... 361
      무엇이 유사한가? ... 361
   A.2. iBATIS.NET으로 작업하기 ... 361
      DLL 과 의존성 ... 361
      XML 설정파일 ... 362
      설정 API ... 364
      SQL 매핑 파일 ... 364
   A.3. 어디에서 더 많은 정보를 얻을 수 있나? ... 367
부록 B iBATIS 팁 모음
   B.1. 매핑 구문에 XML 특수분자들(〈,〉,& 등)이 많을 때의 처리 ... 369
   B.2. iBATIS가 실행되는 쿼리를 Log4J 로거로 출력하기 ... 369
   B.3. DBCP 연결하기 ... 370
   B.4. 작지만 자주 범하는 실수 ... 371
닫기