JAVA/JPA27 [QueryDSL] CountQuery 최적화 - PageableExecutionUtils PageableExecutionUtils는 Spring Data에서 제공하는 효율적인 페이징 처리를 도와주는 클래스입니다. 특히 getPage() 메소드는 데이터를 가져올 때 상황에 따라 최적화하여 성능에 큰 도움이 됩니다. 일단 핵심이 되는 getPage()메소드에 들어가는 인자를 분석해 보겠습니다.public static Page getPage(List content, Pageable pageable, LongSupplier totalSupplier) { ....}content: 한 페이지에 있는 데이터pageable: 페이징 관련 정보를 담고 있는 Pageable 객체입니다. 이 객체는 현재 페이지 번호, 페이지 크기 등 여러 정보를 가지고 있습니다.totalSupplier: 데이터의 총개수를 반.. 2025. 2. 7. [QueryDSL] fetchResults(), fetchCount() 대안 - QeuryDSL 5.0.0 버전 이후 fetchResults()와 fetchCount()는 페이징처리나 카운트 쿼리를 작성할 때 자주 사용되는 메서드입니다. 이 두 메서드는 페이징 유용하지만 QeuryDSL 5.0.0 이후에는 지원 중단(deprecated)되었다고 공식 사이트에 올라왔습니다. 이 메소드들은 왜 중단이 되었고 어떻게 대처할지 알아보겠습니다. fetchResults()와 fetchCount()의 역할 fetchResults(): 페이징 처리된 결과 리스트 + 전체 결과 수를 반환하는 메서드fetchCount(): 쿼리의 결과 행(row) 수를 반환하는 메서드 fetchResults()와 fetchCount()의 지원 중단 이유fetchResults()와 fetchCount()가 지원 중단된 이유는 여러 가지가 있습니다. .. 2025. 2. 5. [QueryDSL] QueryDSL 문법 #4 - 동적 쿼리 초기 설정더보기@SpringBootTest@Transactionalpublic class QuerydslTest { @Autowired EntityManager em; JPAQueryFactory queryFactory; @BeforeEach public void beforeEach() { queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("mem.. 2025. 2. 2. [QueryDSL] QueryDSL 문법 #3 - DTO 반환 방법 이번 포스팅해서 기본 문법보다 조금 어려운 문법을 다룰 예정이라서 기본 문법은 아래 링크를 참조해주세요https://pjstudyblog.tistory.com/110 DTO 반환 방법1. 프로퍼티 접근 - Projections.bean()List result = queryFactory .select(Projections.constructor(MemberDto.class, member.username, member.age)) .from(member) .fetch();Projections.bean()는 setter 프로퍼티가 있으면 setter를 통해서 접근을 하고 setter가 없다면 리플렉션으로 접근합니다. 2. 필드 접근 - Projections.fields(.. 2025. 2. 1. [QueryDSL] Spring Data JPA + QueryDSL 기본 문법 #2 - from절에 서브쿼리 사용 문제 해결 ≣ 목차 조건 문법SQL에서 제공하는 기본적인 조건식을 제공합니다.member.username.eq("member1") // username = 'member1'member.username.ne("member1") //username != 'member1'member.username.eq("member1").not() // username != 'member1'member.username.isNotNull() //이름이 is not nullmember.age.in(10, 20) // age in (10,20)member.age.notIn(10, 20) // age not in (10, 20)member.age.between(10,30) //between 10, 30member.age.goe(30) // .. 2025. 1. 30. [QueryDSL] Spring Data JPA + QueryDSL 설정 #1 JPQL / Spring Data JPA 문제점JPA는 데이터 접근 기술과 상관없이 쿼리를 작성할 수 있으며, JPQL은 JPA에서 사용하는 객체 지향 쿼리 언어로, SQL과 유사하지만 데이터베이스 테이블이 아닌 엔티티 객체를 기반으로 쿼리를 작성하기 때문에 데이터베이스 매커니즘이 아닌 엔티티를 이용해 객체 지향적으로 코드를 작성할 수 있습니다. Spring Data JPA은 JPA 기반의 Repository 인터페이스를 제공해 CRUD을 직접 작성할 필요 없이 간단하게 구현할 수 있습니다. 그러나 동적 쿼리를 작성할 때 코드가 복잡해지며, 코드에 문제가 있을 경우 애플리케이션 실행 후 해당 메소드를 실행할 때 오류를 발견할 수 있다는 큰 단점이 있습니다. 이는 컴파일 타임에 오류를 잡을 수 없는 점을 .. 2025. 1. 22. [JPA] OSIV(Open Session In View) 패턴 이해 https://pjstudyblog.tistory.com/75 [Spring Boot] spring.jpa.open-in-view is enabled by default 경고 메시지JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning 해당 경고 메시지는pjstudyblog.tistory.com위에 포스팅에서는 OSIV패턴에 문제점을 해결하려면 JPA를 열심히.. 2024. 12. 16. [JPA] JPA 컬렉션 조회 성능 최적화 #3 - JPA에서 DTO 직접 반환 @BatchSize의 단점은 데이터베이스의 부하, 메모리 사용량의 동일성 등등 있습니다. @BatchSize을 1000으로 설정하면 한 번에 1000개의 데이터를 DB에서 애플리케이션으로 불러오게 되어 DB에 순간적으로 큰 부하가 발생할 수 있지만, 100으로 설정하면 10번의 쿼리를 통해 데이터를 가져와 부하가 분산될 수 있습니다. 하지만 애플리케이션은 전체 데이터를 로딩해야 하므로 메모리 사용량은 동일하며, 1000으로 설정하는 것이 좋을 수 있지만 DB와 애플리케이션 모두 순간 부하를 얼마나 견딜 수 있는지가 중요합니다. 그럼 DB, 애플리케이션에 많은 부하를 주지 않고 많은 데이터를 어떻게 한번에 처리하는지 알아보겠습니다. DTO 및 엔티티 코드더보기@Entity@Getter@Setterpub.. 2024. 12. 14. [JPA] JPA 컬렉션 조회 성능 최적화 #2 - @BatchSize xxToMany 관계인 컬렉션을 조회할 때 성능을 최적화 및 N+1 문제를 해결하기 위해 fetch join을 사용한 경우 다음과 같은 두 가지 단점이 있습니다. 이 단점을 @BatchSize를 사용하면 한 번에 해결할 수 있습니다. 1. 컬렉션을 페치 조인하면 메모리에서 페이징을 시도합니다. 만약 데이터 수가 많은 경우 메모리 부족으로 인해 오류가 발생할 수 있습니다.2. 컬렉션 2개 이상 페치 조인하면 MultipleBagFetchException 예외가 발생 엔티티 코드더보기@Entity@Getter@Setterpublic class Order { @Id @GeneratedValue @Column(name = "order_id") private Long id; @ManyT.. 2024. 12. 14. [JPA] JPA 성능 최적화 #1 - fetch join JPQL에서 fetch join을 사용하면 관련된 모든 속성이 select 절에 들어옵니다. 그리고 select 절에서는 fetch join을 사용한 엔티티의 속성을 직접 명시할 수 없습니다. 이로 인해 select 절에 많은 속성이 포함되면 성능 저하가 발생할 수 있습니다. 그렇다고 지연 로딩에서는 N+1 문제가 발생할 수 있기 때문에 fetch join을 사용해야 합니다. 그럼 fetch join을 사용하되 select 절에 원하는 속성만 사용하는 방법에 대해서 알아보겠습니다. 최적화 전return em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.delivery d", Order.class) .ge.. 2024. 12. 10. 이전 1 2 3 다음