Life/Book Record

[서평] 자바 ORM 표준 JPA 프로그래밍

샤아이인 2022. 9. 13. 20:05

저의 돈으로 직접 사서 직접 완독해 본 후 써보는 후기입니다. 따라서 장점은 장점대로 칭찬할 것이며, 단점은 단점대로 언급할 것입니다.

http://www.acornpub.co.kr/book/jpa-programmig

 

자바 ORM 표준 JPA 프로그래밍

JPA 기초 이론과 핵심 원리, 그리고 실무에 필요한 성능 최적화 방법까지 JPA에 대한 모든 것

www.acornpub.co.kr

 

<읽은 기간>

2022/09/09 ~ 2022/09/12

(책의 대부분의 내용이 영한님의 인프런 강의에서 배웠던 내용이라, 복습이다 생각하면서 빠르게 읽고 이해만 하였습니다.)

<리뷰 순서>

1) 책의 표지

2) 단원별 구성

3) 내용

4) 읽은 소감

우선 저의 글의 앞부분만 보는 분들을 위해 먼저 간단히 3가지에 대해 답해보겠습니다.

Q 이 책을 읽기 전에 필요한 수준/ 지식은?

우선 책의 앞 부분에서 대상 독자를 다음과 같이 정의하고 있다.

읽어본 결과, 솔직하게 RDB(관계형 데이터베이스)에 대한 기본적인 이해는 필수적이다.

Inner Join, left join, 트랜잭션 격리 수준, 외래 키, 복합 키 등 기본적인 데이터베이스에 대한 학습이 선행적으로 필요하다.

 

다만 기본적인 데이터베이스 에 대한 이해가 있다면, 충분히 JPA와 병행하면서 서로 상호보완하면서 학습하면 될 것 같다.

 

 

Q 이 책을 읽어야 할 필요성, 어디에 도움이 될까?

=> JPA 초보자가 이 책을 읽는다면 처음 접해보는 ORM 방식에 놀라움을 감출 수 없을 것 이다.

 

기존 JDBC만 해도, 조금만 반복적인 과정을 하다 보면 내가 개발자 인지? sql 매핑하는 사람인지 혼돈이 온다...

이런 반복적인 작업을 줄이고, 데이터베이스와 객체지향 패러다임 사이에서 오는 간극만 잘 이해한다면,

애플리케이션의 핵심 로직을 개발하는데 더 많은 시간을 투자할 수 있다.

 

장당 하건대 Java 기반의 Spring개발자라면 JPA는 필수적으로 공부해야 되는 기술이 된 것 같다.

 

나 같은 경우 JPA 자체를 처음 접하는 것은 아니었다. 인강을 통해 영한님의 JPA 코스 강의 5개를 전부 완강한 상태였다.

그럼에도 책에서 얻어갈 점들이 충분하게 많았다.

 

대표적으로 OSIV에 대한 과거의 사용 예시와, 현대의 사용 예시, 또한 주의점들이 정말 도움이 많이 되는 내용이었다.

또한 2차 캐시에 대하여도 접할 수 있으며, 비관적 락, 낙관적 락 등 JPA에서 Lock을 사용하는 방법 또한 학습하게 되었다.

 

Q 이 책을 읽은 후 추후 공부는?

JPA를 공부하다 보면 오히려 관계형 데이터베이스에 대한 학습이 좀 더 필요한 것을 느낄 수 있다.

나 같은 경우 데이터베이스 시스템에 대한 추가적인 학습과 함께, 프로젝트를 진행하면서 QueryDsl을 좀 더 익숙하게 학습하고 싶다.

 

1. 책의 표지

다들 책을 처음 받으면 드는 생각이 있다...

이거 새책 맞아??... 왜 이렇게 뭐가 묻은 것 같지??...

새책 맞다... 디자인이 이런 거였다.... 왜 이런 디자인인 거지?... 약간 그 외국 집의 차고 떠오르는 디자인인 것 같다.

 

2. 단원별 구성

우선 책에는 다음과 같이 설명되어 있다.

 

1장. JPA 소개

JPA가 왜 좋은지 어떠한 불편한 점을 개선하고자 탄생하게 되었는지, 추가로 Hibernate와 어떤 관계인지 나온다.

 

2장. JPA 시작

튜토리얼 정도의 내용이다. 처음 JPA를 접하는 사용자들에게 환경 구성 및 어떤 기술들이 사용되는지 간략하게 알려준다.

 

3장. 영속성 관리

JPA 내부에서 Entity를 관리하는 영속성 컨텍스트에 대해 설명해준다.

영속성 컨텍스트는 JPA의 핵심이라 할 수 있다. 영속성 컨텍스트 덕분에 변경 감지도 일어나고, 지연 로딩도 가능하고 등등...

학습해야 할 핵심 주제이다.

 

4장. 엔티티 매핑

JPA 사용하는 데 있어 가장 기본적인 테이블-객체(클래스) 간의 매핑 방법에 관해 설명해준다.

가장 기본적인 사용법을 익히는 과정이다.

 

5장. 연관 관계 매핑 기초

테이블 간의 연관관계를 어떻게 객체 간의 연관 관계로 표현하는지 알려준다.

개인적으로 연관 관계의 주인(Onwer) 개념을 명확하게 학습할 수 있으며, 왜 N:1에서 N(다)의 입장에서 FK를 관리해야하는지 이해할 수 있다.

 

6장. 다양한 연관 관계 매핑

좀 더 복잡한 연관 관계들(단방향, 양방향, 다중성)을 어떻게 표현하는지 다룬다.

 

7장. 고급 매핑

상속관계, 복합 키(2개 이상의 필드를 PK로 갖는 키) 및 조인 테이블 등 좀 더 복잡한 테이블 매핑 관계를 사용하는 방법을 설명해준다.

특히 객체지향의 상속 관계를 관계형 데이터베이스로 표현하는 다양한 방법을 소개해주는데 개인적으로 흥미로웠던 주제이다.

 

8장. 프락시와 연관관계

xxxToOne 관계에서 보통 Lazy loading을 사용하는데, 이때 반환되는 Proxy 객체에 대해 자세히 다룬다.

Proxy를 통한 지연 로딩의 원리와, 어떻게 초기화하는지 등 기본적인 내용을 다룬다.

 

9장. 값 타입

JPA에서 다루는 데이터는 크게 엔티티 타입과 값 타입으로 나눌 수 있는데 이 둘의 차이에 대해서 다룬다.

또한 1:N 관계를 테이블을 엔티티를 이용한 join이 아닌 collection 기능을 사용해 매핑하는 방법을 알려준다.

 

10장. 객체지향 쿼리 언어

JPA에서 지원하는 쿼리 기반의 데이터 검색 기능인 JPQL과 JPQL 빌더 역할을 하는 QueryDSL 사용 방법을 다룬다.

(참고로 Criteria는 사실상 망한 기술이라 읽지 않았다. QueryDsl만 명확하게 학습해도 된다)

 

11장. 웹 애플리케이션 제작

책 전반부에서 배운 내용을 기반으로 실습을 진행한다. 난 예전에 강의를 보면서 진행했기 때문에 생략하였다.

 

12장. 스프링 데이터 JPA

실무에서 Data JPA를 사용하지 않고 JPA 기술을 사용하는 곳이 얼마나 있을까 싶다.

이 챕터에서는 Data JPA 사용 방법, 특히 Hibernate에는 없는 스프링에서 추가 제공하는 다양한 편의 기능들(메서드 이름 기반 쿼리 생성, 페이징 & 정렬 등)을 설명해준다.

 

13장. 웹 애플리케이션과 영속성 정리

JPA를 스프링(및 J2EE) 환경에서 사용할 때 영속성 컨텍스트 및 트랜잭션의 유효 범위에 따른 주의사항들을 알려준다.

위 두 가지가 어떤 범위까지(서비스 레이어 or 요청 범위) 유효한가에 따라 지연 로딩 사용 시 주의점들을 다룬다.

특히 OSIV에 대한 학습을 할 수 있는 필수 단원이다.

 

14장. 컬렉션과 부과 기능

컬렉션 데이터를 다룰 때 JPA 내부 동작들을 설명한다. 그 외에 @Converter, 이벤트 리스너, 엔티티 그래프 기능들 알려주는데, 개인적으로는 @Converter 기능이 꼭 필요했던 기능이라 내용을 보고 실무에 바로 활용했다.

 

15장. 고급 주제와 성능 최적화

JPA에서 예외 처리방법 및 롤백 정책, 엔티티 비교 방법(동일성 & 동등성), 그리고 성능을 최적화하는 다양한 방법들을 다룬다.

 

16장. 트랜잭션과 락, 2차 캐시

가장 어려우면서도 심도 있는 파트였다. DB의 동시성 제어와 데이터 정합성을 어떻게 조정하는지 설명해준다.

트랜잭션의 고립화 수준과 동시성 제어를 위한 Lock에 대한 개념이 부족하다면 이해하기 어려운 내용이다.

2차 캐시 사용법을 알려주는데 변동이 거의 없는 데이터들에 대해서 적용하면 조금의 성능 향상을 기대할 수 있다고 한다.

 

우리는 13장을 기준으로 조금 더 내용을 살펴보자!

 

3. 내용

13장의 핵심은 OSIV이다.

 

다음은 과거 OSIV 방식과, 요즘의 Spring이 지원하는 OSIV에 대한 설명이다.

과거 방식에 어떠한 문제가 있었고, 이를 Spring이 어떤 방식으로 해결해주는지 잘 나와있다.

 

또한 동작 원리에 대한 설명 또한 상세하게 책에 나와있다.

책이 전반적으로 레퍼런스처럼 설명이 아주 잘 돼있다.

 

또한 다음과 같이 OSIV의 분명한 단점에 대하여도 설명하고 있다.

모든 기술에는 장점과 단점이 있다. 이를 잘 이해하고 균형을 잘 맞추는 것이 개발의 핵심인 것 같다.

 

대부분의 쳅터 마지막에는 다음과 같이 정리에 해당되는 부분이 있다.

 

4. 읽은 소감

4 - 1) 장점

핵심에 대한 모든 내용과 디테일 적인 부분까지 전부다 책에 담겨있다.

이 책 한권만 잘 학습하여도, 이론적인 부분에서 JPA에 대한 내용이 부족하지는 않을 것이다.

 

또한 레퍼런스 책에 가까울 정도로 표준적이며 디테일한 부분도 나와있다.

 

나처럼 강의를 통해 이미 학습한 사람도 배울 점이 많다.

물론 대부분의 내용이 인프런 강의에서 설명하신 내용인 것은 사실이지만, 자주 사용하지는 않거나, 디테일 적인 몇몇 주제들이 책에는 포함되어있다.

 

막말로 2차 캐시에 대한 내용은 강의에서는 단 한 번도 나오지 않는다.

Lock과 복합 키에 대한 내용 또한 마찬가지이다. 

 

이런 사소한 부분 또한 일단 학습을 한번 해 두면 도움이 된다. 필요한 시점에 다시 학습하면서 사용하면 될 것이다.

 

4 - 2) 단점

2022년 현시점 조금은 예전 책일 수도 있다.

그동안 JPA에서 바뀐 부분도 있고, QueryDsl 부분도 조금씩 바뀌었다.

 

나야 JPA 강의를 전부 들은 상태여서 큰 문제없이 학습하였지만, 이 책으로 처음 학습하다 보면 분명 막히는 부분들이 있을 것이다.

하지만 이런 점은 학습하면서 메워나갈 수 있는 부분이라 생각한다.

 

한마디로 명서는 명서다. 나중에라도 꼭 읽어보길 권장한다.