경로 표현식 (묵시적 조인, 명시적 조인)

루민 ·2023년 4월 28일
0

📝경로 표현식

@Repository
@RequiredArgsConstructor
public class CartQueryRepository {

    private final EntityManager em;

    public List<CartQueryDto> findCartQueryDtos(Long cartId) {
        List<CartQueryDto> cartQueryDtoList = em.createQuery(
                        "select new com.toyproject.ecommerce.repository.query.CartQueryDto(ci.id, i.name, ci.count, i.price)" +
                                " from CartItem ci" +
                                " join ci.item i" +
                                " where ci.cart.id = :cartId", CartQueryDto.class)
                .setParameter("cartId", cartId)
                .getResultList();

        return cartQueryDtoList;
    }
}

실제 진행한 프로젝트 예제를 가지고 상태 필드, 묵시적 조인, 명시적 조인을 설명드립니다.


상태필드

  • 경로 탐색의 끝으로 더 이상 탐색을 할 수 없습니다.
  • 위의 예제에서는 ci.id, i.name, ci.count, i.price 가 모두 상태필드입니다.

명시적 조인

  • 위의 예제와 같이 FROM절에서 명시적 조인(join ci.item i)을 통해 별칭을 얻고
  • select 절에서 별칭을 통해 i.name, i.price를 탐색하고 있습니다.

묵시적 조인


    public List<CartQueryDto> findCartQueryDtos(Long cartId) {
        List<CartQueryDto> cartQueryDtoList = em.createQuery(
                        "select new com.toyproject.ecommerce.repository.query.CartQueryDto(ci.id, ci.item.name, ci.count, ci.item.price)" +
                                " from CartItem ci" +
                                " where ci.cart.id = :cartId", CartQueryDto.class)
                .setParameter("cartId", cartId)
                .getResultList();
  • 위의 예제는 묵시적 조인이 발생하는 예입니다.
  • ci.item.name, ci.item.price 에서 묵시적 내부 조인(inner) 조인이 발생합니다.
  • 객체는 ci.item과 같이 접근이 가능하지만 데이터베이스의 경우에는 조인을 해야합니다.
  • 그렇게 때문에 만일의 경우 의도하지 않은 JOIN이 발생하고 튜닝, 운영이 아주 힘들게 됩니다.

TIP

  • 묵시적 내부 조인이 발생하지 않게 명시적 조인을 사용하기!!
  • JPQL과 SQL를 비슷하게 짜기!!

0개의 댓글