대량의 데이터를 처리하는 서버 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.
'Dart > Dart Server' 카테고리의 다른 글
[고급] Dart 서버 마이크로서비스 아키텍처 / gRPC와 같은 RPC 프레임워크를 사용한 서비스 간 통신 (0) | 2024.09.14 |
---|---|
[고급] Dart 서버 마이크로서비스 아키텍처 / 마이크로서비스 개념과 Dart의 적용 가능성 (3) | 2024.09.14 |
[고급] Dart 서버 API 고급 설계 및 최적화/ 캐싱을 통한 성능 최적화 (HTTP 캐시 헤더, Redis 사용 등) (0) | 2024.09.13 |
[고급] Dart 서버 API 고급 설계 및 최적화/ API 버저닝 전략과 구현 방법 (0) | 2024.09.13 |
[중급] Dart 서버 인증 및 보안/ Dart 서버 보안 모범 사례 (HTTPS 설정, 입력 검증, SQL 인젝션 방지 등) (1) | 2024.09.12 |