공부/Spring

[QueryDSL] QueuryDSL vs JPQL

Dr.thousand 2023. 12. 18. 10:00
728x90

JPQL(Java Persistence Query Language)은 무엇인가?
JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다. 따라서 테이블을 대상으로 하는게 아닌, 엔티티 객체를 대상으로 쿼리를 수행하는 언어이다.

QueryDSL은 무엇인가
Querydsl은 타입에 안전한 방식으로 HQL 쿼리를 실행하기 위한 목적으로 만들어졌다. 타입에 안전하도록 도메인 모델을 변경하면 소프트웨어 개발에서 큰 이득을 얻게 된다. 도메인의 변경이 직접적으로 쿼리에 반영되고, 쿼리 작성 과정에서 코드 자동완성 기능을 사용함으로써 쿼리를 더 빠르고 안전하게 만들 수 있게 된다.

JPQL의 사용방법
JPQL은 쿼리문을 직접 작성하고, 파라미터 바인딩도 직접해주어야한다.

 

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


    @BeforeEach
    void before(){
        Member member1 = Member.builder().account("test1").build();
        em.persist(member1);
        Member member2 = Member.builder().account("test2").build();
        em.persist(member2);
    }
    @Test
    void JPQL(){
        Member findMember = em.createQuery("select m from Member m where m.account = :account", Member.class)
                .setParameter("account", "test1")
                .getSingleResult();

        assertThat(findMember.getAccount()).isEqualTo("test1");
    }
}

 

QueryDSL의 사용방법
QueryDSL은 쿼리문을 직접 작성하지않고, 파라미터 바인딩을 객체의 속성값에 맞춰서 지원한다 밑의 코드에서 "m.account.eq()" 메소드에서 해당 eq는 account = #Parameter# 와 같은의미 이며 setParameter를 하지않고도 직접적으로 지정할 수 있다.

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


    @BeforeEach
    void before(){
        Member member1 = Member.builder().account("test1").build();
        em.persist(member1);
        Member member2 = Member.builder().account("test2").build();
        em.persist(member2);
    }

    @Test
    void QueryDSL(){
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);
        QMember m = new QMember("m");
        Member findMember = queryFactory
                .select(m)
                .from(m)
                .where(m.account.eq("test2"))
                .fetchOne();
        assertThat(findMember.getAccount()).isEqualTo("test2");
    }
}

 

결론
QueryDSL을 사용하는 이유는 위에 QueryDSL에 정의된 대로, "  코드 자동완성 기능을 사용함으로써 쿼리를 더 빠르고 안전하게 만들 수 있게 된다." 라는 장점이 있다. 코드 자동완성 기능을 사용하여 빠르게 만들 수 있고, 안전하다 라는 뜻은 직접적인 쿼리를 작성하지 않아 런타임에서 발생할 수 있는 에러를 빌드단계에서 알아낼 수 있기 때문이다.

728x90
반응형

'공부 > Spring' 카테고리의 다른 글

[스프링] AuditorAware  (1) 2023.11.22
[스프링]Spring Security - SecurityFilterChain  (0) 2023.11.22
[Spring] ControllerAdvice  (0) 2022.09.27
BeanFatory와 ApplicationContext  (0) 2022.03.06
스프링 IoC , DI  (0) 2022.03.03