본문 바로가기

Spring/Querydsl

Querydsl- Jpql과 Querydsl 비교

JpaQueryFactory

public class QuerydslStudy{
	
    @Autowired
    private EntityManager em;
    
    // JpaQueryFacotry 생성
    JpaQueryFactory queryFactory = new JpaQueryFactory(em); 인자로 EntityManager를 받음
}

 기본적으로 JPQL을 사용하기 위해서는 EntityManager가 필요한 것 처럼, Querydsl을 사용하기 위해서는 JpaQueryFacotry가 필요하다. JpaQueryFactory를 선언하기 위한 방법은 위와 같다.

 

테스트 코드로 JPQL과 Querydsl 비교하기

package study.querydsl;

import com.querydsl.jpa.impl.JPAQuery;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Member;
import study.querydsl.entity.QMember;
import study.querydsl.entity.Team;

import javax.persistence.EntityManager;
import java.util.List;

import static org.assertj.core.api.Assertions.*;

@SpringBootTest
@Transactional
public class QuerydslBasicTest {
    @Autowired
    EntityManager em;

    @BeforeEach //각 테스트마다 데이터 주입
    public void each(){
        Team teamA = new Team("teamA");
        Team teamB = new Team("teamB");
        em.persist(teamA);
        em.persist(teamB);

        Member member1 = new Member("member1", 10, teamA);
        Member member2 = new Member("member2", 20, teamA);

        Member member3 = new Member("member3", 30, teamB);
        Member member4 = new Member("member4", 40, teamB);
        em.persist(member1);
        em.persist(member2);
        em.persist(member3);
        em.persist(member4);
    }

    @Test
    public void startJpql() throws Exception{
        Member findMember = em.createQuery(
                "select m from Member m where m.username = :username",
                        Member.class)
                .setParameter("username", "member1")
                .getSingleResult();

        assertThat(findMember.getUsername()).isEqualTo("member1");
    }

    @Test
    public void startQuerydsl() throws Exception{
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);
        QMember m = new QMember("m"); // 별칭에 아무거나 넣어도 된다.(사실 이렇게 말고 QMember.member 쓸거임)

        Member findMember = queryFactory
                .select(m)
                .from(m)
                .where(m.username.eq("member1"))  // 파라미터 바인딩 처리
                .fetchOne();

        assertThat(findMember.getUsername()).isEqualTo("member1");
    }
}

Querydsl을 사용하면 sql문을 작성하지 않고도 자바 코드로 쿼리를 작성하는 것이 가능하다.  굳이 별도의 파라미터 바인딩을 처리하지 않아도 파라미터 바인딩이 자동 처리되고, 무엇보다 장점은 JPQL의 경우 sql 쿼리에 오타가 존재하거나 오류가 있는 경우 실제로 그 코드가 실행되는 런타임 시점에 오류가 체크되는데, Querydsl의 경우 모든 것이 자바 코드로 구성이 되어있기 때문에 컴파일 시점에 에러 체킹이 된다. 

 

Querydsl 조건

member.username.eq("member1") // username = 'member1'
member.username.ne("member1") //username != 'member1'
member.username.eq("member1").not() // username != 'member1'
member.username.isNotNull() //이름이 is not null
member.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, 30
member.age.goe(30) // age >= 30
member.age.gt(30) // age > 30
member.age.loe(30) // age <= 30
member.age.lt(30) // age < 30
member.username.like("member%") //like 검색 
member.username.contains("member") // like ‘%member%’ 검색 
member.username.startsWith("member") //like ‘member%’ 검색 ...

'Spring > Querydsl' 카테고리의 다른 글

Querydsl- 조인  (0) 2023.07.27
Querydsl- 집합  (0) 2023.07.26
Querydsl- 정렬과 페이징  (0) 2023.07.25
Querydsl- Q 인스턴스  (0) 2023.07.22
Querydsl- build.gradle 설정  (0) 2023.07.22