인프런 커뮤니티 질문&답변

헬로월드님의 프로필 이미지
헬로월드

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

간단한 주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화

페치조인 대상의 별칭 문의

작성

·

355

12

안녕하세요. 기본편 수강마치고 강의 듣는 중에 의문점이 있어 질문드립니다.

기본편의 페치조인의 한계 강의에서는 "페치조인의 대상에는 별칭을 줄 수 없다." 고 하셨는데 지금 예제는 별칭을 포함하고 있어서요. (o.member m 과 o.delivery d)

제가 검색조건을 추가해서 테스트해보니 정상적으로 쿼리수행이 되었습니다. 아래는 제가 테스트해본 코드입니다.

public List<Order> findAllWithMemberDelivery(OrderSearch orderSearch) {
		return em.createQuery("select o from Order o " + 
								"join fetch o.member m " + 
								"join fetch o.delivery d " +
								"where (:status is null or o.status = :status) " +
								"and (:name is null or m.name like :name)", Order.class)
				.setParameter("status", orderSearch.getOrderStatus())
                .setParameter("name", orderSearch.getMemberName())
				.getResultList();
	}

그리고 기본편의 강의에서는 페치조인에 별칭을 주는것의 위험성도 설명해주셨는데요. 지금같이 검색조건을 주는 경우에는 페치조인에 별칭을 줄 수 밖에 없는게 아닌지 궁금합니다.

기본편 강의를 다시 보니 OneToMany 에 대해서만 페치조인 별칭이 위험한 것으로 이해됩니다. 지금예제의 Order와 Member 관계처럼 ManyToOne 에서는 문제가 되지 않는 것인지.. 제가 이해한게 맞는지 확인 부탁드리겠습니다.

답변 2

4

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 헬로월드님^^ 좋은 질문입니다.

질문주신 것 처럼 ManyToOne, OneToOne 관계는 문제가 되지 않습니다^^ 이럴때는 fetch join에 별칭을 쓰면 쉽게 풀어낼 수 있는 상황이 많지요^^ 

그런데 설명드린 것 처럼 OneToMany에서 Many쪽을 줄이는 방식으로 fetch join을 사용하면, 객체와 데이터베이스 사이에, 데이터 정합성이 안맞기 때문에 문제가 발생할 수 있습니다. 이 부분만 조심하시면 됩니다.

(사실 ManyToOne, OneToOne도 left join으로 페치 조인하고 별칭을 사용해서 join on으로 데이터를 필터링 해버리면 DB에는 데이터가 있는데 객체에 조회한 결과는 오른쪽에 데이터가 없을 수 있어서 문제가 될 수 있습니다.)

결론은 order.getMember()나, member.getOrder()를 호출했을 때 조회된 데이터 수가 데이터베이스에 있는 데이터수와 같으면 문제가 없습니다!

감사합니다.

2

헬로월드님의 프로필 이미지
헬로월드
질문자

답변감사합니다. 큰도움이 되었습니다. 그리고 마지막 결론내주신 부분은 실무에서 JPQL 쿼리 작성할 때 체크리스트로 활용하면 좋을 것 같습니다.

헬로월드님의 프로필 이미지
헬로월드

작성한 질문수

질문하기