본문 바로가기
Dart/Dart Server

[고급] Dart 서버 API 고급 설계 및 최적화/ 페이징 및 필터링을 통한 대량 데이터 처리 최적화

by Maccrey Coding 2024. 9. 13.
반응형

 

대량의 데이터를 처리하는 서버 API를 설계할 때, 데이터의 효율적인 전송과 처리는 성능과 사용자 경험에 큰 영향을 미칩니다.

페이징과 필터링은 데이터를 효과적으로 처리하고 성능을 최적화하는 두 가지 중요한 기법입니다.

이 블로그 포스트에서는 Dart를 사용하여 페이징필터링을 통해 대량 데이터를 최적화하는 방법을 초보자도 쉽게 이해할 수 있도록 설명하겠습니다.

1. 페이징(Paging)이란?

페이징은 데이터를 여러 페이지로 나누어 제공하는 방법입니다. 사용자가 한 번에 전체 데이터를 받지 않고, 요청한 페이지에 해당하는 데이터만 받아볼 수 있도록 합니다. 이 방법은 특히 대량의 데이터를 다룰 때 유용합니다.

2. 필터링(Filtering)이란?

필터링은 사용자가 관심 있는 데이터만 선택하여 조회할 수 있도록 하는 방법입니다. 사용자는 조건에 맞는 데이터만 요청할 수 있으며, 서버는 요청된 조건에 따라 데이터를 필터링하여 반환합니다.

3. Dart 서버에서 페이징 및 필터링 구현하기

이 예제에서는 Dart와 shelf 패키지를 사용하여 페이징과 필터링을 적용한 서버를 구현합니다.

3.1. 프로젝트 설정

먼저, shelf 패키지를 설치하고 기본 서버를 설정합니다. 프로젝트의 pubspec.yaml 파일에 shelf 패키지를 추가합니다.

dependencies:
  shelf: ^1.4.0

패키지를 설치합니다.

dart pub get

3.2. 서버 구현

bin/server.dart 파일을 생성하고 아래의 코드를 입력하여 페이징 및 필터링 기능을 추가합니다.

import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as io;
import 'dart:convert';

void main() async {
  final handler = const Pipeline()
      .addHandler(_handler);

  final server = await io.serve(handler, 'localhost', 8080);
  print('서버가 http://${server.address.host}:${server.port}에서 실행 중입니다.');
}

Response _handler(Request request) {
  final queryParams = request.requestedUri.queryParameters;

  // 페이징 처리
  final page = int.tryParse(queryParams['page'] ?? '1') ?? 1;
  final pageSize = int.tryParse(queryParams['pageSize'] ?? '10') ?? 10;
  final startIndex = (page - 1) * pageSize;
  final endIndex = startIndex + pageSize;

  // 필터링 처리
  final filter = queryParams['filter']?.toLowerCase() ?? '';

  final data = List.generate(100, (index) => 'Item $index');
  final filteredData = data.where((item) => item.toLowerCase().contains(filter)).toList();

  final pagedData = filteredData.sublist(
    startIndex,
    endIndex > filteredData.length ? filteredData.length : endIndex,
  );

  final result = {
    'page': page,
    'pageSize': pageSize,
    'totalItems': filteredData.length,
    'totalPages': (filteredData.length / pageSize).ceil(),
    'data': pagedData,
  };

  return Response.ok(jsonEncode(result), headers: {'Content-Type': 'application/json'});
}

이 코드에서

  • page와 pageSize 파라미터를 사용하여 페이징을 처리합니다.
  • filter 파라미터를 사용하여 필터링을 수행합니다.
  • 데이터의 startIndex와 endIndex를 계산하여 필요한 부분만 가져옵니다.
  • 최종 결과를 JSON 형식으로 반환합니다.

3.3. 요청 예제

위 서버를 실행한 후, 다음과 같은 URL로 요청을 보내 페이징과 필터링을 테스트할 수 있습니다:

  • 전체 데이터 조회: http://localhost:8080
  • 2페이지 데이터 조회 (페이지 크기: 5): http://localhost:8080?page=2&pageSize=5
  • 'item 1'을 포함한 데이터 조회: http://localhost:8080?filter=item%201

4. 페이징 및 필터링 최적화 팁

  • 인덱스 활용: 데이터베이스에서 페이징과 필터링을 수행할 때 인덱스를 활용하여 쿼리 성능을 최적화합니다.
  • 캐싱: 자주 조회되는 데이터는 캐싱하여 서버의 부하를 줄입니다.
  • 데이터 압축: 응답 데이터를 압축하여 네트워크 대역폭을 절약합니다.

이 블로그 포스트에서는 Dart와 shelf를 사용하여 대량 데이터를 처리하는 페이징필터링을 구현하는 방법을 소개했습니다.

페이징과 필터링은 대량 데이터를 효율적으로 처리하고 서버의 성능을 최적화하는 데 중요한 기법입니다.

이 기술들을 활용하여 더 나은 사용자 경험을 제공할 수 있습니다.

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

반응형