JPQL



SELECT u FROM User u; // 전체 유저 객체 조회
SELECT u.username FROM User u; // 특정 필드만 조회
SELECT u FROM User u WHERE u.age > 20;
SELECT u FROM User u ORDER BY u.age DESC;
SELECT * FROM orders o JOIN user u ON o.user_id = u.id WHERE u.username = 'KIM';
EAGER vs LAZY 로딩

@Query("SELECT p FROM Post p JOIN FETCH p.comments WHERE p.user.username = :username")
List<Post> findAllWithCommentsByUsername(@Param("username") String username);
컬렉션 페이징 불가
여러 컬렉션 Fetch Join 금지
중복 제거 필요
Hibernate 설정을 통해 컬렉션 또는 연관된 엔티티들을 배치로 로딩할 수 있게 해주는 기능입니다.
JPA에서는 LAZY 로딩 전략이 기본이기 때문에 연관된 엔티티들을 개별 쿼리로 가져오며,
이로 인해 N+1 문제가 발생할 수 있습니다.
BatchSize는 이러한 상황에서 Hibernate가 여러 엔티티를 한 번에 조회할 수 있도록 돕는 설정입니다.
즉, LAZY 전략을 유지하면서도 IN 절을 활용한 일괄 조회가 가능해집니다.
spring:
jpa:
properties:
hibernate:
default_batch_fetch_size: 100 @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) // ← 지연 로딩!
@BatchSize(size = 100)
private List<Post> posts = new ArrayList<>();BatchSize 크기
Fetch Join과 병행 사용
LAZY 유지 조건
@EntityGraph(attributePaths = {"posts"})
@Query("SELECT u FROM User u")
List<User> findAllWithPosts();
@Query("SELECT new com.example.dto.UserDto(u.username, u.age) FROM User u")
List<UserDto> findAllUserDto();
N+1 문제 발생 시 찾아가겠습니다