강의

멘토링

커뮤니티

NEW
개발 · 프로그래밍

/

백엔드

고성능 Spring Persistence (High-Performance Spring Persistence)

페치 조인과 batch_fetch_size 이후, 그 다음 단계의 JPA 성능 최적화를 다루는 강의입니다. JPA 너머 Hibernate · JDBC · DB 엔진까지 — 수면 아래 레이어의 작동 원리를 이해하고, 설정 한 줄로 18배 성능 차이를 만드는 7가지 전략을 학습합니다. 조회(Read) 최적화에서 멈추지 않고, 쓰기(Write) 성능과 연관관계 함정, 프로덕션 테스트 환경까지 Spring Persistence 전체를 튜닝합니다. Java Champion이자 Hibernate 핵심 기여자인 Vlad Mihalcea가, Spring Data JPA의 한계를 해결하기 위해 직접 만든 도구와 경험을 바탕으로 가르칩니다.

29명 이 수강하고 있어요.

난이도 중급이상

수강기한 무제한

  • Vlad Mihalcea

수강 후 이런걸 얻을 수 있어요

  • 불필요한 SELECT를 제거하고, 대량 INSERT 성능을 10배 이상 개선하는 방법을 익힙니다.

  • 수백만 건의 데이터에서도 페이지 수에 관계없이 일정한 조회 속도를 유지하는 전략을 배웁니다

  • 설정 한 줄의 차이가 만드는 18배 성능 격차를, 4개 DB 벤치마크 수치로 직접 체감합니다.



글로벌 자바챔피언에게 배우는

고성능 스프링 Persistence 강의


고성능 데이터 접근 계층은, 그 아래의 데이터베이스와 호흡이 맞아야 합니다.
JPA 너머 Hibernate · JDBC · DB까지 — 데이터 접근 계층 전체를 최적화하는 여정입니다.


혹시 이런 경험, 있으신가요?


→ JpaRepository.saveAll()이 엔티티 수만큼 불필요한 SELECT를 날리는 걸 발견한 적 있나요?

→ @DynamicUpdate를 켰더니 오히려 성능이 떨어진 경험은요?

→ OFFSET 기반 페이지네이션이 뒤로 갈수록 20배 느려지는 원인을 모르겠다면?

→ 10만 건 조회 시 설정 한 줄 차이로 550ms → 30ms (18배 개선)가 가능한 걸 아시나요?

JPA는 빙산의 일각
핵심은 '수면 아래'


데이터 접근 계층이 DB와 호흡을 맞추려면,
수면 아래 Hibernate · JDBC · 데이터베이스 엔진의 작동 원리를 알아야 합니다.

이 차이가 고성능 애플리케이션과, 겨우 돌아가는 애플리케이션을 가릅니다.



강의에서 배우는 내용

스프링 성능을 잡는 7가지 최적화 전략


엔티티 매핑부터 배치 처리, 연관관계 함정, 지연 로딩, 테스트 환경까지
— Spring Persistence 성능 튜닝의 핵심 전략을 학습합니다.


성능을 고려한 데이터 모델과 식별자 설계

많은 개발자들이 @Id 어노테이션을 붙이는 것에만 집중하지만, 어떤 식별자 전략을 선택하는지가 쓰기 성능을 결정합니다. save()가 새 엔티티인데도 SELECT를 날리는 이유, 특정 ID 전략이 배치를 막는 이유를 학습합니다.

Before

흔히 쓰는 ID 전략 + save()
→ 배치 INSERT 불가, 엔티티당 1건씩 INSERT

After

ID 전략과 저장 방식 변경으로
→ JDBC 배치로 대량 INSERT 한 번에 처리


영속성 컨텍스트의 동작 원리와 Flush 메커니즘

"의도치 않은 UPDATE 쿼리가 왜 이렇게 많지?" — 'SQL이 실행되는 시점'을 더 이상 추측에 맡기지 않습니다. Dirty Checking의 내부 동작을 분석하고, @DynamicUpdate의 진짜 사용 기준을 배웁니다.

Before

@DynamicUpdate무분별 사용
→ 오히려 다른 성능 문제를 유발

After

상황별 판단 기준확립
→ 불필요한 UPDATE 제거 + 캐시 유지


JDBC 배치 처리와 Statement 캐싱

for 문 안에서 save()를 반복 호출하면 1만 건만 넘어도 끔찍한 성능 저하를 마주합니다. JPA의 기본 동작만으로는 해결할 수 없는 한계를 뛰어넘어, JDBC 배치 처리와 Statement 캐싱을 실전에 적용합니다.

Before

saveAll()호출 시 엔티티 수만큼
SELECT + INSERT 개별 실행

After

저장 메서드 교체+ JDBC Batching
→ SELECT 0건 + 배치 INSERT


N+1을 피하는 Fetch 전략

N+1 해결을 페치 조인으로 끝냈다고 생각하셨나요? 페치 조인이 해결하지 못하는 영역이 있습니다. 설정 값 하나로 대량 조회 성능이 18배 달라지는 경험을 하게 됩니다.

Before

기본 Fetch Size로 10만 건 조회
→ 550ms 소요

After

설정 한 줄 추가
→ 30ms 소요 (18배 개선)


대용량 조회를 위한 페이지네이션과 프로젝션

"전체 데이터를 조회했더니 메모리가 터져버렸어요." — OFFSET의 근본적 한계를 인정하고, 페이지 수에 관계없이 일정한 속도를 유지하는 대안을 Spring Data 환경에서 구현합니다. 꼭 필요한 컬럼만 골라 담는 프로젝션 기법도 함께 배웁니다.

Before

OFFSET 기반 페이지네이션
→ 뒤로 갈수록 20배 느려짐

After

OFFSET을 대체하는 방식으로
→ 어느 페이지든 일정한 응답 속도


연관관계 매핑의 성능 함정

연관관계를 설정하는 건 어렵지 않지만, 어떤 방식으로 매핑하느냐에 따라 불필요한 테이블이 생기거나 Lazy Loading이 무시됩니다. 실무에서 자주 마주치는 연관관계 성능 함정과 해결 패턴을 학습합니다.

Before

특정 연관관계 매핑에서 Lazy가 무시되고
→ 불필요한 테이블 + 추가 SELECT 발생

After

매핑 패턴 전환으로
→ 불필요한 테이블 제거 + Lazy 정상 작동


프로덕션 DB 기반 성능 테스트

H2로 테스트를 통과해도, 프로덕션 DB에서는 전혀 다른 결과가 나올 수 있습니다. 실제 DB 환경에서 성능 최적화를 검증하는 테스트 전략을 배웁니다.

Before

H2 인메모리 DB로 테스트
→ 프로덕션에서 성능 문제 뒤늦게 발견

After

프로덕션 동일 DB에서 테스트
→ 배포 전 성능 문제 사전 검증


페치 조인까지 해봤다면, 여기서부터 시작입니다

기본기에 한 끗 차이를 만드는 디테일을 더해, 성능 최적화의 완성도를 더하세요.

우리가 보통 하는 최적화

  • N+1 쿼리
    페치 조인

  • 컬렉션 페이징
    default_batch_fetch_size로 IN 쿼리

  • DTO 조회
    JPQL new 생성자 표현식

  • 대량 INSERT
    다루지 않음

  • save() 오버헤드
    다루지 않음

  • @DynamicUpdate
    다루지 않음

  • 연관관계 함정
    다루지 않음

  • 프로덕션 DB 테스트
    다루지 않음




Vlad의 고성능 Spring

  • N+1 쿼리
    페치 조인을 넘어선 심화 전략으로 18배 개선

  • 컬렉션 페이징
    페이지 수에 관계없이 일정한 속도 유지

  • DTO 조회
    Spring Data 전용 경량 조회 기법

  • 대량 INSERT
    설정과 전략 변경으로 배치 INSERT 활성화

  • save() 오버헤드
    엔티티 수만큼 발생하는 불필요한 SELECT 완전 제거

  • @DynamicUpdate
    켜야 할 때 vs 꺼야 할 때, 판단 기준 제시

  • 연관관계 함정
    Lazy 실패, 불필요한 테이블 생성 등 실전 함정 해결

  • 프로덕션 DB 테스트
    프로덕션 동일 환경에서 배포 전 사전 검증

이 강의를 만든 사람

전 세계 개발자들이 신뢰하는 전문가
Vlad Mihalcea


  • JPA 성능 교과서, "High-Performance Java Persistence" 저자 (아마존 평점 4.7)

  • 2017년, Oracle 선정 'Java Champion'

  • Java Persistence API(JPA) 2.1 표준 제정 참여 (JSR 338 Expert Group)

  • Stack Overflow Top 0.1% 기여자

  • Hypersistence Optimizer 개발

  • 글로벌 탑티어 IT 기업 다수 대상 JPA 성능 컨설턴트


Vlad는 단순히 Hibernate를 잘 아는 전문가가 아닙니다.
Spring Data JPA의 성능 한계를 해결하기 위해 직접 대안 라이브러리를 만든 사람입니다.
이 강의에서는 그가 왜 이 도구를 만들었는지, 어떤 문제를 해결하는지를 직접 배웁니다.


전 세계 자바 챔피언들의 추천사를 확인하세요!


Rafael Winterhalter
(Byte Buddy 창시자
Java 챔피언)

Lukas Eder
(JOOQ 창립자
Java 챔피언)

Markus Eisele
(Red Hat 기술 전도사
Java 챔피언)

JDBC를 직접 사용하든 JPA나 Hibernate를 통해서 사용하든, 그 성능 영향을 이보다 더 잘 정리한 자료는 없습니다.

이 책은 JAVA 애플리케이션으로 관계형 데이터베이스의 성능을 극한까지 끌어올리고자 하는 모든 개발자에게 필독서입니다.

Vlad는 자신의 엄청난 경험을 읽기 쉬운 책으로 담아냈고, JPA나 Hibernate를 다룬다면 반드시 읽어야 할 책입니다.



수강 전 참고 사항

현재 마지막 섹션인 'Fetching 최적화' 파트가 연재(업데이트) 중에 있습니다.
앞으로 아래와 같은 주제들이 순차적으로 다뤄질 예정이니, 학습에 참고해 주세요.

<업데이트 예정 리스트>

  • 엔티티 페칭(entity fetching)

  • 엔티티 연관관계 (FetchType.EAGER, FetchType.LAZY, LazyInitializationException, JOIN FETCH, Blaze Persistence MULTISET)

  • 스트림 처리(Stream processing)

  • Query Plan Cache

실습 환경

  • 운영체제: 윈도우, macOS, 리눅스 모두 가능

  • 필수 도구: JDK 17 이상, IntelliJ IDEA 또는 Eclipse IDE

  • 빌드 도구: Maven, Gradle

  • 권장 사양: 8GB 이상의 RAM과 충분한 디스크 공간

선수 지식 및 유의사항

  • Java 및 Spring 프레임워크 기본 지식

  • Spring Data JPA 사용 경험 (JpaRepository, @Entity)

  • 기본적인 관계형 데이터베이스(RDB) 및 SQL 지식

  • 실무에서 Spring 기반 개발 경험이 있다면 더욱 효과적입니다.

학습 자료

  • 강의 슬라이드 PDF 파일을 제공합니다.

  • 실습 코드는 GitHub 저장소를 통해 제공될 예정입니다.

  • 각 섹션 마지막에 강의 내용을 복습할 수 있는 퀴즈가 있습니다.


🔗 기존 JPA 강의와의 연관성

  • 다른 JPA 성능 강의 수강 여부는 필수가 아닙니다.

  • 수강하셨다면 심화 내용을 더 깊이 이해할 수 있는 대체가 아닌 보완 관계의 강의입니다.


  • 페치 조인, batch_fetch_size 같은 기본 최적화를 넘어선 심화 과정입니다


자주 묻는 질문

Q. 페치 조인이나 batch_fetch_size 정도는 아는데, 이 강의가 필요한가요?

네, 바로 그 지점에서 시작하는 강의입니다. 이 강의는 그 다음 단계인 쓰기(Write)와 DB 레이어 최적화를 다룹니다.

Q. 기존 「고성능 JPA & Hibernate」 강의와 뭐가 다른가요?

기존 강의는 EntityManager/Session API를 직접 사용하며 Hibernate 엔진의 내부 작동 원리를 다룹니다.
이 강의는 JpaRepository@Transactional을 사용하는 Spring Data JPA 환경에서 실제로 마주치는 성능 문제를 해결합니다.
같은 "Batching"이라는 주제라도, 기존 강의는 "JDBC Batch가 어떻게 동작하는가"를, 이 강의는 "왜 Spring Data에서 saveAll()을 해도 배치가 안 되는가"를 다룹니다.

Q. JPA/Hibernate를 어느 정도 알아야 하나요?

Spring Data JPA로 CRUD를 구현해본 경험이 있으면 충분합니다.
JpaRepository, @Entity, @Transactional을 사용해본 수준이면 모든 내용을 따라갈 수 있습니다. 기존 강의(고성능 JPA & Hibernate)를 들었다면 더 깊이 이해할 수 있지만, 필수는 아닙니다.

Q. 어떤 데이터베이스를 사용하나요?

MySQL, PostgreSQL, Oracle, SQL Server 4개 DB에서의 비교 벤치마크를 제공합니다.
H2가 아닌 실제 프로덕션 DB 환경에서 테스트하는 방법도 다룹니다.

이런 분들께
추천드려요

학습 대상은
누구일까요?

  • 기존 JPA 성능 강의를 수강한 뒤, 그 다음 단계의 성능 최적화가 필요한 분

  • 페치 조인과 batch_fetch_size 까지는 적용했는데, 그 다음에 뭘 해야 할지 모르겠는 분

  • save() 를 호출할 때마다 예상 못 한 쿼리가 나가는 걸 경험했지만 원인을 못 찾은 분

  • JPA 성능 튜닝을 해봤지만, DB 레이어까지 내려가본 적은 없는 분

  • 실무에서 대용량 데이터를 다루면서 조회뿐 아니라 쓰기 성능 까지 잡아야 하는 분

선수 지식,
필요할까요?

  • Spring Data JPA 사용 경험

  • 기본적인 Spring Framework / Spring Boot 지식

  • 기본적인 관계형 데이터베이스(RDB) 및 SQL 지식

안녕하세요
입니다.

1,298

수강생

74

수강평

4.5

강의 평점

3

강의

My name is Vlad Mihalcea, and I’m a Java Champion. I wrote the High-Performance Java Persistence book, which became one of the best-selling Java books on Amazon.

 

I'm currently developing the amazing Hypersistence Optimizer, and in my free time, I develop various open-source projects (e.g., Hypersistence Utils and FlexyPool) and answer questions on StackOverflow.

 

저는 Java 챔피언이자 Hibernate ORM 프로젝트의 주요 기여자입니다. Hypersistence Optimizer 도구를 만들었으며, 이 도구는 애플리케이션 구성과 매핑을 스캔하여 데이터 액세스 계층 속도를 향상시키는 데에 필요한 변경 사항을 알려주는 도구입니다.

StackOverflow에서 Hibernate, Java, JPA 태그에 관련된 수천 개의 질문에 답변하며 골드 배지를 획득했습니다.

흥미로운 것을 발견하면 개인 블로그에 공유하는 것을 좋아합니다. 그는 오픈 소스 소프트웨어를 신뢰하며, 모든 개발자가 어떤 방식으로든 참여해야 한다고 생각합니다.

적절한 도구를 찾지 못하면 Hypersistence UtilsFlexyPool과 같은 새로운 오픈 소스 프로젝트를 시작하기도 합니다.

커리큘럼

전체

33개 ∙ (5시간 17분)

해당 강의에서 제공:

수업자료
강의 게시일: 
마지막 업데이트일: 

수강평

아직 충분한 평가를 받지 못한 강의입니다.
모두에게 도움이 되는 수강평의 주인공이 되어주세요!

얼리버드 할인 중

월 ₩28,050

5개월 할부 시

50%

₩280,500

₩140,250

Vlad Mihalcea님의 다른 강의

지식공유자님의 다른 강의를 만나보세요!

비슷한 강의

같은 분야의 다른 강의를 만나보세요!