em.createQuery()와 @Query

seokseungmin·2024년 10월 16일

Today I Learned

목록 보기
7/20

em.createQuery()@Query의 차이.

1. em.createQuery() (직접 JPQL 실행)

  • 사용 위치:
    em.createQuery()는 직접 EntityManager를 사용해서 JPQL(Java Persistence Query Language)을 실행하는 방식입니다. 보통 커스텀 리포지토리에서 사용됩니다. 이 방식은 동적이거나 정적인 JPQL 쿼리를 직접 작성하고 실행할 수 있습니다.

  • 장점:

    • 동적 쿼리 작성이 용이합니다. 예를 들어, 검색 조건이 있을 때 그 조건에 맞춰 JPQL을 동적으로 생성할 수 있습니다.
    • 복잡한 쿼리를 필요에 맞게 조정할 수 있습니다.
  • 단점:

    • 코드가 길어질 수 있고, 쿼리 문자열을 수동으로 관리해야 하기 때문에 실수의 여지가 있습니다.
    • Spring Data JPA가 제공하는 여러 자동화된 기능을 사용할 수 없습니다.
  • 예시:

    String jpql = "select o from Order o join o.member m where o.status = :status";
    TypedQuery<Order> query = em.createQuery(jpql, Order.class);
    query.setParameter("status", orderSearch.getOrderStatus());
    return query.getResultList();

2. @Query (Spring Data JPA 쿼리 어노테이션)

  • 사용 위치:
    @QuerySpring Data JPA 리포지토리 인터페이스에서 사용하는 방식입니다. 직접 EntityManager를 다루지 않고, 어노테이션으로 JPQL 쿼리를 작성할 수 있습니다. 주로 간단한 커스텀 쿼리가 필요할 때 사용합니다.

  • 장점:

    • 간결하고 사용하기 쉬우며, 쿼리를 어노테이션으로 바로 정의할 수 있습니다.
    • Spring Data JPA의 기능(예: 페이징, 정렬)과 쉽게 통합됩니다.
    • 코드가 더 깔끔하고, 간단한 쿼리 작업에는 빠르게 사용할 수 있습니다.
  • 단점:

    • 동적인 쿼리 작성은 어렵습니다. 대부분 고정된 쿼리를 사용하는 경우에 적합합니다.
    • 매우 복잡한 쿼리를 다룰 때는 코드가 복잡해질 수 있습니다.
  • 예시:

    @Query("SELECT p FROM PostEntity p JOIN FETCH p.author WHERE p.id = :postId")
    Optional<PostEntity> findByIdWithAuthor(@Param("postId") Long postId);

주요 차이점

  • 직접적인 컨트롤: em.createQuery()EntityManager를 통해 개발자가 직접 쿼리를 만들고 관리해야 하기 때문에, 더 세밀한 컨트롤을 할 수 있습니다. 반면, @Query는 Spring Data JPA가 제공하는 고수준의 추상화로 간단하게 쿼리를 정의할 수 있습니다.
  • 동적 쿼리: em.createQuery()는 조건에 따라 쿼리를 동적으로 생성할 수 있는 반면, @Query는 고정된 쿼리만 정의 가능합니다. 동적 쿼리를 처리하려면 Querydsl 같은 다른 방식이 필요합니다.
  • 코드 복잡도: @Query는 코드가 간결하고 직관적이지만, em.createQuery()는 복잡한 쿼리 로직을 처리할 수 있는 유연성을 제공합니다.

결론적으로, 간단하고 고정적인 쿼리는 @Query로 처리하고, 더 복잡하거나 동적인 쿼리가 필요할 때는 em.createQuery()를 사용하는 것이 일반적입니다.

profile

0개의 댓글