[QueryDSL] 정렬과 페이징
·
QueryDSL
데이터가 많아질수록 정렬과 페이징은 필수적인 기능이다.이번 장에서는 QueryDSL을 활용해 정렬(orderBy)과 페이징(offset, limit)을 처리하는 방법과 페이징 실제 예시를 알아볼 것이다. 1. 정렬 — orderBy()다음 조건으로 회원을 정렬한다고 가정하자.나이는 내림차순(desc)이름은 오름차순(asc)이름이 없는(null) 회원은 마지막에 정렬(nullsLast)@Testpublic void sort() { em.persist(new Member(null, 100)); em.persist(new Member("member5", 100)); em.persist(new Member("member6", 100)); List result = queryFactory ..
[QueryDSL] 결과 조회
·
QueryDSL
QueryDSL로 쿼리를 작성할 때 마지막에 붙는 fetch(), fetchOne(), fetchFirst(), fetchResults(), fetchCount() 등의 메서드는 결과를 어떻게 가져올지를 결정한다.이번 글에서는 각 메서드의 차이와 실제 동작 방식을 코드와 함께 정리해본다. fetch() - 리스트 조회List result = queryFactory .selectFrom(member) .fetch();결과를 리스트로 반환한다.조회 결과가 없으면 빈 리스트([])를 반환한다.JPQL의 getResultList()와 동일한 개념이다.가장 일반적으로 사용되는 조회 메서드다. fetchOne() - 단건 조회Member findMember = queryFactory ..
[QueryDSL] 검색 조건 쿼리
·
QueryDSL
QueryDSL의 진짜 장점은,쿼리를 자바 코드로 읽고 쓸 수 있다는 점이다. 이번 장에서는 QueryDSL로 검색 조건 쿼리(where) 를 작성하는 방법을 알아볼 것이다. 1) 기본 준비 — QueryFactory 생성QueryDSL은 JPAQueryFactory를 통해 쿼리를 작성한다.즉, JPA의 EntityManager를 기반으로 동작하기 때문에아래와 같이 QueryFactory를 초기화해야 한다.@AutowiredEntityManager em;JPAQueryFactory queryFactory;@BeforeEachvoid before() { queryFactory = new JPAQueryFactory(em);}이 한 줄이 있어야 이후 모든 QueryDSL 코드가 동작한다. 2) 예제 1..
[QueryDSL] QueryDSL과 빠른 세팅 방법
·
QueryDSL
Spring Data JPA만으로도 대부분의 서비스는 충분하다.간단한 CRUD나 단순 조회 쿼리는 메서드 이름만으로 금방 해결된다.하지만 조금만 복잡해지면 상황이 달라진다. 조건이 여러 개인 동적 쿼리,여러 테이블을 엮는 복잡한 조인,필요한 필드만 조회하는 프로젝션,그리고 성능을 위한 페치 조인까지 들어가면문자열 기반 JPQL은 한계가 금방 드러난다. 이럴 때 필요한 것이 바로 QueryDSL이다.QueryDSL은 컴파일 시점에 오류를 잡아주는 타입 안전 쿼리 빌더로,IDE 자동완성과 높은 가독성을 제공한다.즉, 복잡한 조건도 안전하고 깔끔하게 작성할 수 있다. 따라서 오늘은 QueryDSL을 빠르게 세팅하는 방법에 대해 알아볼 것이다. 1. build.gradle 설정먼저 build.gradle 파일에..
[스프링] 스프링 Data Jpa(7) 사용자 정의 리포지토리 구현
·
스프링 데이터 JPA
스프링 데이터 JPA는 정말 편리하다. 인터페이스만 선언해도 기본적인 CRUD는 물론이고, 메서드 이름만으로 쿼리를 자동 생성해주는 기능까지 제공한다.하지만 모든 상황이 이렇게만 해결되는 건 아니다.프로젝트를 진행하다 보면, 복잡한 동적 쿼리라든가 비즈니스에 특화된 로직이 필요할 때가 생긴다. 이런 경우 단순히 JpaRepository 인터페이스만으로는 한계가 있다. 그렇다고 리포지토리 인터페이스에 선언된 수많은 메서드를 직접 전부 구현하기에는 너무 복잡하고 사실상 불가능에 가깝다. 그래서 필요한 것이 바로 사용자 정의 리포지토리(Custom Repository) 기능이다. 1. 문제 상황: 직접 구현한다면?public interface MemberRepository extends JpaReposito..
[스프링] JPA에서 제공하는 쿼리 방법
·
스프링
애플리케이션에서 데이터를 다룰 때마다 SQL을 직접 작성하는 일은 생각보다 번거롭다. 쿼리가 길어질수록 가독성은 떨어지고, 테이블 구조가 바뀔 때마다 일일이 SQL을 고쳐야 한다. 여기에 객체와 테이블 사이의 변환까지 신경 써야 한다면, 코드보다 쿼리에 더 많은 시간을 쓰게 된다. JPA는 이런 상황을 줄이기 위해 등장한 기술이다. 데이터베이스와의 상호작용을 객체 중심으로 바꿔주고, 쿼리 역시 테이블이 아닌 엔티티 중심으로 작성할 수 있게 한다. JPA는 다양한 쿼리 방법을 지원하지만, 실무에서 가장 많이 사용되는 것은 JPQL이다. 그리고 성능 최적화 측면에서 자주 등장하는 Fetch Join도 함께 이해할 필요가 있다. JPA에서 제공하는 쿼리 방법JPA는 다음과 같은 방식으로 쿼리를 작성할 수 있다..