• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

querydsl(JPA) 성능질문

22.06.13 15:13 작성 조회수 180

0

=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
안녕하세요. SPRING, JPA 강의를 진행중입니다.
해당강의 (Querydsl)한정 질문이 아니라 조심스럽습니다만.. 혹시 문제되면 나누어 강의컨셉에 맞는곳에 나누어 질문 올리도록하겠습니다.

1. Query vs Spring(application)
실무를 진행하고있지만...어떤 정보를 쿼리로 뽑아와야하고, 애플리케이션 단계에서 어느정도로 가공해야할지 그 기준에 대해 명확하게 정하지 못하는것 같습니다.

예를들어 "작년 한 해 동안의 주문내역중에 주문상태가 "완료"인것과 "취소"인것 두가지가 필요하다 했을때에,
이두가지를 각각 쿼리로 바로 뽑아내야할지, 아니면 작년한해동안의 주문내역의 주문상태를 조회해서 서비스단에서 나뉘어야 할지...

이 예시는 단순한 예시라 후자가 낫다는 판단이 되긴하는데, 실무에서는 좀더 복잡한부분이 있는것같아요. 혹시 참고할만한 가이드 같은게 있을까요?
 
한마디로 쿼리의 비용이 큰가요? 서비스단의 처리비용이 큰가요?

2. Where절 파라미터 vs 스프링 Filter
1번 질문과 약간 중복되는 부분이 있는것같습니다. 쿼리에서 바인딩되는 파라미터의 개수가 성능에 영향을 미치나요? (많을수록 느려지는것 같아서요..)
특정 조건에 맞는 데이터를 조회하고싶을때 아래 두가지 경우중 어느게 더 좋은 방법인가요?
- where절에 .eq() 이런것들을 사용해서 조회
- SELECT 절에 조건절에 사용하는 컬럼을 조회하고, 스프링단에서 stream().filter()로 해서 조회
 
3. QueryDsl의 Totalcount쿼리.
해당강의에서 페이징쿼리 강의내용중 집계쿼리를 따로 작성하는 부분이 있습니다.
페이징쿼리를 수행했을때, total카운트와 함께 특정 컬럼이 조건에 만족하는 것을 따로 집계한 카운트도 반환하고 싶습니다.

예를들어 주문내역100건을 조회했을때 페이징쿼리로 20건씩 조회하는데
주문내역 (진행중인건 82건/총 100건) <- 이데이터가 필요할때 "진행중인 건"에 대한 집계를 하고싶습니다.

이경우 진행중인건에 대한 쿼리를 한번더 요청하는수밖에없나요? (카운트쿼리1, 집계쿼리1, 추가집계쿼리1 => 총3회 쿼리)
아니면 추가 쿼리 없이 카운트쿼리의 select절에 "상태"컬럼을 추가해서 처리할 수 있는 방법이 있나요? (총2회 쿼리


답변 1

답변을 작성해보세요.

0

안녕하세요. 김진영님

우선 결론부터 말씀드리면 데이터베이스에서 데이터를 최대한 줄여서 조회하는 것이 실무에서는 성능상 중요합니다. 그렇지 않으면 수 많은 데이터를 전송하고, 메모리에 올리는 추가 비용이 발생합니다. 상황에 따라서 다를 수 있지만 가급적이면 이 기준을 가지고 진행하시면 됩니다.

3번 질문은 한번 더 요청해야 합니다. 또는 SQL에서 select 절에 진행중인건 count를 포함해서 가져올 수 는 있습니다. 이 부분은 SQL 부분을 더 공부해보시면 좋을 것 같아요. 그런데 성능 차이는 크지 않을 수 있어서 우선 추가 쿼리를 실행하도록 개발해두셔도 괜찮을 것 같아요.

감사합니다.