• 하이버네이트 완벽 가이드
  • 자바 개발자를 위한 자바 퍼시스턴스 프로그래밍

  • 크리스찬 바우어, 개빈 킹 지음
  • 박찬욱, 백기선, 이대엽 옮김

  • 오픈소스 & 웹 시리즈 _ 021
  • ISBN: 9788992939508
  • 45,000원 | 2010년 06월 15일 발행 | 960쪽



자바 언어가 제공하는 객체지향 패러다임과 관계형 데이터베이스로 대표되는 관계형 패러다임의 불일치를 해소하는 방법 가운데 현재 가장 실용적인 대안은 객체/관계형 매핑(ORM) 도구를 이용하는 것이다. 그러한 ORM 도구 가운데 가장 뛰어난 오픈소스 솔루션은 단연 하이버네이트다.

하이버네이트는 ORM 솔루션이 제공해야 할 필수적인 기능은 물론 다양한 상황에서 활용할 수 있는 고급 기능까지 제공해준다. 하이버네이트를 이용하면 데이터를 객체지향적인 방식으로 다룰 수 있고, 데이터베이스 스키마가 수정되거나 테이블 간의 관계가 바뀌었을 때 이 같은 변화에 적극적으로 대응할 수 있다. 아울러 하이버네이트는 다양한 데이터베이스와도 최적화된 방식으로 동작하게끔 설계돼 있어 개발자가 영속화 관련 코드보다 비즈니스 로직 구현에 집중할 수 있게 해준다.

하이버네이트 프로젝트가 시작된 이후 하이버네이트는 자바 개발자들에게 명실상부 가장 뛰어난 오픈소스 ORM 도구로 인식돼 왔으며, 표준으로 채택된 자바 퍼시스턴스 역시 이 같은 하이버네이트의 영향을 많이 받았다.

『하이버네이트 완벽 가이드』는 이러한 하이버네이트 프로젝트를 만든 장본인이 쓴 책이다. 때문에 하이버네이트는 물론이고 영속화, 객체/관계형 매핑, 자바 퍼시스턴스와 관련된 모든 주제를 빠짐없이 상세하게 다루고 있다. 특히 다양한 환경에서 가장 알맞은 영속화 전략을 택해야 할 때 이 책이 실용적인 해법을 제시할 것이다.

 

추천글

어떤 책도 이 책에 버금가지 못한다.

하이버네이트/JPA와 ORM을 진정 이해하고 싶다면 이 책이 바로 여러분을 위한 책입니다. 이 책은 하이버네이트/JPA의 동작 원리에 대한 완벽한 참고서이면서 자바 퍼시스턴스의 현재 상태와 앞으로 남은 과제를 상세히 설명해 줍니다. ORM을 이용한 자바 개발을 진지하게 고민 중이라면 이 책을 늘 곁에 두길 바랍니다.

-- 그레고리 E. 캐니브스키

모든 웹 프로그래머가 반드시 읽어야 할 책

이 책은 하이버네이트에 대한 환상적인 지침서이면서 ORM과 도메인 주도 모델이라는 매우 중요한 두 가지 개념을 다룬 책이기도 합니다. 이 책을 꼭 읽어보시기 바랍니다. 하이버네이트에 직접적으로 관심이 없더라도 이 책을 읽고 나면 객체 설계와 영속화에 관한 지식이 한층 넓어질 것입니다.

-- 마헤쉬 라바니스

정말 훌륭한 책

『하이버네이트 완벽 가이드』는 매닝의 베스트셀러인 『하이버네이트 인 액션』의 개정판입니다. 이 책은 EJB 3.0과 자바 퍼시스턴스 1.0 표준을 비롯해서 하이버네이트 3.2를 상세히 다룹니다. 또한 이 책은 영속화 도구로 하이버네이트를 사용하고 있거나 하이버네이트를 시작하고자 하는 개발자를 위한 책입니다.

하이버네이트 3.2나 JPA를 배우고 싶거나 두 기술 가운데 하나를 골라야 한다면 이 책을 적극 추천합니다. 이 책엔 궁극의 해법이 담겨 있습니다. 하이버네이트를 사용할 예정이라면 다른 선택의 여지는 없습니다. 바로 서점으로 가서 이 책을 구입하세요.

-- 미라 수바라오

프로그램보다 데이터를 더 오랫동안 지속시켜 주는 능력을 말하는 영속화는 오늘날 애플리케이션 개발에 있어 가장 중요하게 다뤄야 할 문제다. 가장 인기 있는 자바 영속화 도구인 하이버네이트는 자동적이고 투명한 객체/관계형 매핑을 제공하여 자바 애플리케이션에서 SQL 데이터베이스를 이용하는 일을 굉장히 쉽게 만들어 준다. 또한 하이버네이트는 새로운 EJB 3.0 및 자바 퍼시스턴스 1.0 표준을 준수한다.

『하이버네이트 완벽 가이드』는 수백 개의 개별 예제를 긴밀하게 연계한 애플리케이션을 개발해 보면서 하이버네이트를 샅샅이 파헤친다. 여러분은 쿼리, 페치 전략, 캐시, 트랜잭션, 컨버세이션 등을 하나씩 살펴보면서 하이버네이트 3.2와 자바 퍼시스턴스가 선사하는 풍부한 프로그래밍 모델에 관해 속속들이 알게 될 것이며, 이 책이 데이터베이스 설계, 객체/관계형 매핑, 최적화 기법의 우수 사례에 대해서도 잘 설명하고 있음을 알게 될 것이다.

매닝 출판사의 베스트셀러인 『하이버네이트 인 액션』의 개정판인 이 책에서는 하이버네이트 프로젝트를 만든 크리스찬 바우어와 개빈 킹이 직접 EJB 3.0과 자바 퍼시스턴스 1.0 표준과 함께 하이버네이트 3.2에 관해 깊이 있게 다룬다.

이 책의 내용

  • O/R 매핑 개념
  • 하이버네이트와 자바 퍼시스턴스 사용
  • 효율적인 데이터베이스 애플리케이션 설계
  • 풍부한 하이버네이트와 자바 퍼시스턴스 참고 자료
  • 타의 추종을 불허하는 내용의 폭과 깊이

마지막으로 이 책은 제이보스 심(JBoss Seam), 즉 EJB 3.0, JavaServer Faces, 하이버네이트를 토대로 만든 혁신적인 자바 EE용 웹 애플리케이션 프레임워크를 자세히 다루면서 마무리한다.

크리스찬 바우어 (Christian Bauer)

크리스찬 바우어는 하이버네이트 개발 팀의 일원이며, 제이보스의 하이버네이트, EJB 3.0, 제이보스 심에 대한 교육, 컨설팅, 제품 관리를 담당하고 있다.

 

개빈 킹 (Gavin King)

개빈 킹은 제이보스에서 선도 개발자로 근무하며, 하이버네이트 프로젝트를 만들었으며, EJB 3.0(JSR 220) 전문가 그룹의 일원이기도 하다. 또한 하이버네이트 개념과 JSF, EJB 3.0과 관련한 표준 제정을 위해 웹 빈 JSR 299를 이끌고 있다.

박찬욱

오픈소스 프레임워크에 관심이 많아 대학부터 현재까지 오픈소스 기반 프레임워크를 개발하고 보급하는 일을 해오고 있다. 현재는 한화 S&C에서 전사 표준 프레임워크를 개발•운영하고, 조직에 전파하는 일을 하며, 블로그(http://chanwook.tistory.com)나 강의, 세미나 등을 통해 같은 고민을 하고 있는 사람들과 모여 기술에 대한 토론을 즐긴다. 항상 본인의 신념과 행동을 일치시키기 원하며, 도전과 균형이라는 두 가지의 어려운 삶의 주제로 항상 고민하고 있다.

 

백기선

스프링과 하이버네이트를 사용한 웹 애플리케이션을 개발하고 있다. 학습한 내용을 블로그, 스터디, 세미나 등을 통해 공유하고 있으며, Whiteship's Note 블로그(http://whiteship.me)와 봄싹 스터디(http://springsprout.org)에서 열심히 활동하고 있다. 『프로 스프링 2.5』를 공역했다.

 

이대엽

늦게 배운 도둑질에 밤 새는 줄 모른다고 재미로 시작한 프로그래밍이 어느새 삶의 일부가 되어버린 평범한 프로그래머. 다양한 분야에 관심을 가지고 균형적인 시각을 가지려고 노력하며, 근래에는 IT 서적 번역에 집중해 정확하고 올바르게 표현하는 일에 매진하고 있다. 『개념을 잡아주는 프로그래밍 정석』, 『소트웍스 앤솔러지』를 각각 번역, 공역했다.

 

옮긴이글

박찬욱

종종 하이버네이트를 사용했던 분이나, 현재 사용하고 있는 분을 만나 이야기해보면 하이버네이트에 대해 긍정적인 반응을 보기가 의외로 쉽지 않습니다. 이유는 다양하겠지만 곰곰이 생각해보면 그 원인은 '패러다임 변화에 대한 이해 부재'가 아닐까라는 생각이 들었습니다. 이 책에서 소개하는 하이버네이트와 JPA를 단순히 'SQL을 작성하지 않게 해주는 기술', 'DB에 대한 종속성을 제거해주는 툴' 정도로 이해하고 받아들였기 때문입니다.

이러한 특징은 하이버네이트와 같은 ORM이 주는 '부산물'일 뿐이지 ORM이 달성하려는 '목적'과는 부합하지 않습니다. ORM을 올바르게 적용하고 이용하려면 이 '패러다임의 변화'에 대해 먼저 이해해야 합니다. 그래야만 ORM이 주는 효과를 온전히 누릴 수 있습니다.

하이버네이트를 사용하는 데 학습 비용이 많이 든다는 의견도 많습니다. 그렇습니다. 배우기 쉽지 않습니다. 그러나 단순히 API 측면의 학습이 아닌, 이러한 변화에 따른 구현 전략에 학습의 초점을 맞춰야 합니다. 학습의 출발점을 정확히 잡으면 비용에 대한 산정 기준도 변하기 마련입니다. 이 책이 '패러다임의 변화'와 그 전략에 대해 배울 수 있는 가장 현실적인 해답이라 확신합니다.

책을 읽다 보면 곳곳에서 이런 변화를 설명하는 부분을 쉽게 찾을 수 있을 겁니다. 이제는 단순히 SQL 작성 자체에 집중하기보다는 패러다임의 변화에 따른 애플리케이션과의 상호작용에 입각한 구현 전략에 집중하는 더욱 유연한 사고 방식이 필요한 때입니다.

물론 하이버네이트가 만능은 아닙니다. 그렇지만 하이버네이트를 유용하게 활용할 수 있는 분야는 얼마든지 있습니다. Java EE의 표준으로 자리잡은 JPA와 더불어 하이버네이트는 자바 엔터프라이즈 시스템 개발에 있어 그 역할이 더욱 더 증대될 것입니다.

국내에서도 이 책을 시작으로 기술 선택과 적용을 고민하고 있는 많은 분들이 더 윤택한 삶을 누릴 수 있는 기회가 되면 좋겠습니다.

 

백기선

처음 하이버네이트를 학습할 때 생소한 개념과 용어로 인해 매우 당혹스러울 수 있습니다. 제가 처음에 그랬습니다. 현재 다니고 있는 회사에 처음 입사했을 때부터 현재까지 모든 프로젝트에서 하이버네이트를 사용했습니다. 다행히도 하이버네이트를 학습하기 위해 처음 손에 잡은 책이 바로 이 번역서의 원서인 『Java Persistence With Hibernate』였습니다. ORM에 대한 기본적인 설명과 필수 개념부터 하이버네이트와 JPA의 모든 기능과 옵션을 자세히 설명해주었기 때문에 많은 궁금증을 해결할 수 있었습니다. 그 당시를 떠올리며 이 책을 학습하시는 분들께 몇 가지 조언을 드리고자 합니다.

학습 목표를 구체적으로 세우기 바랍니다. 아무런 목표 없이 이 책을 처음부터 끝까지 정독할 수 있을 만큼 시간적 여유와 집중력이 있다면 말리진 않겠습니다. 하지만 그런 경우가 아니라면 이 책을 학습하기 전에 먼저 분명한 목표 세우기를 권장합니다.

하이버네이트를 처음 접하는 분들께는 "하이버네이트를 사용해서 도메인 클래스가 하나인 간단한 CRUD 애플리케이션을 만들겠다."라는 목표를 권하고 싶습니다. 그 다음에는 "일대다 관계에 있는 도메인 클래스 두 개를 매핑하고 두 도메인 클래스에 대한 CRUD 애플리케이션을 만들겠다." 또는 "다형성을 지원하는 계층 구조의 도메인 클래스를 만든 뒤 그것에 대한 CRUD 애플리케이션을 만들겠다." 등으로 점차 학습 범위를 넓혀갈 수 있겠습니다. 그러면서 자연스럽게 하이버네이트 매핑과 기본적인 사용법 및 하이버네이트의 주요 개념을 파악할 수 있을 겁니다.

그렇게 하이버네이트를 사용하는 데 어느 정도 자신감이 생기면 하이버네이트가 지원하는 HQL와 Criteria를 사용하는 데 익숙해지기를 권하고 싶습니다. SQL과는 다른 문법과 접근법으로 DB와 소통할 수 있는 방법입니다. 특히 Criteria는 객체지향 API를 사용하여 SQL과 똑같은 작업을 할 수 있습니다. 동적인 쿼리를 만들 때 그 유용함이 빛을 발하기 때문에 꼭 학습하기를 권장합니다.

하이버네이트를 마스터하고 싶다는 생각을 가지고 계신 분이라면 다시 하이버네이트 기본으로 돌아가, 하이버네이트가 제공하는 플러시, 페치, 캐시 기능의 다양한 옵션과 동작 원리를 깊이 있게 공부하길 바랍니다. 이러한 것들을 마스터해야 하이버네이트를 사용한 대화형 요청 처리를 구현하거나 성능 최적화를 할 수 있을 것입니다.

장황하게 설명했지만 사실 이 책의 구성과 크게 다르지 않습니다. 저 같은 경우에는 가장 먼저 9장에서 기본적인 개념을 살펴본 뒤 3장으로 돌아가 7장까지 매핑 방법을 학습하고 10장부터 12장까지 고급 기능을 학습했습니다. HQL이나 Criteria 사용법이 궁금할 때는 수시로 14, 15장에서 목차와 소스 코드를 살펴봤습니다. 또한 ORM과 관련된 이론적인 배경 지식이 필요할 때는 1장을 정독했습니다. 당연한 이야기지만 학습 방법은 다 각자 다를 테니 반드시 제가 학습한 방법을 따라할 필요는 없습니다.

 

이대엽

오랜 기간 동안 번역해온 『하이버네이트 완벽 가이드』가 드디어 세상의 빛을 보게 됐습니다. 우선 함께 번역하느라 고생하신 박찬욱, 백기선 님께 감사드립니다. 용어 선정 과정도 쉽지 않았고 문장 하나하나를 옮길 때마다 저자의 의도가 충분히 반영됐는지 고민하느라 힘든 시간을 보냈습니다만 이 책을 읽고 하이버네이트를 올바르게 현장에 적용하는 개발자가 늘어나는 것만으로도 충분히 보람을 느낄 수 있으리라 생각합니다.

저는 이 책을 번역하면서 많은 내용을 소화하고 공부해야 했습니다. ORM이라는 생소한 개념과 동작원리, 그리고 하이버네이트의 API 구성 등으로 처음 접했을 때 가파른 학습곡선을 거쳐야 했습니다. 단순히 SQL 쿼리를 던져 처리할 수 있는 일을 하는데도 별도의 매핑이나 설정 과정을 거쳐야 하기에 처음 접하는 분이라면 되려 거부감을 느끼실지도 모르겠습니다.

하지만 더 넓은 관점에서 보면 이런 학습 비용은 충분히 감내할 만한 가치가 있습니다. 오늘날 거의 모든 기업에서 쓰는 관계형 데이터베이스와 엔터프라이즈 시장에서 위세를 떨치고 있는 자바 사이의 간극을 메워줄 수 있는 실용적인 대안은 현재 ORM이 유일합니다. 그리고 그러한 ORM 도구 가운데 오픈소스이면서 ORM이 반드시 제공해야 할 기능을 충실히 지원하고 있는 하이버네이트는 엔터프라이즈 시장에서 끊임없이 더 나은 개발 방법을 추구하는 자바 개발자라면 반드시 알고 있어야 한다고 생각합니다.

그런 점에서 이 책의 원서인 『Java Persistence With Hibernate』는 하이버네이트 프로젝트를 만든 장본인이 직접 쓴 책이기에 다른 어느 책에서도 볼 수 없는 내용을 담고 있습니다. 책 분량이 만만치 않은 만큼 ORM을 비롯해서 하이버네이트, 자바 퍼시스턴스 표준에 대해 완벽하게 설명하고 있습니다. 아울러 처음 ORM에 입문한 개발자라도 이 분야와 관련된 핵심 주제에 대해 폭넓고 깊이 있게 이해할 수 있을 겁니다.

처음 이 책을 번역해야 할지 많이 고민했습니다. 단순히 책을 읽는 거라면 쉽게 읽고 이해하고 넘어갈 수 있겠지만 원문을 우리말로, 그것도 가장 적확한 표현으로 옮긴다는 것은 결코 쉬운 일이 아니기 때문입니다. 하지만 국내에 하이버네이트를 제대로 다룬 책이 없다는 점과 국내에 하이버네이트를 소개하는 데 일조할 수 있으리라는 생각에서 결국 번역을 시작하게 되었습니다.

끝으로 현장에서 ORM 기술을 어떻게 적용할지 고민하고 언제나 더 나은 개발 환경을 만드느라 고군분투하시는 개발자분들께 미약하나마 이 책이 도움됐으면 좋겠습니다.

  • 1부 하이버네이트와 EJB 3.0 시작하기
    • 1장 객체/관계형 영속화 이해하기
      • 1.1 영속화란 무엇인가?
        • 1.1.1 관계형 데이터베이스
        • 1.1.2 SQL 이해하기
        • 1.1.3 자바에서 SQL 사용하기
        • 1.1.4 객체지향 애플리케이션에서의 영속화
      • 1.2 패러다임 불일치
        • 1.2.1 세밀함의 불일치 문제
        • 1.2.2 하위 타입 문제
        • 1.2.3 동일성 문제
        • 1.2.4 연관 관계와 관련된 문제
        • 1.2.5 데이터 탐색 문제
        • 1.2.6 패러다임 불일치에 따르는 비용
      • 1.3 영속화 계층과 대안
        • 1.3.1 계층형 아키텍처
        • 1.3.2 SQL과 JDBC를 이용해서 직접 작성한 영속화 계층
        • 1.3.3 객체 직렬화 사용하기
        • 1.3.4 객체지향 데이터베이스 시스템
        • 1.3.5 그 밖의 대안
      • 1.4 객체/관계형 매핑
        • 1.4.1 ORM이란 무엇인가?
        • 1.4.2 일반적인 ORM 문제
        • 1.4.3 왜 ORM인가
        • 1.4.4 하이버네이트, EJB3, JPA 소개
      • 1.5. 정리
    •  
    • 2장 프로젝트 시작하기
      • 2.1. 하이버네이트 프로젝트 시작하기
        • 2.1.2 프로젝트 구성하기
        • 2.1.3 하이버네이트 설정과 시작
        • 2.1.4 애플리케이션 실행과 확인
      • 2.2 자바 퍼시스턴스 프로젝트 시작하기
        • 2.2.1 하이버네이트 애노테이션 사용하기
        • 2.2.2 하이버네이트 EntityManager 사용하기
        • 2.2.3 EJB 컴포넌트 도입하기
        • 2.2.4 하이버네이트 인터페이스로 교체하기
      • 2.3 레거시 데이터베이스 역공학하기
        • 2.3.1 데이터베이스 설정 만들기
        • 2.3.2 역공학 과정 재정의하기
        • 2.3.3 자바 소스 코드 생성하기
      • 2.4 자바 EE 서비스와의 통합
        • 2.4.1 JTA와의 통합
        • 2.4.2 JNDI와 연동된 SessionFactory
        • 2.4.3 JMX 서비스 배포
      • 2.5 정리
      •  
    • 3장 도메인 모델과 메타데이터
      • 3.1 CaveatEmptor 애플리케이션
        • 3.1.1 비즈니스 도메인 분석하기
        • 3.1.2 CaveatEmptor 도메인 모델
      • 3.2 도메인 모델 구현하기
        • 3.2.1 관심사 누수 다루기
        • 3.2.2 투명하고 자동화된 영속화
        • 3.2.3 POJO와 영속 엔티티 클래스 작성하기
        • 3.2.4 POJO 연관 관계 구현하기
        • 3.2.5 접근 메서드에 로직 추가하기
      • 3.3 객체/관계형 매핑 메타데이터
        • 3.3.1 XML 메타데이터
        • 3.3.2 애노테이션 기반 메타데이터
        • 3.3.3 XDoclet 사용하기
        • 3.3.4 전역 메타데이터 다루기
        • 3.3.5 실행 시점에 메타데이터 조작하기
      • 3.4 그 밖의 엔티티 표현 방법
        • 3.4.1 동적인 애플리케이션 만들기
        • 3.4.2 XML로 데이터 표현하기
      • 3.5 정리
      •  
  • 2부 매핑 개념과 전략
    • 4장 영속 클래스 매핑하기
      • 4.1 엔티티와 값 타입 이해하기
        • 4.1.1 구성 단위가 세밀한 도메인 모델
        • 4.1.2 개념 정의
        • 4.1.3 엔티티와 값 타입 식별하기
      • 4.2 식별자가 있는 엔티티 매핑하기
        • 4.2.1 자바의 동일성과 동등성 이해하기
        • 4.2.2 데이터베이스 동일성 다루기
        • 4.2.3 데이터베이스 주키
      • 4.3 클래스 매핑 옵션
        • 4.3.1 동적 SQL 생성
        • 4.3.2 엔티티가 불변성을 띠게 만들기
        • 4.3.3 쿼리에 사용할 엔티티의 이름 부여하기
        • 4.3.4 패키지 이름 선언하기
        • 4.3.5 SQL 식별자의 인용부호 처리하기
        • 4.3.6 작명 규약 구현하기
      • 4.4 구성 단위가 세밀한 모델과 매핑
        • 4.4.1 기본 프로퍼티 매핑하기
        • 4.4.2 컴포넌트 매핑하기
      • 4.5 정리
      •  
    • 5장 상속과 사용자 정의 타입
      • 5.1 클래스 상속 매핑하기
        • 5.1.1 암시적 다형성을 이용한 구상 클래스마다 하나의 테이블
        • 5.1.2 유니온을 이용한 구상 클래스마다 하나의 테이블
        • 5.1.3 클래스 계층 구조마다 하나의 테이블
        • 5.1.4 하위 클래스마다 하나의 테이블
        • 5.1.5 상속 전략 섞어 쓰기
        • 5.1.6 매핑 전략 선택
      • 5.2 하이버네이트 타입 시스템
        • 5.2.1 엔티티와 값 객체 요약정리
        • 5.2.2 내장 매핑 타입
        • 5.2.3 매핑 타입 사용하기
      • 5.3 사용자 정의 매핑 타입 만들기
        • 5.3.1 사용자 정의 매핑 타입 고려하기
        • 5.3.2 확장점
        • 5.3.3 사용자 정의 매핑 타입이 필요한 경우
        • 5.3.4 UserType 만들기
        • 5.3.5 CompositeUserType 만들기
        • 5.3.6 사용자 정의 타입 매개변수화하기
        • 5.3.7 열거형 매핑하기
      • 5.4 정리
      •  
    • 6장 컬렉션과 엔티티 연관 관계 매핑하기
      • 6.1 값 타입의 컬렉션
        • 6.1.1 컬렉션 인터페이스 선택하기
        • 6.1.2 Set 매핑하기
        • 6.1.3 식별자 Bag 매핑하기
        • 6.1.4 List 매핑하기
        • 6.1.5 Map 매핑하기
        • 6.1.6 정렬 컬렉션과 순차 컬렉션
      • 6.2 컴포넌트의 컬렉션
        • 6.2.1 컴포넌트 클래스 작성하기
        • 6.2.2 컬렉션 매핑하기
        • 6.2.3 양방향 탐색 활성화하기
        • 6.2.4 not-null 열 만들지 않기
      • 6.3 애노테이션을 이용해서 컬렉션 매핑하기
        • 6.3.1 기본적인 컬렉션 매핑
        • 6.3.2 정렬 컬렉션과 순차 컬렉션
        • 6.3.3 내장 객체의 컬렉션 매핑하기
      • 6.4 부모/자식 관계 매핑하기
        • 6.4.1 다중성
        • 6.4.2 가능한 가장 단순한 연관 관계
        • 6.4.3 연관 관계를 양방향으로 만들기
        • 6.4.4 연쇄적으로 객체 상태 적용하기
      • 6.5 정리
      •  
    • 7장 고급 엔티티 연관 관계 매핑
      • 7.1 단일값 엔티티 연관 관계
        • 7.1.1 공유 주키 연관 관계
        • 7.1.2 일대일 외래키 연관 관계
        • 7.1.3 조인 테이블을 이용한 매핑
      • 7.2 다중 값 엔티티 연관 관계
        • 7.2.1 일대다 연관 관계
        • 7.2.2 다대다 연관 관계
        • 7.2.3 조인 테이블에 열 추가하기
        • 7.2.4 Map 매핑하기
      • 7.3 다형적인 연관 관계
        • 7.3.1 다형적 다대일 연관 관계
        • 7.3.2 다형적 컬렉션
        • 7.3.3 유니온에 대한 다형적 연관 관계
        • 7.3.4 다형적인 구상 클래스마다 하나의 테이블
      • 7.4 정리
      •  
    • 8장 레거시 데이터베이스와 사용자 정의 SQL
      • 8.1 레거시 데이터베이스 통합하기
        • 8.1.1 주키 다루기
        • 8.1.2 수식을 이용한 임의 조인 조건
        • 8.1.3 임의 테이블 조인하기
        • 8.1.4 트리거 이용하기
      • 8.2 SQL 직접 재정의하기
        • 8.2.1 사용자 정의 CRUD 문 작성하기
        • 8.2.2 저장 프로시저와 저장 함수 통합하기
      • 8.3 스키마 DDL 개선하기
        • 8.3.1 사용자 정의 SQL 이름과 데이터 타입
        • 8.3.2 데이터의 일관성 보장하기
        • 8.3.3 도메인 및 열 제약 조건 추가하기
        • 8.3.4 테이블 수준의 제약 조건
        • 8.3.5 데이터베이스 제약 조건
        • 8.3.6 인덱스 생성하기
        • 8.3.7 보조 DDL 추가하기
      • 8.4 정리
      •  
  • 3부 대화형 객체 처리
    • 9장 객체를 활용한 개발
      • 9.1 영속성 생명주기
        • 9.1.1 객체 상태
        • 9.1.2 영속성 컨텍스트
      • 9.2 객체 동일성과 동등성
        • 9.2.1 컨버세이션 소개
        • 9.2.2 객체 동일성 범위
        • 9.2.3 준영속 객체의 동일성
        • 9.2.4 영속성 컨텍스트 확장하기
      • 9.3 하이버네이트 인터페이스 9.3.1 객체 저장하고 불러오기
        • 9.3.2 준영속 객체 이용하기
        • 9.3.3 영속성 컨텍스트 관리하기
      • 9.4 자바 퍼시스턴스 API
        • 9.4.1 객체 저장하고 불러오기
        • 9.4.2 준영속 엔티티 인스턴스 이용하기
      • 9.5 EJB 컴포넌트에서 자바 퍼시스턴스 사용하기
        • 9.5.1 EntityManager 주입하기
        • 9.5.2 EntityManager 검색하기
        • 9.5.3 EntityManagerFactory에 접근하기
      • 9.6 정리
      •  
    • 10장 트랜잭션과 동시성
      • 10.1 트랜잭션 필수 지식
        • 10.1.1 데이터베이스와 시스템 트랜잭션
        • 10.1.2 하이버네이트 애플리케이션에서의 트랜잭션
        • 10.1.3 자바 퍼시스턴스에서의 트랜잭션
      • 10.2. 동시 접근 제어하기
        • 10.2.1 데이터베이스 수준의 동시성 이해하기
        • 10.2.2 낙관적 동시성 제어
        • 10.2.3. 그 외 격리성 획득 보장하기
      • 10.3 트랜잭션 미적용 데이터 접근
        • 10.3.1 자동 커밋 신화 밝혀내기
        • 10.3.2 하이버네이트에서 트랜잭션 적용하지 않고 개발하기
        • 10.3.3 그 밖의 JTA를 사용하는 트랜잭션
      • 10.4 정리
      •  
    • 11장 컨버세이션 구현하기
      • 11.1 하이버네이트 세션 전파하기
        • 11.1.1 세션 전파의 쓰임새
        • 11.1.2 스레드 로컬로 전파하기
        • 11.1.3 JTA를 이용한 전파
        • 11.1.4 EJB를 사용한 전파
      • 11.2 하이버네이트를 이용한 컨버세이션
        • 11.2.1 컨버세이션 처리 보장하기
        • 11.2.2 준영속 객체를 이용하는 컨버세이션
        • 11.2.3 컨버세이션까지 Session 확장하기
      • 11.3 JPA를 이용하는 컨버세이션
        • 11.3.1 자바 SE에서 영속성 컨텍스트 전파하기
        • 11.3.2 컨버세이션에서 준영속 객체 병합하기
        • 11.3.3 자바 SE에서 영속성 컨텍스트 확장하기
      • 11.4 EJB 3.0을 이용하는 컨버세이션
        • 11.4.1 EJB를 사용한 컨텍스트 전파
        • 11.4.2 EJB를 사용한 영속성 컨텍스트 확장
      • 11.5 정리
      •  
    • 12장 효율적인 객체 수정
      • 12.1 영속성 전이
        • 12.1.1 접근성을 통한 영속화
        • 12.1.2 연관 관계에 연쇄 작용 적용하기
        • 12.1.3. 상태 전이 이용하기
      • 12.2 벌크와 배치 연산
        • 12.2.1 HQL과 JPA QL을 이용하는 벌크 문
        • 12.2.2 배치를 이용해 처리하기
        • 12.2.3 무상태 Session 사용하기
      • 12.3 데이터 필터링과 가로채기
        • 12.3.1 동적 데이터 필터
        • 12.3.2 하이버네이트 이벤트 가로채기
        • 12.3.3 핵심 이벤트 시스템
        • 12.3.4 엔티티 리스너와 콜백
      • 12.4 정리
      •  
    • 13장 페치와 캐시 최적화
      • 13.1 전역 페치 계획 정의하기
        • 13.1.1 객체 조회 방법
        • 13.1.2 기본적인 지연 페치 계획
        • 13.1.3 프록시 이해하기
        • 13.1.4 프록시 생성 비활성화하기
        • 13.1.5 연관과 컬렉션의 즉시 로딩
        • 13.1.6 가로채기를 이용한 지연 로딩
      • 13.2 페치 전략 선택하기
        • 13.2.1 배치로 데이터 선행 페치하기
        • 13.2.2 하위 쿼리를 이용한 컬렉션 선행 페치
        • 13.2.3 조인을 이용한 즉시 페치
        • 13.2.4 보조 테이블에 대한 페치 최적화하기
        • 13.2.5 최적화 지침
      • 13.3 캐싱 기초
        • 13.3.1 캐싱 전략과 유효 범위
        • 13.3.2 하이버네이트 캐시 아키텍처
      • 13.4 캐싱 실전
        • 13.4.1 동시성 제어 전략 선택하기
        • 13.4.2 캐시 영역 이해하기
        • 13.4.3 로컬 캐시 공급자 설정
        • 13.4.4 복제 캐시 설정하기
        • 13.4.5 2차 캐시 제어
      • 13.5 정리
      •  
    • 14장 HQL과 JPA QL을 이용한 쿼리
      • 14.1 쿼리 생성과 실행
        • 14.1.1 쿼리 준비
        • 14.1.2 쿼리 실행
        • 14.1.3 명명 쿼리 사용하기
      • 14.2 기본 HQL과 JPA QL 쿼리
        • 14.2.1 조회
        • 14.2.2 한정
        • 14.2.3. 프로젝션
      • 14.3 조인, 리포팅 쿼리, 하위 쿼리
        • 14.3.1 조인 관계와 연관 관계
        • 14.3.2 리포팅 쿼리
        • 14.3.3 하위 쿼리 사용하기
      • 14.4 정리
      •  
    • 15장 고급 쿼리 옵션
      • 15.1 Criteria와 Example을 이용한 쿼리 수행
        • 15.1.1 기본 Criteria 쿼리
        • 15.1.2 조인과 동적 페치 수행
        • 15.1.3 프로젝션과 리포팅 쿼리
        • 15.1.4 Example을 이용한 쿼리
      • 15.2 네이티브 SQL 쿼리 사용하기
        • 15.2.1 자동화된 결과 집합 처리
        • 15.2.2 스칼라 값 받아오기
        • 15.2.3 자바 퍼시스턴스에서의 네이티브 SQL 사용
      • 15.3 컬렉션 필터링
      • 15.4 쿼리 결과 캐시
        • 15.4.1 쿼리 결과 캐시 활성화하기
        • 15.4.2 쿼리 캐시 이해하기
        • 15.4.3 쿼리 캐시는 언제 사용할까?
        • 15.4.4 고유 식별자를 이용한 캐시 룩업
      • 15.5 정리
      •  
    • 16장 계층형 애플리케이션 작성과 테스트
      • 16.1 웹 애플리케이션에서의 하이버네이트
        • 16.1.1 기능 소개
        • 16.1.2 컨트롤러 작성하기
        • 16.1.3 Open Session in View 패턴
        • 16.1.4 지능적인 도메인 모델 설계하기
      • 16.2 영속화 계층 만들기
        • 16.2.1 일반화된 데이터 접근 객체 패턴
        • 16.2.2 제네릭 CRUD 인터페이스 구현하기
        • 16.2.3 엔티티 DAO 구현하기
        • 16.2.4 데이터 접근 객체 사용하기
      • 16.3 커맨드 패턴 도입하기
        • 16.3.1 기본 인터페이스
        • 16.3.2 커맨드 객체 실행하기
        • 16.3.3 커맨드 패턴의 변종
      • 16.4 EJB 3.0으로 애플리케이션 설계하기
        • 16.3.1 상태 유지 빈을 사용해 컨버세이션 구현하기
        • 16.4.2 EJB로 DAO 작성하기
        • 16.4.3 의존성 주입 활용하기
      • 16.5 테스트
        • 16.5.1 여러 종류의 테스트 이해하기
        • 16.5.2 TestNG 도입하기
        • 16.5.3 영속화 계층 테스트
        • 16.5.4 성능 벤치마크 고려하기
      • 16.6 정리
      •  
    • 17장 제이보스 심 소개
      • 17.1 자바 EE 5.0 프로그래밍 모델
        • 17.1.1 JSF 살펴보기
        • 17.1.2 EJB 3.0 살펴보기
        • 17.1.3 JSF와 EJB 3.0을 이용하여 웹 애플리케이션 작성하기
        • 17.1.4 애플리케이션 분석하기
      • 17.2 심을 이용한 애플리케이션 개선
        • 17.2.1 심 설정하기
        • 17.2.2 페이지와 상태유지 컴포넌트를 연동하기
        • 17.2.3 심 애플리케이션 분석하기
      • 17.3 컨텍스트 기반 컴포넌트 이해하기
        • 17.3.1 로그인 화면 작성하기
        • 17.3.2 컴포넌트 생성하기
        • 17.3.3 컨텍스트 기반 변수의 별칭 만들기
        • 17.3.4 로그인/로그아웃 기능 완성하기
      • 17.4 입력 유효성 검증하기
        • 17.4.1 하이버네이트 검증기 도입하기
        • 17.4.2 등록 페이지 만들기
        • 17.4.3 심을 이용한 국제화
      • 17.5 심을 이용해서 영속성 처리 단순화하기
        • 17.5.1 컨버세이션 구현하기
        • 17.5.2 심에 영속성 컨텍스트 관리 위임하기
      • 17.6 정리
      •  
  • 부록A SQL 기초
  • 부록B 매핑 레퍼런스
  • 728쪽, 밑에서 4번째 줄

    다음 쿼리는 전체 결과 중에서 입찰액이 100달러 이상이 없는 품목을 반환한다.

    -->

    다음 쿼리는 입찰액이 100달러 이상인 입찰이 한 개 이상 있는 품목을 반환한다.

  • 728쪽, 밑에서 2번째 줄

    이 쿼리는 정확하게 입찰액이 100달러인 품목을 반환한다.

    -->

    이 쿼리는 입찰액이 100달러인 입찰이 한 개 이상 있는 품목을 반환한다.

예제코드 관련 GitHub 페이지

관련 글