해결된 질문
작성
·
22
0
주문 목록을 화면에 뿌려줄 때 N+1 문제가 발생하는 것을 확인하고
페치 조인으로 이를 해결해보았습니다.
OrderRepository.java
public List<Order> findAllByString(OrderSearch orderSearch) {
String jpql = "select o from Order o join fetch o.member m join fetch o.orderItems oi join fetch oi.item";
...
}
다른 부분은 건들지 않고 문자열 jpql
만 위와 같이 변경했습니다.
이처럼 변경 후 확인을 해보니 N+1 문제 없이 한방 쿼리로 주문 목록을 가져오는 것을 확인했습니다.
하지만, 기본편에서 페치 조인 대상에는 별칭을 줄 수 없다고 하셨습니다.
물론 하이버네이트는 되지만 아래의 이유 때문에 가급적 사용을 금한다고 말씀하셨습니다.
위의 o.member m
를 예로 들면 where 절에서 m.name like
와 같이 몇개만 따로 가져오는 것은
JPA가 설계한 관련된 것들을 싹 가져온다
의 방향과는 맞지 않기 때문입니다.
여기서 질문이 있습니다
질문 1)
where 절에 member에 대한 조건이 없으면 별칭을 쓰지 않아도 될거같은데 이처럼 있는 경우는 어떻게 하면 될까요?
(이 부분에 대해서 활용 2편에서 다뤄주시면 그렇다라고만 답해주셔도 됩니다)
질문 2)
기본편에서 페치 조인을 여러 단계 하는 경우는 간혹 별칭을 쓸 수 있다고 하셨는데 그게 위의 o.orderItems oi
에 해당될까요?
(여기에 별칭을 안주고는 도저히 item을 가져올 방법이 떠오르지 않습니다..)
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
조태준님께서 질문해 주신 내용은 JPA에서의 페치 조인과 관련된 내용으로, 별칭을 사용하는 경우에 대한 고민에 관한 것입니다. 조태준님의 문제를 해결할 수 있는 몇 가지 자료를 추천드리겠습니다.
페치 조인과 별칭 그리고 일관성
JPA에서는 페치 조인에 별칭을 주는 것을 권장하지 않습니다. 하지만, 하이버네이트가 이를 지원하기 때문에, 실무에서 조심해서 사용할 수 있습니다. 특히, WHERE 절에서 컬렉션을 필터링하면 문제가 될 수 있습니다. 그런 경우, 조인 결과가 애플리케이션의 객체 모델과 일치하지 않을 가능성이 생깁니다.
페치조인 별칭 관련 질문
이 질문에서는 별칭 관련한 다양한 케이스가 논의됩니다. 특히, 일관성을 유지할 수 없는 상황에서 별칭을 주고 필터링하면 애플리케이션의 데이터 일관성과 문제가 생길 수 있다는 것을 설명합니다.
질문1에 대한 답변
만약 where 조건에 member에 대한 필터가 필요한 상황이라면, DTO를 사용하여 필요한 데이터를 추출하는 방법을 고려해 볼 수 있습니다. 또는, 서브쿼리를 활용해 조건에 맞는 데이터를 먼저 필터링한 후 페치 조인을 수행할 수 있으며, 이 방법은 조건부 페치 조인에 대한 한 가지 대안이 될 것입니다.
질문2에 대한 답변
o.orderItems oi
의 경우, 별칭을 줄 수 밖에 없는 상황일 때는 다음의 답변을 참고해보세요. 페치조인 대상의 별칭 문의 게시물에서 다양한 별칭 관련 사례와 해결 방안을 찾아볼 수 있습니다.
저는 조태준님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.