Spring/QueryDSL
[QueryDSL] 활용 (Spring Data JPA + QueryDSL)
[QueryDSL] 활용 (Spring Data JPA + QueryDSL)
2023.01.11웬만한 기능은 Spring Data JPA가 제공해주고, 동적 쿼리 등 복잡한 구현이 필요할 때 QueryDSL 기술을 사용한다. 따로 Repository를 하나 만들어서 기능을 구현하자. MemberRepositoryCustom을 인터페이스로 만들고 구현할 기능을 선언한 후 MemerRepositoryImpl에 기능을 구현한다. public class MemberRepositoryImpl implements MemberRepositoryCustom { private final JPAQueryFactory queryFactory; public MemberRepositoryImpl(EntityManager em) { this.queryFactory = new JPAQueryFactory(em); } @Ov..
[QueryDSL] 활용 (JPA + QueryDSL)
[QueryDSL] 활용 (JPA + QueryDSL)
2023.01.11실제로 애플리케이션을 설계할 때는 Repository 계층을 만들고 Repository를 통해 데이터베이스와 상호작용한다. 먼저 Spring Data JPA 기술 없이 순수 JPA와 QueryDSL 만 사용해서 Repository를 설계해보자. @Repository public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public MemberJpaRepository(EntityManager em) { this.em = em; this.queryFactory = new JPAQueryFactory(em); } public void save(Member member..
[QueryDSL] 중급 문법
[QueryDSL] 중급 문법
2023.01.101. 프로젝션 프로젝션 대상이 하나인 경우 대상 타입을 명확하게 지정할 수 있다. 제네릭스를 String으로 설정하고 값을 받아온다. (객체도 가능) 프로젝션 대상이 둘 이상인 경우 QueryDSL이 제공하는 Tuple 자료구조나 DTO를 따로 정의해서 반환값을 가져올 수 있다. 왼쪽은 Tuple을 사용하는 예시이다. 일단은 Tuple도 QueryDSL에 종속적인 타입이기 때문에, 바깥 계층으로 반환될 때를 생각하면 DTO를 사용하는 편이 합리적이다. (Repository 내부에서만 사용하는 경우는 괜찮다) JPA를 사용할 때 DTO를 따로 정의해서 반환값을 가져오려면 new 명령어를 사용해 DTO의 생성자를 호출하는 방식을 사용해야 한다. QueryDSL 기술을 사용하면 좀 더 간단하게 처리할 수 있다..
[QueryDSL] 기본 문법
[QueryDSL] 기본 문법
2023.01.09QueryDSL은 Query Domain Specific Language의 약자로 간단하게 JPQL을 만들어주는 역할을 한다고 생각하면 된다. @Test public void startJPQL() { String qlString = "select m from Member m " + "where m.username = :username"; Member findMember = em.createQuery(qlString, Member.class) .setParameter("username", "member1") .getSingleResult(); assertThat(findMember.getUsername()).isEqualTo("member1"); } @Test public void startQuerydsl..