em.createQuery()와 @Query의 차이.
em.createQuery() (직접 JPQL 실행)사용 위치:
em.createQuery()는 직접 EntityManager를 사용해서 JPQL(Java Persistence Query Language)을 실행하는 방식입니다. 보통 커스텀 리포지토리에서 사용됩니다. 이 방식은 동적이거나 정적인 JPQL 쿼리를 직접 작성하고 실행할 수 있습니다.
장점:
단점:
예시:
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();
@Query (Spring Data JPA 쿼리 어노테이션)사용 위치:
@Query는 Spring Data JPA 리포지토리 인터페이스에서 사용하는 방식입니다. 직접 EntityManager를 다루지 않고, 어노테이션으로 JPQL 쿼리를 작성할 수 있습니다. 주로 간단한 커스텀 쿼리가 필요할 때 사용합니다.
장점:
단점:
예시:
@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()를 사용하는 것이 일반적입니다.