책소개
자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA 기초 이론과 핵심 원리, 그리고 실무에 필요한 성능 최적화 방법까지 JPA에 대한 모든 것을 다룬다. 또한, 스프링 프레임워크와 JPA를 함께 사용하는 방법을 설명하고, 스프링 데이터 JPA, QueryDSL 같은 혁신적인 오픈 소스를 활용해서 자바 웹 애플리케이션을 효과적으로 개발하는 방법을 다룬다.다음 링크에서 온라인 강의를 수강할 수 있다.- 기본편: https://www.inflearn.com/course/ORM-JPA-Basic- 활용편 1: https://www.inflearn.com/course/스프링부트-JPA-활용-1- 활용편 2: 준비 중입니다.
저자소개
SI에서 다양한 프로젝트를 수행하고, J2EE 강사와 다음 커뮤니케이션, SK 플래닛을 거쳐 현재 우아한형제들에서 개발 팀장으로 근무하고 있다. 도메인 주도 설계에 관심이 많으며, 끊임없이 공부하고 더 나은 코드를 작성하는 개발자가 되려고 노력 중이다.
목차
1장. JPA 소개1.1 SQL과 문제점1.1.1 반복, 반복 그리고 반복1.1.2 SQL에 의존적인 개발1.1.3 JPA와 문제 해결1.2 패러다임의 불일치1.2.1 상속1.2.2 연관관계1.2.3 객체 그래프 탐색1.2.4 비교1.2.5 정리1.3 JPA란 무엇일까?1.3.1 JPA 소개1.3.2 왜 JPA를 사용해야 하는가?1.4 정리2장. JPA 시작2.1 이클립스 설치와 프로젝트 불러오기2.2 H2 데이터베이스 설치2.3 라이브러리와 프로젝트 구조2.3.1 메이븐과 사용 라이브러리 관리2.4 객체 매핑 시작2.5 persistence.xml 설정2.5.1 데이터베이스 방언2.6 애플리케이션 개발2.6.1 엔티티 매니저 설정2.6.2 트랜잭션 관리2.6.3 비즈니스 로직2.6.4 JPQL2.7 정리3장. 영속성 관리3.1 엔티티 매니저 팩토리와 엔티티 매니저3.2 영속성 컨텍스트란?3.3 엔티티의 생명주기3.4 영속성 컨텍스트의 특징3.4.1 엔티티 조회3.4.2 엔티티 등록3.4.3 엔티티 수정3.4.4 엔티티 삭제3.5 플러시3.5.1 플러시 모드 옵션3.6 준영속3.6.1 엔티티를 준영속 상태로 전환: detach( )3.6.2 영속성 컨텍스트 초기화: clear( )3.6.3 영속성 컨텍스트 종료: close( )3.6.4 준영속 상태의 특징3.6.5 병합: merge( )3.7 정리4장. 엔티티 매핑4.1 @Entity4.2 @Table4.3 다양한 매핑 사용4.4 데이터베이스 스키마 자동 생성4.5 DDL 생성 기능4.6 기본 키 매핑4.6.1 기본 키 직접 할당 전략4.6.2 IDENTITY 전략4.6.3 SEQUENCE 전략4.6.4 TABLE 전략4.6.5 AUTO 전략4.6.6 기본 키 매핑 정리4.7 필드와 컬럼 매핑: 레퍼런스4.7.1 @Column4.7.2 @Enumerated4.7.3 @Temporal4.7.4 @Lob4.7.5 @Transient4.7.6 @Access4.8 정리실전 예제 1. 요구사항 분석과 기본 매핑요구사항 분석도메인 모델 분석테이블 설계엔티티 설계와 매핑데이터 중심 설계의 문제점5장. 연관관계 매핑 기초5.1 단방향 연관관계5.1.1 순수한 객체 연관관계5.1.2 테이블 연관관계5.1.3 객체 관계 매핑5.1.4 @JoinColumn5.1.5 @ManyToOne5.2 연관관계 사용5.2.1 저장5.2.2 조회5.2.3 수정5.2.4 연관관계 제거5.2.5 연관된 엔티티 삭제5.3 양방향 연관관계5.3.1 양방향 연관관계 매핑5.3.2 일대다 컬렉션 조회5.4 연관관계의 주인5.4.1 양방향 매핑의 규칙: 연관관계의 주인5.4.2 연관관계의 주인은 외래 키가 있는 곳5.5 양방향 연관관계 저장5.6 양방향 연관관계의 주의점5.6.1 순수한 객체까지 고려한 양방향 연관관계5.6.2 연관관계 편의 메소드5.6.3 연관관계 편의 메소드 작성 시 주의사항5.7 정리실전 예제 2. 연관관계 매핑 시작일대다, 다대일 연관관계 매핑객체 그래프 탐색6장. 다양한 연관관계 매핑6.1 다대일6.1.1 다대일 단방향 [N:1]6.1.2 다대일 양방향 [N:1, 1:N]6.2 일대다6.2.1 일대다 단방향 [1:N]6.2.2 일대다 양방향 [1:N, N:1]6.3 일대일 [1:1]6.3.1 주 테이블에 외래 키6.3.2 대상 테이블에 외래 키6.4 다대다 [N:N]6.4.1 다대다: 단방향6.4.2 다대다: 양방향6.4.3 다대다: 매핑의 한계와 극복, 연결 엔티티 사용6.4.4 다대다: 새로운 기본 키 사용6.4.5 다대다 연관관계 정리6.5 정리실전 예제 3. 다양한 연관관계 매핑일대일 매핑다대다 매핑7장. 고급 매핑7.1 상속 관계 매핑7.1.1 조인 전략7.1.2 단일 테이블 전략7.1.3 구현 클래스마다 테이블 전략7.2 @MappedSuperclass7.3 복합 키와 식별 관계 매핑7.3.1 식별 관계 vs 비식별 관계7.3.2 복합 키: 비식별 관계 매핑7.3.3 복합 키: 식별 관계 매핑7.3.4 비식별 관계로 구현7.3.5 일대일 식별 관계7.3.6 식별, 비식별 관계의 장단점7.4 조인테이블7.4.1 일대일 조인테이블7.4.2 일대다 조인테이블7.4.3 다대일 조인테이블7.4.4 다대다 조인테이블7.5 엔티티 하나에 여러 테이블 매핑7.6 정리실전 예제 4. 상속 관계 매핑상속 관계 매핑@MappedSuperclass 매핑8장. 프록시와 연관관계 관리8.1 프록시8.1.1 프록시 기초8.1.2 프록시와 식별자8.1.3 프록시 확인8.2 즉시 로딩과 지연 로딩8.2.1 즉시 로딩8.2.2 지연 로딩8.2.3 즉시 로딩, 지연 로딩 정리8.3 지연 로딩 활용8.3.1 프록시와 컬렉션 래퍼8.3.2 JPA 기본 페치 전략8.3.3 컬렉션에 FetchType.EAGER 사용 시 주의점8.4 영속성 전이 - CASCADE8.4.1 영속성 전이: 저장8.4.2 영속성 전이: 삭제8.4.3 CASCADE의 종류8.5 고아 객체8.6 영속성 전이 + 고아 객체, 생명주기8.7 정리실전 예제 5. 연관관계 관리글로벌 페치 전략 설정영속성 전이 설정9장. 값 타입9.1 기본값 타입9.2 임베디드 타입(복합 값 타입)9.2.1 임베디드 타입과 테이블 매핑9.2.2 임베디드 타입과 연관관계9.2.3 @AttributeOverride: 속성 재정의9.2.4 임베디드 타입과 null9.3. 값 타입과 불변 객체9.3.1 값 타입 공유 참조9.3.2 값 타입 복사9.3.3 불변 객체9.4. 값 타입의 비교9.5. 값 타입 컬렉션9.5.1 값 타입 컬렉션 사용9.5.2 값 타입 컬렉션의 제약사항9.6 정리실전 예제 6. 값 타입 매핑실전 예제 정리10장. 객체지향 쿼리 언어10.1 객체지향 쿼리 소개10.1.1 JPQL 소개10.1.2 Criteria 쿼리 소개10.1.3 QueryDSL 소개10.1.4 네이티브 SQL 소개10.1.5 JDBC 직접 사용, 마이바티스 같은 SQL 매퍼 프레임워크 사용10.2 JPQL10.2.1 기본 문법과 쿼리 API10.2.2 파라미터 바인딩10.2.3 프로젝션10.2.4 페이징 API10.2.5 집합과 정렬10.2.6 JPQL 조인10.2.7 페치 조인10.2.8 경로 표현식10.2.9 서브 쿼리10.2.10 조건식10.2.11 다형성 쿼리10.2.12 사용자 정의 함수 호출(JPA 2.1)10.2.13 기타 정리10.2.14 엔티티 직접 사용10.2.15 Named 쿼리: 정적 쿼리10.3 Criteria10.3.1 Criteria 기초10.3.2 Criteria 쿼리 생성10.3.3 조회10.3.4 집합10.3.5 정렬10.3.6 조인10.3.7 서브 쿼리10.3.8 IN 식10.3.9 CASE 식10.3.10 파라미터 정의10.3.11 네이티브 함수 호출10.3.12 동적 쿼리10.3.13 함수 정리10.3.14 Criteria 메타 모델 API10.4 QueryDSL10.4.1 QueryDSL 설정10.4.2 시작10.4.3 검색 조건 쿼리10.4.4 결과 조회10.4.5 페이징과 정렬10.4.6 그룹10.4.7 조인10.4.8 서브 쿼리10.4.9 프로젝션과 결과 반환10.4.10 수정, 삭제 배치 쿼리10.4.11 동적 쿼리10.4.12 메소드 위임10.4.13 QueryDSL 정리10.5 네이티브 SQL10.5.1 네이티브 SQL 사용10.5.2 Named 네이티브 SQL10.5.3 네이티브 SQL XML 에 정의10.5.4 네이티브 SQL 정리10.5.5 스토어드 프로시저(JPA 2.1)10.6 객체지향 쿼리 심화10.6.1 벌크 연산10.6.2 영속성 컨텍스트와 JPQL10.6.3 JPQL과 플러시 모드10.7 정리11장. 웹 애플리케이션 제작11.1 프로젝트 환경설정11.1.1 프로젝트 구조11.1.2 메이븐과 사용 라이브러리 관리11.1.3 스프링 프레임워크 설정11.2 도메인 모델과 테이블 설계11.2.1 요구사항 분석11.2.2 도메인 모델 설계11.2.3 테이블 설계11.2.4 연관관계 정리11.2.5 엔티티 클래스11.3 애플리케이션 구현11.3.1 개발 방법11.3.2 회원 기능11.3.3 상품 기능11.3.4 주문 기능11.3.5 웹 계층 구현11.4 정리12장. 스프링 데이터 JPA12.1 스프링 데이터 JPA 소개12.1.1 스프링 데이터 프로젝트12.2 스프링 데이터 JPA 설정12.3 공통 인터페이스 기능12.4 쿼리 메소드 기능12.4.1 메소드 이름으로 쿼리 생성12.4.2 JPA NamedQuery12.4.3 @Query, 리파지토리 메소드에 쿼리 정의12.4.4 파라미터 바인딩12.4.5 벌크성 수정 쿼리12.4.6 반환 타입12.4.7 페이징과 정렬12.4.8 힌트12.4.9 Lock12.5 Specifications(명세)12.6 사용자 정의 리파지토리 구현12.7 Web 확장12.7.1 설정12.7.2 도메인 클래스 컨버터 기능12.7.3 페이징과 정렬 기능12.8 스프링 데이터 JPA가 사용하는 구현체12.9 JPA 샵에 적용12.9.1 환경 설정12.9.2 리파지토리 리팩토링12.9.3 명세 적용12.10 스프링 데이터 JPA와 QueryDSL 통합12.10.1 QueryDslPredicateExecutor 사용12.10.3 QueryDslRepositorySupport 사용12.11 정리13장. 웹 애플리케이션과 영속성 관리13.1 트랜잭션 범위의 영속성 컨텍스트13.1.1 스프링 컨테이너의 기본 전략13.2 준영속 상태와 지연 로딩13.2.1 글로벌 페치 전략 수정13.2.2 JPQL 페치 조인13.2.3 강제로 초기화13.2.4 FACADE 계층 추가13.2.5 준영속 상태와 지연 로딩의 문제점13.3 OSIV13.3.1 과거 OSIV: 요청 당 트랜잭션13.3.2 스프링 OSIV: 비즈니스 계층 트랜잭션13.3.3 OSIV 정리13.4 너무 엄격한 계층13.5 정리14장. 컬렉션과 부가 기능14.1 컬렉션14.1.1 JPA와 컬렉션14.1.2 Collection, List14.1.3 Set14.1.4 List + @OrderColumn14.1.5 @OrderBy14.2 @Converter14.2.1 글로벌 설정14.3 리스너14.3.1 이벤트 종류14.3.2 이벤트 적용 위치14.4 엔티티 그래프14.4.1 Named 엔티티 그래프14.4.2 em.find( )에서 엔티티 그래프 사용14.4.3 subgraph14.4.4 JPQL에서 엔티티 그래프 사용14.4.5 동적 엔티티 그래프14.4.6 엔티티 그래프 정리14.5 정리15장. 고급 주제와 성능 최적화15.1 예외 처리15.1.1 JPA 표준 예외 정리15.1.2 스프링 프레임워크의 JPA 예외 변환15.1.3 스프링 프레임워크에 JPA 예외 변환기 적용15.1.4 트랜잭션 롤백 시 주의사항15.2 엔티티 비교15.2.1 영속성 컨텍스트가 같을 때 엔티티 비교15.2.2 영속성 컨텍스트가 다를 때 엔티티 비교15.3 프록시 심화 주제15.3.1 영속성 컨텍스트와 프록시15.3.2 프록시 타입 비교15.3.3 프록시 동등성 비교15.3.4 상속관계와 프록시15.4 성능 최적화15.4.1 N+1 문제15.4.2 읽기 전용 쿼리의 성능 최적화15.4.3 배치 처리15.4.4 SQL 쿼리 힌트 사용15.4.5 트랜잭션을 지원하는 쓰기 지연과 성능 최적화15.5 정리16장. 트랜잭션과 락, 2차 캐시16.1 트랜잭션과 락16.1.1 트랜잭션과 격리 수준16.1.2 낙관적 락과 비관적 락 기초16.1.3 @Version16.1.4 JPA 락 사용16.1.5 JPA 낙관적 락16.1.6 JPA 비관적 락16.1.7 비관적 락과 타임아웃16.2 2차 캐시16.2.1 1차 캐시와 2차 캐시16.2.2 JPA 2차 캐시 기능16.2.3 하이버네이트와 EHCACHE 적용16.3 정리