기록을 불러오고 있습니다.
기록을 불러오고 있습니다.
LAB 01 / JPA · Performance
엔티티 수를 바꾸고, 지연 로딩과 Fetch Join의 SQL 실행 흐름을 비교합니다.
앨범 목록 조회는 한 번인데, 사진을 읽는 순간 추가 SQL이 이어집니다. 데이터가 늘어날수록 DB 왕복이 늘고 응답이 느려질 수 있습니다.
지연 로딩된 photos 컬렉션을 앨범마다 접근하기 때문입니다. 빈 영속성 컨텍스트에서 단일 컬렉션을 전부 읽는 모델은 루트 1회 + 앨범 수 N회로 표현됩니다.
설정을 바꾸면 재생이 초기화됩니다. 자동 재생하거나 한 단계씩 실행해 보세요.
select a.* from album a;select p.* from photo p where p.album_id = 1;select p.* from photo p where p.album_id = 2;select p.* from photo p where p.album_id = 3;select p.* from photo p where p.album_id = 4;select p.* from photo p where p.album_id = 5;select p.* from photo p where p.album_id = 6;select p.* from photo p where p.album_id = 7;select p.* from photo p where p.album_id = 8;select p.* from photo p where p.album_id = 9;select p.* from photo p where p.album_id = 10;select p.* from photo p where p.album_id = 11;select p.* from photo p where p.album_id = 12;| 전략 | SQL 수 | 고려할 점 |
|---|---|---|
| Lazy Loading | 13 | 연관 컬렉션 접근마다 추가 조회 |
| Fetch Join | 1 | 컬렉션 페이징·중복 행 주의 |
| Batch Fetch | 3 | IN 크기와 데이터량 고려 |
교육용 모델: 빈 영속성 컨텍스트에서 앨범당 하나의 photos 컬렉션을 모두 접근합니다. 캐시·네트워크·DB 실행시간을 측정하지 않습니다. Fetch Join 1회와 실제 프로젝트의 4회는 서로 다른 조회 범위입니다.
각 번호는 하나의 앨범입니다. SQL이 실행될 때 사진을 읽은 앨범이 강조됩니다. Fetch Join은 한 번에, Batch Fetch는 10개씩 묶어 읽습니다.
같이 쓸 데이터를 한 번에 읽습니다. 컬렉션 조인 행 증가, 여러 컬렉션 조인, 페이징 시 메모리 비용을 확인해야 합니다.
지연 로딩을 유지하며 IN 쿼리로 묶습니다. 쿼리가 남지만 페이징 조회와 조합할 수 있습니다. 배치 크기와 실제 데이터 분포를 함께 측정합니다.
원리를 설명하는 코드입니다. 실제 프로젝트 원본과 구분하며, 엔티티·도메인 타입·import 일부는 생략했습니다.
@Transactional(readOnly = true)
public List<AlbumResponse> findAll() {
return albumRepository.findAll().stream()
.map(album -> new AlbumResponse(
album.getId(), album.getPhotos().size()))
.toList(); // photos 접근 시 추가 SELECT 가능
}public interface AlbumRepository extends JpaRepository<Album, Long> {
@Query("select distinct a from Album a left join fetch a.photos")
List<Album> findAllWithPhotos();
}
// 단일 컬렉션 예제. 컬렉션 페이징과 여러 컬렉션 조인은 별도 검토.spring:
jpa:
properties:
hibernate:
default_batch_fetch_size: 10
# 설명용 설정. 실제 크기는 IN 제한과 데이터 분포로 검증합니다.출처: 작성자가 제공한 NEMO 측정 결과. 시뮬레이션 값이 아닙니다. 하드웨어·데이터 규모·반복 횟수·측정 도구·격리 수준·측정일과 원본 보고서는 추가 기록이 필요합니다. 다른 환경에서 같은 결과를 보장하지 않습니다.
Hibernate 버전, 영속성 컨텍스트 캐시, 컬렉션 매핑과 접근 패턴에 따라 실제 SQL은 달라집니다. 쿼리 수만이 아니라 반환 행 수·실행 계획·메모리·p95를 확인하세요.