QueryDSL

[JPA 활용] QueryDSL 기본 Q-Type 활용 방법

juble 2024. 11. 18. 22:26

2024.11.17 - [QueryDSL] - [JPA활용] JPQL vs Querydsl - assertThat() 사용법

 

[JPA활용] JPQL vs Querydsl - assertThat() 사용법

JPQL vs Querydsl두가지를 비교하기 위한 테스트 코드이다참고로 봐주면 좋을 것 같고, 강의는 인프런에서 들으면 된다 ! ✅ assertThat() 사용법강의를 따라 코드를 작성하다보면 assertThat()을 사용하

juble00.tistory.com

저번 글에 이어 이번 글은 Q-Type 활용 방법이다. 

 

먼저, 저번에 작성했던 Test 코드를 보겠다!

반응형

✅ Q클래스 인스턴스를 사용하는 2가지 방법

1. 별칭 직접 지정

package study.querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
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 static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
@Transactional
public class QuerydslBasicTest {
    @Test
    public void startQuerydsl(){
        JPAQueryFactory queryFactory = new JPAQueryFactory(em);
        QMember m = new QMember("m"); // 별칭 직접 지정

        Member findMember = queryFactory
                .select(m)
                .from(m)
                .where(m.username.eq("member1"))
                .fetchOne();

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

위 코드는 저번에  작성했던 코드와 일치하다. 

다른 점은 Q타입에 주석을 추가해줬다!

그 이유는 주석으로 설명을 추가한 코드가 다른 방식으로도 쓸 수 있기 때문이다. 

 

2. 기본 인스턴스 사용

package study.querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
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 static org.assertj.core.api.Assertions.assertThat;
import static study.querydsl.entity.QMember.*;

@SpringBootTest
@Transactional
public class QuerydslBasicTest {
    @Test
    public void startQuerydsl(){
//        QMember m = new QMember("m"); // 별칭 직접 지정
        QMember qMember = QMember.member; //기본 인스턴스 사용

        Member findMember = queryFactory
                .select(qMember)
                .from(qMember)
                .where(qMember.username.eq("member1"))
                .fetchOne();

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

이렇게 별칭을 지정하지 않고, 바로 기본 인스턴스를 사용하여 적용할 수도 있다. 

 

어차피 기본 인스턴스를 사용하므로 굳이 선언을 하지 않겠다? 해서 queryFactory에 바로 QMember.member을 다 집어넣어도 된다. 하지만 그렇게 하면 조금 지저분해 보이므로, static import를 이용해서 간단하게 작성할 수도 있다. 

이 부분은 저번 글에 올린 assertThat() 을 바로 사용하는 것과 비슷한 개념같다. 

728x90

3. 기본 인스턴스를 static import와 함께 사용 

package study.querydsl;
import com.querydsl.jpa.impl.JPAQueryFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import study.querydsl.entity.Member;
import study.querydsl.entity.Team;

import static org.assertj.core.api.Assertions.assertThat;
import static study.querydsl.entity.QMember.*; // 추가!

@SpringBootTest
@Transactional
public class QuerydslBasicTest {
    @Test
    public void startQuerydsl(){
//        QMember m = new QMember("m"); // 별칭 직접 지정
//        QMember qMember = QMember.member; //기본 인스턴스 사용

        Member findMember = queryFactory
                .select(member)
                .from(member)
                .where(member.username.eq("member1"))
                .fetchOne();

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

 

 

✅ use_sql_comments

yml 파일에 다음 설정을 추가하면 실행되는 JPQL을 볼 수 있다.

콘솔에 표시되는 쿼리문 위에 어떤 실행을 하려는지를 주석으로 알려준다. 

## application.yml
spring.jpa.properties.hibernate.use_sql_comments : true
org.hibernate.SQL                        : 
    /* insert for
        study.querydsl.entity.Member */insert 
    into
        member (age, team_id, username, member_id) 
    values
        (?, ?, ?, ?)

org.hibernate.SQL                        : 
    /* select
        member1 
    from
        Member member1 
    where
        member1.username = ?1 */ select
            m1_0.member_id,
            m1_0.age,
            m1_0.team_id,
            m1_0.username 
        from
            member m1_0 
        where
            m1_0.username=?

HINT(주석)를 보면 실제 어떤 객체를 이용하여 INSERT/SELECT하는지에 대해 나옵니다.

728x90
반응형