Interview Question

[백엔드 면접 질문 준비] (7) RDB에서 페이징 쿼리의 필요성

sagecode 2025. 4. 15. 15:55

페이징 쿼리(Paging Query)란?

페이징 쿼리(Paging Query) 는 전체 데이터를 부분적으로 나누어 데이터를 조회하거나 처리할 때 사용됩니다. 데이터를 상대적으로 작은 단위로 나누어 처리하기 때문에 데이터베이스나 애플리케이션의 리소스 사용 효율이 증가하며, 로직 처리 시간을 단축 시킬 수 있습니다. MySQL에서 페이징 쿼리는 일반적으로 LIMIT, OFFSET 구문을 사용하여 작성합니다.

 

페이징 쿼리를 왜 사용할까?

1. 데이터의 물리적 양

  • 실제 서비스에서는 수천, 수만, 수십만 개의 데이터가 존재할 수 있습니다.
  • 한 번에 모든 데이터 조회시 발생하는 이슈
    • DB에 과부하 발생
    • 네트워크 전송량 증가
    • 사용자 브라우저에서도 렌더링 부담

2. 사용자 경험 측면

  • 사용자는 한 번에 모든 상품을 보기 힘듬
  • 일반적으로 10개, 20개씩 끊어서 보여주는 게 더 자연스러움

3. 성능 최적화

  • 페이징 쿼리를 사용하게 되면 불필요한 데이터를 조회할 필요가 없습니다.
  • 대량데이터에서 그 페이지를 제외한 다른데이터를 보여주지 않게 되면 성능이 매우 향상됩니다.

예시 코드

CREATE TABLE articles (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    content TEXT,
    author VARCHAR(100),
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

이런 게시글 테이블이 있다고 가정하자. 우리는 이 때, 생성된 날짜에 따라서 게시글을 조회할 예정입니다.

 

-- 1페이지: 0번째부터 10개 조회
SELECT * FROM articles
ORDER BY created_at DESC
LIMIT 10 OFFSET 0;

-- 2페이지: 10번째부터 10개 조회
SELECT * FROM articles
ORDER BY created_at DESC
LIMIT 10 OFFSET 10;

-- 3페이지: 20번째부터 10개 조회
SELECT * FROM articles
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;

이렇게 페이지 별로 필요한 데이터와 시작할 순서를 쿼리문에서 LIMIT과 OFFSET으로 설정하게 되면 필요한 데이터만 조회할 수 있게 됩니다.

 

Java + JPA 기준

PageRequest pageRequest = PageRequest.of(0, 10, Sort.by("createdAt").descending());
Page<Article> page = articleRepository.findAll(pageRequest);

PageRequest.of(pageNumber, pageSize)를 사용하여 Spring Data JPA에서도 페이징 구현이 가능합니다.