QueryDSL

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

juble 2024. 11. 17. 13:14

JPQL vs Querydsl

두가지를 비교하기 위한 테스트 코드이다

참고로 봐주면 좋을 것 같고, 강의는 인프런에서 들으면 된다 !

 

✅ assertThat() 사용법

강의를 따라 코드를 작성하다보면 assertThat()을 사용하시길래 따라하려고 했더니 다음과 같이 빨간 줄이 뜨면서 사용이 되지 않는 것을 발견했다. 

그래서 같은 오류가 생길까봐 해결 방법을 공유하려고 한다. 

assertThat()

 

✅ assertThat() 해결 방법

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

위 한 줄만 추가해주면 된다 !

 

 

이 구문은 Assertions 클래스의 특정 메서드인 assertThat을 정적(static)으로 가져오는 구문으로,

코드를 작성할 때 클래스명을 생략하고 assertThat을 바로 사용할 수 있다는 특징이 있다.

 

 

반응형

✅ JPQL vs Querydsl

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 {
    @PersistenceContext
    EntityManager em;

    @BeforeEach
    public void before() {

        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(){
        // member1을 찾아라
        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(){
        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");
    }
}

 

 

1. JPQL (Java Persistence Query Language)

JPQL은 JPA에서 지원하는 쿼리 언어로, SQL과 비슷하지만 Entity 객체를 대상으로 쿼리를 작성합니다.

  • 특징:
    • 문자 기반 쿼리 작성:
      • JPQL은 쿼리를 문자열(String) 형태로 작성해야 합니다.
      • 실행 시점까지 쿼리에 대한 오류를 확인할 수 없습니다.
    • 파라미터 바인딩 직접 처리:
      • 쿼리의 파라미터를 개발자가 수동으로 처리해야 합니다.
      • 코드가 복잡해지고 실수 가능성이 높습니다.
    • 표준 API:
      • JPA 스펙에 포함된 표준 기능으로, JPA 구현체(Hibernate, EclipseLink 등)에서 기본 지원합니다.
  • 한계:
    • 문자열로 작성되기 때문에 문법 오류가 있어도 실행 시점에야 발견됩니다.
    • 파라미터 바인딩을 수동으로 처리해야 해서 코드가 길고 복잡해질 수 있습니다.

2. QueryDSL

QueryDSL은 JPA와 함께 사용되는 타입 세이프 쿼리 빌더로, 동적 쿼리 작성과 유지보수를 편리하게 만듭니다.

  • 특징:
    • 코드 기반 쿼리 작성:
      • 쿼리를 메서드 체인코드로 작성합니다.
      • 컴파일 시점에 문법 오류를 확인할 수 있어 안전합니다.
    • 자동 파라미터 바인딩:
      • 파라미터를 자동으로 바인딩해 주므로 코드가 간결하고 실수가 줄어듭니다.
    • 가독성과 유지보수성:
      • 객체 지향적인 쿼리 작성 방식으로, 복잡한 동적 쿼리를 쉽게 구현할 수 있습니다.
  • 장점:
    • 컴파일 시점 오류 검출: 쿼리가 잘못되면 컴파일 시점에 경고가 발생하므로 실행 시점 오류를 방지합니다.
    • 간결한 동적 쿼리 작성: 동적 조건을 쉽게 추가할 수 있습니다.
    • 직관적 문법: 코드만 보고도 쿼리의 의도를 이해하기 쉽습니다.
728x90
항목 JPQL QueryDSL
쿼리 작성 방식 문자열 기반(String) 코드 기반(메서드 체인)
오류 발견 시점 실행 시점 컴파일 시점
파라미터 바인딩 직접 처리 자동 처리
동적 쿼리 작성 복잡하고 비효율적 간결하고 효율적
유지보수성 문자열 수정 필요, 실수 가능성 높음 타입 세이프, 유지보수 쉬움
표준 지원 여부 JPA 표준 JPA 확장 라이브러리
적용 가능성 간단한 쿼리에 적합 복잡한 동적 쿼리에 적합
728x90
반응형