본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


반응형

JPA/QueryDSL

(13)
QueryDSL 공부 11 - Spring data JPA 와 Querydsl 페이징 연동 Spring Data 의 Pageble 과 Page를 Querydsl과 함께 사용하는 것을 알아보려 한다. 간단한 방법과 성능최적화를 위한 방법 두가지 방법을 알아보자 public interface MemberRepositoryCustom { Page searchPageSimple(SearchCond searchCond, Pageable pageable); Page searchPageComplex(SearchCond cond, Pageable pageable); } 사용자 정의 리파지토리이다, SpringData에서 Pageable은 페이지 요청에 대한 데이터를 담을때 사용하는 인터페이스이다. 응답할때는 Page를 사용한다. 위의 두 메서드를 구현하는 구현클래스이다 @RequiredArgsConstruc..
QueryDSL 공부 9 - 동적쿼리 성능 최적화 (Builder 와 where 절 동적쿼리) 이전에 BooleanBuiler와 where 절 을 통해 동적쿼리를 만드는 방법을 알아 봤었는데 실제 repository에서 동적 쿼리와 Dto 조회를 함께 사용하는 방법을 알아보자 일단 두가지 방법에 공통적으로 사용될 검색 키워드를 담을 SearchCond 라는 Dto와 반환되는 데이터를 담을 MemberTeamDto를 만들었다 MemberTeamDto @Data public class MemberTeamDto{ private Long memberId; private int age; private String username; private String teamName; @QueryProjection public MemberTeamDto(Long memberId, int age, String usern..
QueryDSL 공부 10 - Spring data JPA 에서 QueryDsl활용 Spring data JPA는 인터페이스로 동작하기 때문에 직접 구현 코드를 작성해서 사용하려면 사용자정의 인터페이스를 만들어 구현해야한다. MemberRepository package com.querydsl.study.repository; import com.querydsl.study.domain.Member; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; public interface MemberRepository extends JpaRepository ,MemberRepositoryCustom{ List findByUsername(String username); } 먼저 Spring data J..
QueryDSL 공부 8 - Repository에서 활용 지금까지는 Test 코드로만 QueryDs을 사용했는데 실제 Repository에서 사용해보려 한다 . 비교를 위해 JPQL로 만든 repository 메서드와 querydsl로 만든 메서드를 비교해보자 먼저 리파지토리에 JPAQueryFactory를 등록하는 2가지 방법을 알아보자 1. 생성자에서 직접 생성하여 주입 @Repository public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public MemberJpaRepository(EntityManager em) { this.em = em; this.queryFactory = new JPAQueryFac..
QueryDSL 공부 7 - 수정 , 삭제 벌크성 쿼리 JPA에서는 주로 변경감지(dirty checking)을 통해 데이터의 update 가 일어나는데 이 경우에는 개별 엔티티에 대해서 건마다 쿼리가 나가기 때문에 쿼리 한번으로 대량 데이터를 수정할 때는 벌크연산을 사용한다 . QueryDsl에서 벌크연산 하는 방법을 알아 보자 1. 모든엔티티의 특정 컬럼을 변경하고 싶을때 @Test public void bulk_update(){ long count = qf .update(member) .set(member.username, "비회원") .where(member.age.lt(20)) .execute(); em.flush(); em.clear(); List fetch = qf.selectFrom(member).fetch(); for (Member membe..
QueryDSL 공부 6 - 동적쿼리 (booleanBuilder) QueryDsl 에서 동적 쿼리를 해결하는 두가지 방식 - BooleanBuilder -where절에 조건으로 사용 1. BooleanBuilder 를 통한 동적 쿼리 private List searchMember1(String usernameParam, Integer ageParam) { BooleanBuilder builder = new BooleanBuilder(); if(usernameParam != null){ builder.and(member.username.eq((usernameParam))); } if(ageParam != null){ builder.and(member.age.eq((ageParam))); } return qf .selectFrom(member) .where(builder)..
QueryDSL 공부 5 - 프로젝션과 결과 반환 프로젝션이란 select 절에 대상을 지정하는 것을 말한다 . 프로젝션 대상이 하나일 경우 반환 타입이 명확하게 지정되지만 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회해야한다 . 단일 프로젝션 조회 @Test void projection_one(){ List fetch = qf .select(member.username) .from(member) .fetch(); for (String s : fetch) { System.out.println("s = " + s); } } 단일 타입이기 떄문에 반환타입이 명확하다 . Tuple 조회 @Test void tuple_projection(){ List fetch = qf .select(member.username, member.age) .from(memb..
QueryDSL 공부 4 - QueryDSL 활용2 (join문) 1. 기본 조인 @Test void join(){ List teamA = qf .selectFrom(member) .join(member.team, team) .where(team.name.eq("teamA")) .fetch(); assertThat(teamA).extracting("username").containsExactly("member1","member2"); } 팀 이름이 teamA인 회원의 이름을 모두 조회하는 쿼리이다 . join() 메서드의 첫번째 파라미터로는 외래키가 되는 필드를 , 두번째 파라미터로는 조인할 엔티티의 Q - Type을 적어준다 ,inner 조인 ,outer 조인 모두 사용 가능하다. (위의 코드는 모두 static import를 한 상태이기 때문에 위와 같이 사용이 가..

반응형