백엔드/DB

[DB] OFFSET과 LIMIT을 이용한 Pagination(페이징 처리)

tero1115 2024. 7. 24. 13:15

OFFSET과 LIMIT을 사용한 SQL 페이징 예제

데이터베이스에서 많은 양의 데이터를 한 번에 가져오는 것은 비효율적일 수 있습니다. 이를 해결하기 위해 페이징(paging) 기법을 사용하여 필요한 만큼의 데이터만 가져오도록 할 수 있습니다. 이번 포스트에서는 OFFSET과 LIMIT을 사용하여 페이징을 구현하는 방법을 설명하겠습니다.

페이징의 기본 개념

페이징은 데이터를 여러 페이지로 나누어 한 페이지에 일정 개수의 데이터만 보여주는 방식입니다. 이를 통해 데이터베이스에 과부하를 줄이고, 사용자에게 더 나은 경험을 제공합니다.

OFFSET과 LIMIT의 역할

  • LIMIT: 한 번에 가져올 데이터의 최대 개수를 설정합니다. 예를 들어, 한 페이지에 10개의 데이터를 보여주고 싶다면 LIMIT 10을 사용합니다.
  • OFFSET: 가져올 데이터의 시작 위치를 설정합니다. 예를 들어, 첫 페이지는 처음 10개의 데이터를 가져오고, 두 번째 페이지는 그 다음 10개의 데이터를 가져와야 합니다. 이를 위해 OFFSET을 사용하여 시작 위치를 지정합니다.

SQL 페이징 예제

다음은 OFFSET과 LIMIT을 사용하여 페이징을 구현하는 예제입니다.

예제: 직원 목록 페이징

가정: 직원(employee) 테이블에서 직원 목록을 10개씩 페이지로 나누어 가져오고 싶습니다.

  1. 첫 번째 페이지:
    • LIMIT 10 OFFSET 0: 처음 10개의 데이터를 가져옵니다.
    sql
    코드 복사
    SELECT * FROM employee LIMIT 10 OFFSET 0;
  2. 두 번째 페이지:
    • LIMIT 10 OFFSET 10: 11번째 데이터부터 20번째 데이터까지 가져옵니다.
    sql
    코드 복사
    SELECT * FROM employee LIMIT 10 OFFSET 10;
  3. 세 번째 페이지:
    • LIMIT 10 OFFSET 20: 21번째 데이터부터 30번째 데이터까지 가져옵니다.
    sql
    코드 복사
    SELECT * FROM employee LIMIT 10 OFFSET 20;

PHP 코드에서의 페이징 구현

아래는 PHP 코드에서 페이지 번호와 한 페이지당 데이터 개수를 사용하여 OFFSET 값을 계산하고, 이를 SQL 쿼리에 적용하는 예제입니다.

<?php
// 데이터베이스 연결
$DB = new mysqli('localhost', 'username', 'password', 'database');

// 현재 페이지 번호와 페이지당 데이터 개수 설정
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$items_per_page = 10;
$offset = ($page - 1) * $items_per_page;

// 전체 직원 수 조회
$total_sql = "SELECT COUNT(*) as total FROM employee";
$total_result = $DB->query($total_sql);
$total_row = $total_result->fetch_assoc();
$total_count = $total_row['total'];
$total_pages = ceil($total_count / $items_per_page);

// 현재 페이지의 직원 목록 조회
$sql = "SELECT * FROM employee LIMIT $items_per_page OFFSET $offset";
$result = $DB->query($sql);

// 결과 출력
$employees = [];
while ($row = $result->fetch_assoc()) {
    $employees[] = $row;
}

// JSON 형식으로 출력
$output = [
    'current_page' => $page,
    'total_pages' => $total_pages,
    'employees' => $employees,
];

header('Content-Type: application/json');
echo json_encode($output);
?>

이제 이 PHP 코드는 page 파라미터에 따라 직원 목록을 페이지별로 잘라서 가져옵니다. 예를 들어, http://example.com/employees.php?page=2로 요청하면 두 번째 페이지의 직원 목록을 JSON 형식으로 반환합니다.

결론

OFFSET과 LIMIT을 사용하여 페이징을 구현하면 대용량 데이터를 효율적으로 처리하고, 사용자에게 필요한 만큼의 데이터만 제공할 수 있습니다