• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

커서와 페이징

24.03.14 21:29 작성 24.03.14 21:29 수정 조회수 70

0

안녕하세요.
수업 관련 질의드립니다.

 

  1. 커서와 페이징 처리방식

     

    1. 전제:

      커서 기반 리더는 SQL을 한번 실행해 해당 커넥션을 이용해 스트림 처리를 하고, 페이징 기반 리더는 청크 단위로 SQL을 여러번 실행해 데이터를 페이징 단위로 처리합니다.

    2. 문제: 그러면 커서기반으로 처리되는 리더는 doRead() 를 호출할 때, 데이터를 하나가져오고, 매핑하고, 다시 iterate해서 데이터를 하나 가져오고 매핑하는 것인가요? 아니면 일단 청크사이즈만큼 가져오고 그 다음 iterate해서 매핑을 하는 것인가요?

    3. 질문이유: 저는 전자를 커서방식 후자를 페이징 방식이라고 생각하였는데, 수업 시간에 커서도 데이터를 청크사이즈만큼 가져온다음 Iterate한다고 이해하여 제 인식에 잘못된 것이 있는지, 파악에 오류가 있는지 질의드립니다.

감사합니다.

답변 2

·

답변을 작성해보세요.

0

페이징 방식과 커서 방식은 데이터를 읽어오는 방식에서 엄연히 구분됩니다.

페이징은 가져올 데이터를 페이지 단위로 잘라서 가져오기 때문에 디비와의 커넥션이 매번 이루어지지만 커서는 데이터를 모두 읽어올 때까지 스트리밍 방식으로 계속 연결되어 있다는 점입니다.

여기서 커서 방식이 하나의 데이터를 하나씩 읽어오는 원리는 맞지만 성능을 위해 미리 일정양을 메모리에 로드하는 옵션을 줄 수 있습니다.

페이지 방식도 이 개념은 비슷하다 할 수 있습니다.

다만 커서와 페이징의 데이터 로딩 구조가 다르다고 보시면 됩니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.16

안녕하세요, 인프런 AI 인턴입니다.

커서 기반 처리와 페이징 처리 방식에 대한 궁금증을 해결해 드리겠습니다.

  1. 커서 기반이란:

    • 한 번의 쿼리 실행 후, 데이터베이스 커넥션을 통하여 연속된 스트림으로 데이터를 읽어 들이는 방식입니다.
    • doRead() 메서드 호출 시, 한 번에 한 개의 데이터를 가져오고 매핑 후, 다음 데이터를 위해 다시 반복(iteration)하는 과정을 거칩니다.
  2. 페이징 처리란:

    • 각 청크마다 새로운 SQL 쿼리를 실행하여, 설정된 페이지 크기(PageSize)만큼 데이터를 분할하여 처리하는 방식입니다.
    • 각 페이지 단위로 데이터를 읽은 후, 해당 부분을 매핑하고, 다음 페이지로 넘어가 다시 데이터를 읽어 처리하는 구조입니다.

질문하신 내용에 기반해서 설명드리면, 커서 방식은 전자인 ‘한 번에 한 개의 데이터를 가져오는 방식’이 맞습니다. 따라서 귀하께서 커서 방식이라 이해한 바가 정확합니다. 반면, 페이짅 방식은 ‘페이지 단위로 데이터를 가져온 후, 해당 데이터를 한 번에 처리(iteration 없음)‘하는 방식을 말합니다.

따라서 수업 시간에 커서가 청크 사이즈만큼 데이터를 가져온다고 이해된 부분은 오해가 있을 수 있는데, 이를 다시 한 번 확인하시면 좋겠습니다.

참고로 스프링 배치에서는 대량의 데이터를 처리할 때 주로 커서 방식을 이용합니다. 커서 방식은 페이징 방식에 비해 메모리 사용은 적지만, 오픈된 커넥션을 유지해야할 필요가 있습니다. 반면, 페이징 방식은 메모리 사용량이 더 클 수 있지만 개별 페이지 처리가 완료되면 해당 리소스를 바로 반환할 수 있는 장점이 있습니다.

추가로 도움이 될 수 있는 Spring Data JPA의 문서 링크드립니다:

도움이 되셨기를 바랍니다. 다른 궁금한 사항이 있으시면 언제든지 질문해 주세요.
감사합니다.