Spring Data/Query DSL
QueryDSL 페이징 처리
바로 전 포스팅인 https://yeo-computerclass.tistory.com/413에서 작성한 코드에 이어 페이징 처리를 실습해보겠습니다. Querydsl 페이지 연동 QueryDSL Custom Repository 인터페이스에 페이지 추가 public interface MemberRepositoryCustom { List search(MemberSearchCondition condition); Page searchPage(MemberSearchCondition condition, Pageable pageable); } searchPage() public Page searchPageSimple(MemberSearchCondition condition, Pageable pageable) { Lis..
QueryDSL Spring Data JPA + 동적 쿼리
Repository 작성 Repository 구성 MemberRepository public interface MemberRepository extends JpaRepository, MemberRepositoryCustom{ // select m from Member m where m.username = ? List findByUsername(String username); } MemberRepositoryCustom public interface MemberRepositoryCustom { List search(MemberSearchCondition condition); } Query DSL로 만들 동적 쿼리인 search 메서드 MemberTeamDto 조회할 Member와Team 정보를 추출하기 위..
QueryDSL 벌크 쿼리
벌크 연산 한 번에 여러 데이터를 수정 혹은 삭제하는 것을 의미합니다. 영속성 컨텍스트를 무시하고 바로 DB에 반영합니다. 영속성 컨텍스트와 DB의 상태가 달라지게 된다는 의미 벌크 연산으로 대량의 데이터를 수정한 후 fetch()로 데이터를 조회했을 때 변경된 DB에서 값이 아닌 이미 영속성 컨텍스트에 존재하는 데이터를 가져오는 문제가 발생합니다. 벌크 연산 이후 변경된 값을 가져오기 위해 EntityManager.flush()와 EntityManager.clear()를 통해서 영속성 컨텍스트 값을 버려야 합니다. 대량 데이터 수정 // 20살보다 어리면 비회원으로 변경하기 long count = jpaQueryFactory .update(member) .set(member.username, "비회원"..
QueryDSL 동적 쿼리
JPA에서 동적 쿼리를 해결하는 방법 조건에 따라 문자열을 만들어 query문을 만들고 파라미터를 주는 방법 JPA Criteria (JPA 표준 스펙) Query DSL를 통한 동적 쿼리 생성 Query DSL 동적 쿼리 만드는 방법 BooleanBuilder Where 다중 파라미터 사용 1. BooleanBuilder @Test void dynamicQueryUsingBooleanBuilder(){ String usernameParam = "member"; Long ageParam = 10; List result = searchMember(usernameParam, ageParam); assertThat(result.size()).isEqualTo(1); } private List searchMem..
QueryDSL DTO에 값 담기
DTO에 값 담는 방법 프로퍼티 접근 (setter 사용) 필드 접근 생성자 이용 @QueryProjection 어노테이션 1. 프로퍼티 접근 List result = jpaQueryFactory .select(Projections.bean(MemberDto.class, member.username, member.age)) .from(member) .fetch(); Projection.bean ( Class, {field, ... } ) 이 메소드를 사용하면 기본 생성자와 setter를 통해서 객체를 만듭니다. 때문에 DTO에 setter, getter를 설정해주어야 합니다. 2. 필드 접근 List result = jpaQueryFactory .select(Projections.fields(Member..
QueryDSL 문법
조건 쿼리 import static com.example.querydsl.entity.QMember.member public List findAllMemberByNameAndAge(String username, Integer age) { return jpaQueryFactory.selectFrom(member) .where(member.username.eq(username) .and(member.age.eq(age))) .fetch(); } 검색 조건을 추가(and, or)할 때 체인 형식으로 합니다. 파라미터로 null 값이 들어오면 해당 문법 member.username.eq("member")// username = "member" member.username.ne("member")//username..
QueryDSL Spring Data JPA 같이 적용하기
DB를 객체지향적으로 다룰 수 있는 JPA를 사용하면 간단한 작업(ex. CURD)을 할 때는 편리하다는 생각을 했습니다. 하지만 테이블들이 많은 환경에서는 join을 해야 하거나 서브쿼리를 만들어야 하는 경우가 많아지고, Query가 점점 길어지면서 JPA만으로는 작업하기 까다롭겠다는 생각을 하였습니다. 이에 대한 해결 방안으로 JPA와 MyBatis를 같이 사용하여 복잡한 쿼리는 MyBatis로 해결하였지만 실무에서는 JPA + QueryDSL을 사용한다 하여 QueryDSL에 관한 공부 하며 포스팅하려 합니다. QueryDSL 쿼리를 자바 코드로 작성할 수 있도록 해줍니다. 자바 코드로 작성하기 때문에 개발자들도 쉽게 작성할 수 있고 문법 오류도 컴파일 시에 알 수가 있습니다. 데이터 조회 기능에 ..