[JPA] JPQL & QueryDSL 개념, 용도, 사용방법

Posted by nkjok
2025. 2. 8. 16:12 낙서장[1]/3. JPA
반응형

JPQL (Java Persistence Query Language)

개념

JPQL은 Java Persistence API (JPA)를 사용하여 데이터베이스에서 객체를 조회하기 위한 쿼리 언어입니다. SQL과 유사하지만, JPQL은 데이터베이스 테이블이 아닌 엔티티 객체를 대상으로 작동합니다. 따라서 객체 지향적인 방식으로 데이터베이스 쿼리를 작성할 수 있습니다.

용도

  • 엔티티 객체를 조회할 때 사용
  • 복잡한 쿼리를 작성할 수 있지만, 쿼리 문자열이 고정되어 있어 동적 쿼리를 작성하는 데 제한적

사용 방법

java
// JPQL 예시
@Query("SELECT p FROM Post AS p WHERE p.title LIKE %:title% ")
List<Post> findAllByTitle(@Param("title") String titleStr);

QueryDSL

개념

QueryDSL은 JPA의 동적 쿼리 생성을 쉽게 하기 위한 도구입니다. 쿼리 타입을 제공하여 자바 코드 내에서 타입 안정성이 보장되는 쿼리를 작성할 수 있습니다. 동적 쿼리를 작성하기에 적합합니다.

용도

  • 동적 쿼리 작성에 적합
  • 컴파일 시점에 타입 체크가 가능하여 안전한 쿼리 작성 가능

사용 방법

java
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.beans.factory.annotation.Autowired;

public class PostRepositoryCustomImpl implements PostRepositoryCustom {

    @Autowired
    private JPAQueryFactory queryFactory;

    @Override
    public List<Post> findAllByTitle(String titleStr) {
        QPost post = QPost.post;
        return queryFactory.selectFrom(post)
                .where(titleContains(titleStr))
                .fetch();
    }

    private BooleanExpression titleContains(String titleStr) {
        if (titleStr == null || titleStr.isEmpty()) {
            return null;
        }
        return QPost.post.title.containsIgnoreCase(titleStr);
    }
}

요약

  • JPQL: 정적 쿼리에 적합, SQL과 유사하지만 객체 지향적인 방식
  • QueryDSL: 동적 쿼리에 적합, 타입 안전성 보장

 

반응형