티스토리 뷰

저는 querydsl을 실무에서 주로 사용하고 있습니다.

제대로 알고 사용하고 있는지 점검할 겸, JPQL과 QueryDsl의 차이점을 정리해보는 시간을 가졌습니다.

먼저, JPQL과 QueryDsl이 무엇인지 가볍게 알아보겠습니다.

JPQL이란?

JPQL(Java Persistence Query Language)은 엔티티 객체를 조회하는 객체 지향 쿼리 언어입니다.

JPQL은 SQL과는 다르게 엔티티 객체를 대상으로 쿼리를 작성하며, 데이터베이스의 특정 열에 대한 쿼리는 지원하지 않습니다.

JPQL은 엔티티 객체의 속성을 사용하여 쿼리를 작성하며, 결과는 엔티티 객체의 컬렉션으로 반환됩니다.

JPQL은 JPA(Java Persistence API)의 일부이며, JPA 구현체에서 지원됩니다.

QueryDsl이란?

QueryDsl은 JPQL을 작성하는 데 사용되는 메타 모델 기반의 자바 라이브러리입니다.

JPQL 빌더 역할을 하며, 코드 기반이면서 단순하고 사용하기 쉽습니다.

JPQL에서 지원하지 않는 다양한 기능을 제공하며, 복잡한 쿼리, 그리고 동적 쿼리를 작성하기 쉽습니다.

또한 JPA 뿐만 아니라 다른 ORM(Object-Relational Mapping) 프레임워크와도 호환됩니다.

비표준 오픈소스 프레임워크입니다.

스프링 데이터 프로젝트가 지원할 정도로 기대를 모으고 있는 프로젝트라고 합니다.

JPQL vs QueryDsl

결국, QueryDsl은 JPQL을 도와주는 역할이었습니다.

JPQL의 단점은 문자열 형태의 쿼리를 전달하다보니까 오타같은 에러를 컴파일 단계에서 파악할 수 없었습니다.

그에 비해 QueryDsl은 자바 코드로 이루어져 있어서 컴파일 단계에서 발견할 수 있고, 쿼리에 의존하지 않을 수 있었습니다.

개인적인 총평

저는 JPQL를 사용하진 않고, Spring Data JPA의 공통 인터페이스를 주로 사용하고, 복잡한 쿼리가 필요할 때 QueryDsl를 사용하고 있습니다.

Join이 필요없는 경우에는 공통 인터페이스를 사용합니다.

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UserRepository extends JpaRepository<User, Long> {
    boolean existsByEmailAndActivated(String email, Boolean activated);
    boolean existsByPhoneAndActivated(String phone, Boolean activated);
    Optional<User> findByEmailAndActivated(String email, Boolean activated);
}

Join이 필요한 경우에는 다음 코드와 같이 QueryDsl을 사용합니다.

class MenuQueryRepositoryImpl(
    private val query: JPAQueryFactory
) : MenuQueryRepository {
    override fun findMenuByCategoryId(categoryId: Long): List<MenuItemDto> {
        return query.select(
            QMenuItemDto(
                menu.id,
                menu.menuName,
                menu.soldOut,
                menu.onlyIce,
                menu.price,
                menu.imageUrl,
                menu.backgroundUrl
            )
        ).from(menu)
            .where(menu.categoryId.eq(categoryId))
            .fetch()
    }
}

 

제 개인적인 생각은 SQL문과도 비슷한 자바 코드여서 개발하기 편했고, 여러 기능을 제공하고 있어서 좋았습니다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함