서브메뉴

본문

자바 ORM 표준 JPA 프로그래밍 (에이콘 오픈 소스 프로그래밍 시리즈,스프링 데이터 예제 프로젝트로 배우는 전자정부 표준 데이터베이스 프레임워크)
자바 ORM 표준 JPA 프로그래밍 (에이콘 오픈 소스 프로그래밍 시리즈,스프링 데이터 예제 프로젝트로 배우는 전자정부 표준 데이터베이스 프레임워크)
저자 : 김영한
출판사 : 에이콘출판
출판년 : 2015
ISBN : 9788960777330

책소개

자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다. 이 책은 JPA 기초 이론과 핵심 원리, 그리고 실무에 필요한 성능 최적화 방법까지 JPA에 대한 모든 것을 다룬다. 또한, 스프링 프레임워크와 JPA를 함께 사용하는 방법을 설명하고, 스프링 데이터 JPA, QueryDSL 같은 혁신적인 오픈 소스를 활용해서 자바 웹 애플리케이션을 효과적으로 개발하는 방법을 다룬다.

다음 링크에서 온라인 강의를 수강할 수 있다.

■ 강의 링크: https://www.inflearn.com/roadmaps/149
■ 온라인 강의 목록
-자바 ORM 표준 JPA 프로그래밍 - 기본편: https://www.inflearn.com/course/ORM-JPA-Basic
-실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발: https://www.inflearn.com/course/스프링부트-JPA-활용-1
-실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화: https://www.inflearn.com/course/스프링부트-JPA-API개발-성능최적화#
-실전! 스프링 데이터 JPA: https://www.inflearn.com/course/스프링-데이터-JPA-실전
-실전! Querydsl: https://www.inflearn.com/course/Querydsl-실전
[교보문고에서 제공한 정보입니다.]

출판사 서평

★ 이 책에서 다루는 내용 ★

■ JPA 기초 이론과 핵심 원리
■ JPA로 도메인 모델을 설계하는 과정을 예제 중심으로 설명
■ 다양한 객체 지향 쿼리 언어 설명
■ JPA와 스프링 프레임워크를 함께 사용해서 웹 애플리케이션을 개발하는 방법
■ 스프링 데이터 JPA, QueryDSL 소개 및 활용
■ 실무에서 JPA를 사용할 때 성능을 최적화하는 다양한 방법


★ 이 책의 대상 독자 ★

이 책은 JPA를 사용해서 엔터프라이즈 애플리케이션을 개발하려는 모든 자바 개발자를 대상으로 한다. 이 책의 내용을 이해하려면 자바 언어와 JDBC를 사용한 데이터베이스 프로그래밍, 그리고 객체지향 프로그래밍과 관계형 데이터베이스에 대해 어느 정도 알고 있어야 한다. 추가로 3부는 웹 개발과 스프링 프레임워크에 대한 기초 지식이 필요하며 JUnit을 다룰 수 있어야 한다. 그리고 예제 코드를 실행하려면 메이븐에 대해서도 약간의 지식이 필요하다.


★ 이 책의 구성 ★

JPA는 크게 객체와 테이블을 어떻게 매핑해야 하는지에 관한 설계 부분과 설계한 모델을 실제 사용하는 부분으로 나눌 수 있다. 책의 앞부분에서는 기초 이론과 설계 방법을 학습하고 뒷부분에서는 학습한 이론을 바탕으로 JPA를 활용해서 실제 웹 애플리케이션을 개발한다.

이 책은 크게 네 부분으로 나뉘어 있다.

1장에서 9장은 이론 편이다. 객체와 테이블을 매핑하는 방법과 JPA의 핵심 기능들을 알아본다. 4장부터 9장까지는 각 장의 마지막에 점진적으로 도메인 모델을 설계해 나가는 실전 예제가 있어서 학습한 내용을 실제로 적용해볼 수 있게 했다.

10장은 객체지향 쿼리 언어에 대한 내용이다. JPA가 제공하는 객체지향 쿼리 언어인 JPQL(Java Persistence Query Language)부터 직접 SQL을 작성하는 네이티브 SQL까지 알아본다.

11장과 12장은 실무에서 JPA를 사용하기 위한 활용편이다. 스프링 프레임워크와 JPA를 사용해서 어떻게 웹 애플리케이션을 개발하는지 학습하고 스프링 데이터 JPA와 QueryDSL이라는 혁신적인 오픈소스도 사용해본다.
13장에서 16장은 트랜잭션과 락, 캐시, 성능 최적화 등 JPA의 다양한 고급 주제들을 다룬다.


★ 온라인 강의 ★

지금까지 다양한 실무 프로젝트에 JPA를 도입했다. 작게는 단순한 웹 서비스부터 크게는 조 단위의 거래 금액을 처리하는 주문, 결제, 정산 시스템까지 JPA로 직접 설계하고 개발했다. JPA를 처음 실무에 도입할 때는 좌충우돌 했지만, 개발 생산성과 유지보수가 확연히 좋아졌고 코드 품질과 테스트에 더 많은 시간을 할애할 수 있었다. 무엇보다 JPA를 사용해본 동료들은 이전으로 돌아가고 싶어하지 않아 했다. 하지만 JPA에 관한 국내 자료가 부족해 어려움이 많았다. 그래서 2015년 직접 이 책을 썼다.
책과 함께 볼 수 있는 유료 온라인 강의를 제공한다. 책을 출간한 뒤 네이버, 카카오와 같은 인터넷 비즈니스 회사부터 우아한형제들, 11번가 등 e커머스 회사까지 JPA를 사용 중이거나 도입하려는 많은 회사에서 강연했다. 책에서 이해하기 어렵던 부분을 강의를 통해 쉽게 이해했다는 개발자들의 이야기를 듣고 온라인 강의를 개설했다. 참고로 강의는 최신 버전의 스프링 부트와 JPA를 사용하고, 코드로 쉽게 따라할 수 있다. 그리고 실무 노하우를 전달하는 데 더 많은 초점을 맞췄다.
여러분도 실무에서 JPA를 자신 있게 활용할 수 있기를 바란다.


다음 링크에서 온라인 강의를 수강할 수 있다.

■ 강의 링크: https://www.inflearn.com/roadmaps/149
■ 온라인 강의 목록
-자바 ORM 표준 JPA 프로그래밍 - 기본편: https://www.inflearn.com/course/ORM-JPA-Basic
-실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발: https://www.inflearn.com/course/스프링부트-JPA-활용-1
-실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화: https://www.inflearn.com/course/스프링부트-JPA-API개발-성능최적화#
-실전! 스프링 데이터 JPA: https://www.inflearn.com/course/스프링-데이터-JPA-실전
-실전! Querydsl: https://www.inflearn.com/course/Querydsl-실전


★ 지은이의 말 ★

JPA를 처음 접했을 때의 놀라움은 아직도 잊혀지지 않는다. 지금까지 관계형 데이터베이스에서 객체를 관리하려고 작성했던 무수한 CRUD 코드와 SQL들이 머릿속을 스쳐 지나갔다. 마치 시골에서 직접 모내기를 하다가 최신 트랙터를 만난 기분이었다.

객체를 관계형 데이터베이스에 저장하려면 많은 시간과 코드를 소비해야 한다. 예를 들어 객체를 SQL로 변환하는 단순한 일부터, 객체의 상속 구조를 테이블에 저장하는 복잡한 일까지, 개발자는 객체와 데이터베이스 사이에서 무수한 매핑 코드와 SQL을 작성해야 한다. 자바 진영에서는 이런 문제를 해결하기 위해 JPA라는 표준 기술을 제공한다. 자바 ORM 표준 JPA는 SQL 작성 없이 객체를 데이터베이스에 직접 저장할 수 있게 도와주고, 객체와 관계형 데이터베이스의 차이도 중간에서 해결해준다.

그간 실무에 JPA를 도입하면서 처음에는 좌충우돌하기도 했지만, 개발 생산성과 유지보수가 확연히 좋아졌고, 남은 시간에 코드 품질과 테스트에 더 많은 시간을 쏟을 수 있었다. 그리고 JPA를 사용해본 동료들은 전으로 돌아가고 싶어하지 않았다. 하지만 JPA에 대한 국내 자료가 부족했고, 대부분이 원서여서 어려운 점이 많았다. 그래서 때가 되면 JPA에 대한 책을 쓰고 싶다고 어렴풋하게 생각했는데, 마침 『토비의 스프링 3』과 『토비의 스프링 3.1』을 저술하신 이일민 님께서 JPA에 관한 책 쓰기를 권유하셨다. 6개월 정도면 충분하겠지 생각하고 책을 쓰기로 했는데, 어느덧 시간이 화살처럼 빠르게 지나 2년이 지나버렸다.

이 책에서는 JPA 기초 이론과 핵심 원리, 그리고 실무에 필요한 성능 최적화 방법까지 JPA에 대한 모든 것을 다루는 데 주력했다. 또한, 스프링 프레임워크와 JPA를 함께 사용하는 방법을 설명하고, 스프링 데이터 JPA, QueryDSL 같은 혁신적인 오픈 소스를 활용해서 자바 웹 애플리케이션을 효과적으로 개발하는 방법을 설명했다.

돌이켜보니 보잘것없는 사람의 책을 기다리고 응원해주신 분들 덕분에 여기까지 온 것 같다. 진심으로 정말 큰 힘이 되었기에, 그 모든 분께 감사를 전한다. 이 책이 JPA를 시작하는 분들께 조금이나마 도움이 되길 바란다.
[예스24에서 제공한 정보입니다.]

목차정보

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 JPQL

2.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 @Entity

4.2 @Table

4.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 @Column

4.7.2 @Enumerated

4.7.3 @Temporal

4.7.4 @Lob

4.7.5 @Transient

4.7.6 @Access

4.8 정리



실전 예제 1. 요구사항 분석과 기본 매핑

__요구사항 분석

__도메인 모델 분석

__테이블 설계

__엔티티 설계와 매핑

__데이터 중심 설계의 문제점



5장. 연관관계 매핑 기초

5.1 단방향 연관관계

5.1.1 순수한 객체 연관관계

5.1.2 테이블 연관관계

5.1.3 객체 관계 매핑

5.1.4 @JoinColumn

5.1.5 @ManyToOne

5.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 @MappedSuperclass

7.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 영속성 전이 - CASCADE

8.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 임베디드 타입과 null

9.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 JPQL

10.2.1 기본 문법과 쿼리 API

10.2.2 파라미터 바인딩

10.2.3 프로젝션

10.2.4 페이징 API

10.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 Criteria

10.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 메타 모델 API

10.4 QueryDSL

10.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 네이티브 SQL

10.5.1 네이티브 SQL 사용

10.5.2 Named 네이티브 SQL

10.5.3 네이티브 SQL XML 에 정의

10.5.4 네이티브 SQL 정리

10.5.5 스토어드 프로시저(JPA 2.1)

10.6 객체지향 쿼리 심화

10.6.1 벌크 연산

10.6.2 영속성 컨텍스트와 JPQL

10.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장. 스프링 데이터 JPA

12.1 스프링 데이터 JPA 소개

12.1.1 스프링 데이터 프로젝트

12.2 스프링 데이터 JPA 설정

12.3 공통 인터페이스 기능

12.4 쿼리 메소드 기능

12.4.1 메소드 이름으로 쿼리 생성

12.4.2 JPA NamedQuery

12.4.3 @Query, 리파지토리 메소드에 쿼리 정의

12.4.4 파라미터 바인딩

12.4.5 벌크성 수정 쿼리

12.4.6 반환 타입

12.4.7 페이징과 정렬

12.4.8 힌트

12.4.9 Lock

12.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 OSIV

13.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, List

14.1.3 Set

14.1.4 List + @OrderColumn

14.1.5 @OrderBy

14.2 @Converter

14.2.1 글로벌 설정

14.3 리스너

14.3.1 이벤트 종류

14.3.2 이벤트 적용 위치

14.4 엔티티 그래프

14.4.1 Named 엔티티 그래프

14.4.2 em.find( )에서 엔티티 그래프 사용

14.4.3 subgraph

14.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 @Version

16.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 정리
[알라딘에서 제공한 정보입니다.]