강의

멘토링

로드맵

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

c_dev님의 프로필 이미지
c_dev

작성한 질문수

JPA 컬렉션 조회 시 조건이 들어가 있을 경우 조회 질문있습니다~

작성

·

171

0

JPA 컬렉션 조회 시 궁금한 사항이 있어서 질문 올립니다.

3개의 Entity 가 존재합니다.

리그, 스폰서, 팀

리그에는 여러 스폰서가 있고, 여러 팀이 존재합니다.

스폰서와 팀과의 연관 관계는 없다고 가정합니다.

그러므로 리그 Entity 에는 스폰서와 팀이 각각 OneToMany 연관 관계를 맺었습니다.

 

전체 리그와 연관되어있는 두 개의 컬렉션(스폰서, 팀) 을 조회하고자 할 때는 Batch Size 설정을 하여 리그를 전체 조회하여 Lazy Loading 으로 스폰서와 팀을 조회가 가능합니다.

 

그런데 만약 Team에 우승 횟수라는 필드 값이 존재하고 특정 우승 횟수 이상인 팀들을 조회하는 조건을 추가한다고 가정했을 경우를 생각해보았습니다.

 

현재 아래 두 가지 방법으로 조회를 해보았는데 다른 방식이 있는지 궁금합니다!

  1. 위에서 조회했던 전체 조회 방식을 적용할 때, 팀 컬렉션 조회 후 DTO에 담을 때 Stream Filter를 사용하여 우승 횟수 조건을 추가하는 방법.(DB에 데이터가 많을 경우에도 전체 데이터를 들고와서 Filter 를 해줘야하기 때문에 리스크가 있다고 생각이 듭니다)

  2. 리그&스폰서, 리그&팀 쿼리를 따로 조회합니다. 리그&팀의 쿼리에 우승 조건을 추가하여 필요한 데이터만 조회 한 후 Stream GroupingBy 를 사용하여 DTO에 담습니다.

 

위 방식 대로면 N+1 문제도 발생하지 않습니다.

 

혹시 다른 방법이 있는 지 여쭤보고 싶네요!

답변 1

0

안녕하세요, 인프런 AI 인턴이에요. JPA 컬렉션 조회의 조건을 추가하는 방법에 대해 궁금하신 것 같아요.

첫 번째 방법으로는 전체 리그 조회 후에 팀 컬렉션을 필터링하여 우승 횟수 조건을 추가하는 방법을 사용하셨는데, 데이터베이스의 데이터양이 많을 경우에는 전체 데이터를 가져와야 하기 때문에 성능상의 문제가 생길 수 있습니다.

두 번째 방법으로는 리그&스폰서, 리그&팀 쿼리를 따로 조회하는 방법이 있습니다. 이 방법을 사용하면 필요한 조건(우승 횟수 등)을 쿼리에 바로 추가할 수 있기 때문에 성능이 개선될 수 있습니다. 따로 조회한 후에는 결과를 합칠 수도 있습니다.

하지만 이 방법은 리그 정보와 연관된 팀 또는 스폰서를 모두 가져오기 위해 여러 번의 쿼리를 실행해야 하는 단점이 있습니다. 따라서 성능에 민감하지 않은 경우에 사용하면 좋을 것 같아요.

또 다른 방법으로는 JPQL의 JOIN FETCH를 사용하는 방법이 있습니다. JOIN FETCH를 사용하면 한 번의 쿼리로 조인된 엔티티와 컬렉션을 함께 가져올 수 있습니다. 이 방법은 한 번의 쿼리로 모든 데이터를 가져올 수 있기 때문에 성능적으로 좋은 선택일 수 있습니다.

조건에 따른 JPA 컬렉션 조회에는 다양한 방법이 존재하지만 성능, 코드 가독성 등을 고려하여 가장 적절한 방법을 선택하시면 될 것 같습니다. 추가적인 도움이 필요하시면 언제든지 물어보세요. 좋은 하루 되세요!

c_dev님의 프로필 이미지
c_dev

작성한 질문수

질문하기