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

이석재님의 프로필 이미지
이석재

작성한 질문수

실전! 스프링 데이터 JPA

findTopN.... 에서 N의 상한점 및 DB에 걸린 SELECT 쿼리 조회 건수 제약이 있을때의 동작 방식이 궁금합니다.

해결된 질문

작성

·

225

0

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

[질문 내용]
안녕하세요. 학습 중 궁금한 내용이 생겨서 질문드립니다.
JpaRepository를 구현한 뒤 규칙에 맞게 메서드 쿼리를 작성하는 것으로 간단하게 해당 Entity에 대한 SQL쿼리를 수행하는 메서드를 만들 수 있다고 알고 있습니다.
 
1. 혹시 findTopN... 형태의 메서드에서 N의 상한점이 있을까요? 예를 들면 findTop1000000... 이런식으로 작성해도 문제가 없는지 궁금합니다.
 
2. (1번 예시에서 이어서)한번에 100만건을 가져오는 건데 한번의 쿼리로 작성한 대로 100만건을 읽어와서 List형태로 받을 수 있을까요? 아니면 뭔가의 설정이나 기준으로 인해 알아서 N개씩 분할해서 여러번의 쿼리가 호출되는지가 궁금합니다.
 
3. 1번 예시에서 이어서)DB 자체에 제약을 걸어 SELECT문 조회시 최대K건의 데이터만 조회되도록 설정해놓은 상태에서는 어떻게 동작하는지 궁금합니다. 예를 들면 500건의 데이터만 조회되도록 DB자체에 설정을 걸어놓고 findTop5000.. 식의 쿼리를 쓴다면 SELECT 쿼리가 5000/500 = 10, 즉 10번의 쿼리가 호출되는지, 아니면 메서드 쿼리의 설정이 우선시 되어 5000건을 한 번에 읽어올지 궁금합니다.
 
위의 예시의 경우, 결국 EntityManager에 의해 SQL이 호출되는 것이기 때문에 DB 자체에 걸린 제약이 우선시되어 findTop5000... 을 호출했지만 한 번의 호출로 인해 500건밖에 가져오지 못할 것 같습니다. 이 경우에 나머지 4500건을 알아서 추가로 호출해올까요?...
 
감사합니다.

답변 1

2

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

안녕하세요. seok9211님

TopN은 아주 간단한 경우에만 사용해야 합니다. 단순히 1개, 3개 10개 이정도 용도로 사용한다 생각하시면 됩니다. 5000이라고 하면 한번에 5000건이 조회됩니다.

복잡한 상황은 페이징을 사용하셔야 합니다.

감사합니다.

이석재님의 프로필 이미지
이석재
질문자

사실 질문을 올리고 간단하게 프로젝트 하나 띄워서 테스트를 해보았는데요, 말씀해주신대로 쿼리가 나누어지지않고 단건 쿼리로 한방에 N개를 가져오는 것 같습니다... 자주 사용해야하는 메서드라면 반드시 페이징을 해서 가져와야할 것 같습니다. 쿼리 하나에 많게는 몇 초씩 걸리네요 ㅠㅠ

스프링 핵심원리 고급편도 재밌게 수강하고 있습니다. 답변 감사합니다!

이석재님의 프로필 이미지
이석재

작성한 질문수

질문하기