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

brwnsugr님의 프로필 이미지
brwnsugr

작성한 질문수

실전! Querydsl

수정, 삭제 벌크 연산

db에 날리는 쿼리는 최대한 간단하게 하라는 의미

작성

·

893

2

안녕하세요, 영한님. 저는 jpa기초부터 지금까지 쭉 잘 듣고있는 수강생입니다.

지금 이 강의는 아니고, 이전? 강의에서 흘러가는 말로, 

보통 query로 데이터를 갖고 올 때는, 가능한 한, 단순한 쿼리로 raw 데이터 위주로 갖고오고, 비즈니스로직은 애플리케이션 단에서 코드로 처리한다고 하셨는데,(설령 avg, sum 등  db 에서 연산 가능한 부분이더라도요..)

혹시 그렇게 했을 때 이점이 어떤게 있어서 그런건가요? 

예전에, raw data만 sql로 갖고와서, sum, avg 를 컨트롤러 단에서 구현한 적이 있었는데, 당시 사수는 db 에서 가능한 한 연산을 많이 해서 갖고오라고 말씀해주셨는데, 견해가 또 다르신거같아서 여쭤봅니다. 

당시에는 유저별 랭킹 시스템을 합산하기 위한 개발이었습니다.(24시간 배치로 돌아가는 프로그램이었죠.)

답변 3

9

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. brwnsugr님^^

결론부터 말씀드리면, 데이터베이스에서 할 수 있는 집계성 쿼리는 데이터베이스에서 처리하는게 좋습니다.

데이터베이스에서 데이터를 꺼낼 때는 데이터 양 자체를 줄이는 것이 매우 중요합니다.

예를 들어서 avg, sum 등은 데이터베이스가 잘 제공하는 기능이고, 또 데이터 양을 많이 줄여주기 때문에 데이터베이스에서 처리하는게 좋습니다.

그러면 어떤 경우에 데이터베이스 쿼리를 사용하는게 좋은가 하면 다음의 경우는 데이터베이스의 기능을 최대한 많이 사용해서 데이터를 줄여야 합니다.

1. 최대한 데이터를 필터링해서 가지고 오는 것(where)

2. 집계성 쿼리(avg,sum)

는 최대한 DB의 기능을 사용하는 것이 맞습니다. 그리고 집계성 쿼리도 전송하는 데이터를 크게 줄여주기 때문입니다.

유저별 랭킹 시스템을 합산하려면 유저가 100백만이라면 데이터베이스에서 avg, sum을 하면 수초만에 끝나는데, 애플리케이션에 이 데이터를 다 로딩한 다음에 집계를 내려면 수분 이상은 걸리겠지요.

그런데 제가 강조한 부분은 그 이외의 부분이라고 생각해주시면 됩니다. 예를 들어서 날짜 데이터 같은 것을 임의로 쿼리에서 조작하거나, 쿼리에서 특정 필드의 a와 b의 값을 더하고 곱하는 해서 그 결과 dto를 반환하는 행위들입니다. 위의 2가지 경우를 제외하고 데이터는 가급적 원천을 그대로 받고, 애플리케이션에서 로직으로 처리하는 것을 권장합니다.

물론 avg, sum도 데이터 양이 적거나 또는 한 페이지 안에서 처리 가능한 분량 정도면 애플리케이션에서 처리하는게 더 나은 경우도 있습니다.

도움이 되셨길 바래요^^

1

수준 높다

1

brwnsugr님의 프로필 이미지
brwnsugr
질문자

바쁘신 와중에도 답변 정말 고맙습니다. 

집계성 쿼리가 전송하는 데이터를 크게 줄여준다는 부분은 제가 좀 더 찾아보면서 공부해볼게요.

brwnsugr님의 프로필 이미지
brwnsugr

작성한 질문수

질문하기