JPA

JPQL과 QueryDSL의 차이

쿠카이든 2022. 2. 14. 12:11
728x90
  • JPQL과 Querydsl의 정의
    • JPQL(Java Persistence Query Language)
      • JPA에서 제공하는 메서드 호출만으로 섬세한 쿼리 작성이 어려워서 생겨났습니다.
      • JPA는 JPQL을 분석하여 SQL을 생성한 후 DB에서 조회합니다.
    • Querydsl
      • SQL을 java로 type-safe하게 개발 할 수 있게 해주는 프레임워크
      • Querydsl -> JPQL -> SQL 와 같이 동작
      • JPQL을 편하게 사용할 수 있게 도와주는 빌더의 역할
@SpringBootTest
@Transactional
public class QuerydslBasicTest {
    @Autowired
    EntityManager em;
    JPAQueryFactory queryFactory;
    
    @BeforeEach   //클래스에 존재하는 모든 메소드를 실행한다고 할때, 다른 메소드가 시작하기전 실행시킴(데이터 삽입)
    public void before() {
        queryFactory = new JPAQueryFactory(em);
        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 startJQPL() {

        //member1을 찾아라(JPQL)
        String sqlString =
                "select m from Member m " +
                        "where m.username = :username";
        Member findMember = em.createQuery(sqlString, Member.class)
                .setParameter("username", "member1")
                .getSingleResult();

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

    @Test
    public void startQuerydsl() {

        //member1을 찾아라(Querydsl)
        //QMember m = new QMember("m"); //별칭 직접 입력
        QMember m = QMember.member;     //위의 주석과 동일 QMember안에 정의되어 있습니다.(기본 인스턴스 사용)

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

        assertThat(findMember.getUsername()).isEqualTo("member1");
    }
}
  • JPQL과 Querydsl의 비교
    • JPQL : 문자(실행 시점 오류 → 실행 이전까지 오류 파악 힘듬), Querydsl : 코드(컴파일 시점 오류 잡음 → 매우 큰 이점)
    • JPQL : 파라미터 바인딩 직접, Querydsl : 파라미터 바인딩 자동 처리(자동으로 PreparedStatement 처리를 해서 파라미터 바인딩(SQL 인젝션 문제 해결 가능 → 보안상 이점)
728x90