강의

멘토링

로드맵

Inflearn brand logo image

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

조태준님의 프로필 이미지
조태준

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

주문 목록 검색, 취소

주문 목록 조회 fetch join 질문드립니다

해결된 질문

작성

·

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에서의 페치 조인과 관련된 내용으로, 별칭을 사용하는 경우에 대한 고민에 관한 것입니다. 조태준님의 문제를 해결할 수 있는 몇 가지 자료를 추천드리겠습니다.

  1. 페치 조인과 별칭 그리고 일관성
    JPA에서는 페치 조인에 별칭을 주는 것을 권장하지 않습니다. 하지만, 하이버네이트가 이를 지원하기 때문에, 실무에서 조심해서 사용할 수 있습니다. 특히, WHERE 절에서 컬렉션을 필터링하면 문제가 될 수 있습니다. 그런 경우, 조인 결과가 애플리케이션의 객체 모델과 일치하지 않을 가능성이 생깁니다.

  2. 페치조인 별칭 관련 질문
    이 질문에서는 별칭 관련한 다양한 케이스가 논의됩니다. 특히, 일관성을 유지할 수 없는 상황에서 별칭을 주고 필터링하면 애플리케이션의 데이터 일관성과 문제가 생길 수 있다는 것을 설명합니다.

  3. 질문1에 대한 답변
    만약 where 조건에 member에 대한 필터가 필요한 상황이라면, DTO를 사용하여 필요한 데이터를 추출하는 방법을 고려해 볼 수 있습니다. 또는, 서브쿼리를 활용해 조건에 맞는 데이터를 먼저 필터링한 후 페치 조인을 수행할 수 있으며, 이 방법은 조건부 페치 조인에 대한 한 가지 대안이 될 것입니다.

  4. 질문2에 대한 답변
    o.orderItems oi의 경우, 별칭을 줄 수 밖에 없는 상황일 때는 다음의 답변을 참고해보세요. 페치조인 대상의 별칭 문의 게시물에서 다양한 별칭 관련 사례와 해결 방안을 찾아볼 수 있습니다.

저는 조태준님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

조태준님의 프로필 이미지
조태준

작성한 질문수

질문하기