19.10.04 00:02 작성
·
1.5K
답변 1
12
2019. 10. 04. 00:37
안녕하세요 yebon2002님^^
좋은 질문입니다. distinct를 하면 데이터 수가 의도하지 않게 줄어들 수 있으니 paging 수가 안맞을까 염려하시는 것 같습니다.
우선 두가지 상황으로 나눌 수 있습니다.
1. JPA에서 paging을 하더라도, ManyToOne, OneToOne 관계는 마음껏 fetch join을 사용할 수 있습니다. 이 경우 테이블을 조인해도 데이터 수가 변하지 않기 때문에 paging도 잘 되고, 데이터도 완전히 다르기 때문에(식별자는 항상 다르니) distinct가 영향을 주지 않습니다.
질문하신 부분은 컬렉션을 페치조인하면 똑같은 데이터가 증가하게 되고, 여기에 distinct까지 추가되면 중복 데이터가 줄어드니 paging 숫자가 안맞을 것 같다고 염려하신 것 같습니다.
2. 그런데 JPA에서 paging을 하게되면, OneToMany, ManyToMany 같은 컬렉션 관계는 fetch join이 불가능합니다. 왜냐하면 이렇게 일대다 테이블을 조인하면 데이터의 수가 변하기 때문입니다. 그래서 JPA에서는 paging을 하면서 컬렉션 관계를 fetch join 하는 것 자체를 동작하지 않도록 막아두었습니다. 따라서 이 경우 distinct를 적용하는 것이 성립하지 않습니다. (혹시 컬렉션에 fetch join을 적용하더라도 경고 로그를 남기면서 모든 데이터를 메모리에 불러와서 페이징을 적용합니다! 그래서 매우 위험합니다.)
참고로 paging까지 고려한 실무 성능 최적화는 활용편 2탄에서 열심히 준비하고 있으니 기대해주세요^^
감사합니다.
2024. 07. 26. 14:25
안녕하세요. jayjoy05님
실무에서는 각 상황에 맞는 최적화 방법이 다릅니다.
어떤 경우에는 batch size를 사용한 방식이 좋고, 어떤 경우에는 작업을 분리하는게 좋습니다.
결국 두 방법을 다 알아두어야 유연하게 대응할 수 있습니다 🙂
감사합니다.
2023. 06. 07. 03:38
도움되었습니다. 감사합니다.