Java & Spring/JPA 4

N+1문제와 Fetch 전략 - LAZY, Fetch Join, @BatchSize

1. Fetch 전략 — EAGER vs LAZY전략 동작 JPA 기본값EAGER엔티티 로드 시 연관 엔티티도 즉시 JOIN으로 함께 로드@ManyToOne, @OneToOneLAZY연관 엔티티의 프록시만 만들어두고, 실제 접근 시 추가 쿼리@OneToMany, @ManyToMany @ManyToOne과 @OneToOne의 기본값이 EAGER라는 점이 함정이다. 명시하지 않으면 조회할 때마다 연관 엔티티를 함께 JOIN해온다. 모든 연관관계는 LAZY로 두는 것이 권장된다.@ManyToOne(fetch ..

Java & Spring/JPA 2026.05.09

영속성 컨텍스트 메커니즘 - 1차 캐시 · Dirty Checking · 쓰기 지연

1. JPA와 HibernateJPA(Jakarta Persistence API) 는 자바 객체를 관계형 DB에 매핑하는 명세이다. 인터페이스와 어노테이션의 집합일 뿐, 실제 동작 코드는 없다.Hibernate 는 이 명세의 구현체다. JPA보다 먼저 존재했고, 오히려 JPA 명세가 Hibernate의 영향을 받아 만들어졌다. 구분 JPA Hibernate위치명세구현체패키지jakarta.persistence.*org.hibernate.*역할인터페이스/어노테이션 정의실제 동작 코드sprin..

Java & Spring/JPA 2026.05.09

JPA Dirty Checking과 명시적 save는 무슨 차이일까?

1. Dirty Checking이란영속성 컨텍스트는 엔티티를 처음 조회하거나 persist할 때 해당 시점의 스냅샷을 내부에 보관합니다. 트랜잭션 커밋 시점에 flush가 호출되면서 현재 엔티티 상태와 스냅샷을 필드 단위로 비교해, 변경이 있으면 자동으로 UPDATE SQL을 생성합니다. 이것이 Dirty Checking입니다.트랜잭션 커밋 ↓entity manager의 flush 자동 호출 ↓dirty checking (현재 상태 vs 스냅샷 비교) ↓변경 감지 → UPDATE SQL 생성 → DB 전송 ↓JDBC commit (영구 반영)따라서 같은 트랜잭션 내에서 엔티티를 조회하고 수정하면, save() 호출 없이도 트랜잭션 커밋 시 UPDATE가 자동으로 발생합니다.@Tran..

Java & Spring/JPA 2026.04.09

Spring Data JPA는 내부적으로 어떻게 동작할까?

1. JPA vs Spring Data JPA둘을 혼용해서 쓰는 경우가 많지만 역할이 다릅니다.**JPA (Java Persistence API)**는 자바 ORM 표준 명세입니다. 인터페이스만 정의하고, 실제 구현체는 Hibernate가 담당합니다.Spring Data JPA는 JPA 위에 얹힌 추상화 레이어입니다. JpaRepository를 상속하는 것만으로 findById(), save(), delete() 같은 기본 CRUD를 자동으로 제공합니다.Spring Data JPA ↓ JPA (인터페이스) ↓ Hibernate (구현체) ↓ JDBC ↓ DB즉, 우리가 userRepository.save(user)를 호출하면 내부적으로 Hibernat..

Java & Spring/JPA 2026.04.09