작성
·
501
1
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예
[질문 내용]
컬렉션의 필요성에 대해 질문 좀 드리겠습니다 - 인프런 | 질문 & 답변 (inflearn.com)
여기서 궁금한 내용있습니다!.
1)"생각하신 내용이 맞습니다. 중간 테이블을 중심으로 조회가 가능하다면 크게 문제가 없습니다. 하지만 때때로 중간 테이블을 중심으로 조회하기 어려운 경우들도 있습니다."
김영한 강사님의 답변 내용 중에 떄떄로 중간 테이블을 중심으로 조회하기 어려운 경우가 어떤 경우인지 구체적으로 알려주실수 있나요??
일단 다대다=>중간테이블 필요=>성능 최적화 필요하면=>중간테이블에 해당하는 리포지토리 생성후 (Spring data JPA에서) @Query(fetch join)사용하는식으로=> 맨날 이런식으로 했었는데 중간 테이블 중심으로 조회하기 어려운 경우가 어떤 경우인지 궁금합니다.
2)BatchSize를 사용하는 경우 일대다의 일의 collection에 해당하는 다( members) 를 일의 BatchSize에 해당하는만큼 가지고 오지 않습니까?
for (Team team : teams) {
System.out.println("team:"+team.getName());
for(Member mem:team.getMembers()){
System.out.println(mem.getUsername());
}
}
여기서는 성능 최적화가 이해가 됩니다!.
team이 붙어있으므로 배치 사이즈만큼만은 mem.getUsername()이 호출되어도 또 그때동안은 쿼리가 안나가니깐요.
근데 궁금한게 IN 쿼리에 들어가는게 BatchSIze만큼의 TeamID인데 연속한 ID만큼 나가는 걸로 알고 있는데 위처럼 연속한 경우는 몰라도, Team을 이것저것 조회하고 그에 대한 member의 메서드를 호출하면 이게 성능상 좋은가요?
답변 2
2
안녕하세요. dionisos198님
1. 이것은 결국 1:N, N:1 관계인데요. 중간 테이블 입장에서는 모두 N:1 관계까 되는 것이지요.
그런데 중간 테이블이 아닌 곳을 기준으로 페이징을 해야 한다면 둘을 조인하기가 애매합니다. 이런 경우 중간 테이블을 중심으로 페이징을 하면 원하는 페이징 결과가 나오지 않을 수 있습니다.
2. 연속한 경우에는 도움이 되지만 연속하지 않은 경우, 그러니까 100개의 데이터중 특정 데이터 몇개만 확인해야 한다면 성능상 더 좋지 않을 수 있습니다. 하지만 대부분의 경우 데이터베이스에서 데이터를 걸러서 확인해야 하는 데이터만 애플리케이션에 넘어오기 때문에 결과적으로 연속해서 확인하는 경우가 대부분입니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요. 페치 조인에 관한 질문을 해주셨네요.
중간 테이블을 중심으로 조회하기 어려운 경우는 보통 일대다 또는 다대다 관계에서 발생합니다. 예를 들어, 특정 조건에 따라 중간 테이블에 값이 없는 경우나 중간 테이블에 조회 조건이 없는 경우 등이 있을 수 있습니다.
BatchSize를 사용할 경우, 일대다 관계에서 일의 collection에 해당하는 다를 일의 BatchSize에 해당하는만큼 가져오게 됩니다. 예를 들어, 팀(Team)과 멤버(Member)가 일대다 관계라고 할 때, BatchSize를 10으로 설정하면 각 팀마다 최대 10명의 멤버까지만 가져올 수 있습니다.
더 자세한 내용은 김영한 강사님의 강의나 관련 문서를 참고하시는 것을 추천드립니다.
더 궁금한 점이 있으시면 언제든지 물어보세요. 좋은 하루 되세요!