Post

QueryDSL

QueryDSL이란?

QueryDSL은 쿼리생성에 특화된 프레임워크를 의미합니다.

JPA는 객체지향어플리케이션과 관계형DB 사이의 패러다임 불일치를 해결하는 프레임워크입니다.

개발자는 객체지향 관점으로 개발하고, JPA는 자동으로 SQL 쿼리문을 생성합니다.

SQL문이 자동으로 생성되니 개발자는 SQL 관점 프로그래밍을 하지 않아도 됩니다.

하지만 완전한 분리는 불가능하기 떄문에 JPAJPQL을 지원합니다

하지만 JPQL도 두가지 문제가 있습니다.

  1. 타입안전성이 떨어집니다.

    -> JPQL은 문자열이기 때문에 문법이 틀려도 컨파일 과정에서 알아차리지 못합니다.

  2. 직관적인 동적쿼리 작성이 어렵습니다.

    -> 동적쿼리를 작성하려면 문자열을 조작하는 방식으로 로직을 구성해야 합니다.

    따라서 문자열과 문자열 사이에 if-else문이나 for문 같은 코드가 들어가 가독성을 떨어트립니다.

image

QueryDSL 동작원리

image

QueryDSL의 목적은 JPQL 생성입니다.

개발자는 QueryDSL이 JPQL을 생성할 수 있도록 필요한 데이터를 세팅하여 전달해야 하기 때문에

Entity 정보가 필요합니다. 하짐나 Entity는 JPA프레임워크에서 지원하는 모듈입니다.

QueryDSL은 쿼리생성에 특화된 프레임워크로, JPA 프레임워크와 분리되어 있습니다.

따라서 다른 프레임워크의 모듈을 그대로 사용하면 JPA프레임워크에 종속되어버립니다.

이런 현상을 막고자, QueryDSL은 Entity 정보를 담은 Q타입클래스를 사용합니다.

개발자는 Q타입객체를 생성하여 JPQL 생성에 필요한 데이터를 QueryDSL 프로세스에 넘길 수 있습니다.

QueryDSL 작성예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public List<Member> searchMember(MemberSearchCondition condition){
    QMember qMember = QMember.member; //Q타입 클래스 객체 생성

    return queryFactory
            .select(qMember) // select 메소드
            .from(qMember) // from 메소드
            .leftJoin(member.team, team) // leftJoin메소드
            .where( // where 메소드
                    usernameEq(condition.getUsername()), 
                    teamNameEq(condition.getTeamName()),
                    ageGoe(condition.getAgeGoe()),
                    ageLoe(condition.getAgeLoe())
            )
            .fetch(); //fetch메소드
}

This post is licensed under CC BY 4.0 by the author.