Flutter

Flutter의 네트워크 성능 최적화 방법

wsstar 2025. 3. 27. 15:00
728x90
반응형

Flutter의 네트워크 성능 최적화 방법

Flutter 앱에서 네트워크 요청(Network Request)은 필수적인 요소이지만, 네트워크 성능이 최적화되지 않으면 로딩 속도 저하, 불필요한 데이터 소비, 배터리 소모 증가 등의 문제가 발생할 수 있습니다.

이 글에서는 Flutter에서 네트워크 성능을 최적화하는 방법을 설명하고, 효율적인 데이터 통신 기법을 소개하겠습니다.


1. 네트워크 성능 저하의 원인

Flutter에서 네트워크 성능이 저하되는 주요 원인은 다음과 같습니다.

  • 비효율적인 API 요청 (반복적인 HTTP 요청, 불필요한 데이터 전송)
  • 네트워크 응답 처리 지연
  • 캐싱 미사용
  • 대량의 데이터를 한 번에 처리
  • 잘못된 에러 처리

이러한 문제를 해결하면 네트워크 성능을 크게 향상시킬 수 있습니다.


2. dio를 활용한 네트워크 성능 최적화

Flutter에서 기본적으로 http 패키지를 사용할 수 있지만, dio 패키지는 네트워크 요청 속도 향상자동 압축, 캐싱 기능을 제공하여 성능 최적화에 유리합니다.

(1) dio 패키지 설치


flutter pub add dio

(2) dio를 활용한 네트워크 요청


import 'package:dio/dio.dart';

class ApiService {
  final Dio _dio = Dio(BaseOptions(
    baseUrl: 'https://jsonplaceholder.typicode.com',
    connectTimeout: Duration(seconds: 5), // 연결 제한 시간 설정
    receiveTimeout: Duration(seconds: 5), // 응답 제한 시간 설정
    headers: {'Accept': 'application/json'},
  ));

  Future<dynamic> fetchData() async {
    try {
      Response response = await _dio.get('/posts/1');
      return response.data;
    } catch (e) {
      print("네트워크 오류: $e");
      return null;
    }
  }
}

위 코드는 Dio를 사용하여 API 요청 속도 향상타임아웃 설정을 적용한 예제입니다.


3. API 요청 최적화

(1) 네트워크 요청 최소화

앱이 실행될 때마다 동일한 데이터를 반복적으로 요청하면 성능이 저하될 수 있습니다. 따라서 다음과 같은 방법으로 요청을 최소화할 수 있습니다.

  • 필요할 때만 데이터를 요청
  • API 응답을 캐싱하여 중복 요청 방지
  • WebSocket을 활용하여 실시간 데이터 업데이트

(2) CachedNetworkImage를 사용한 이미지 캐싱

Flutter에서 네트워크 이미지를 반복적으로 불러오면 성능 저하가 발생할 수 있습니다. 이를 방지하기 위해 cached_network_image 패키지를 사용할 수 있습니다.


flutter pub add cached_network_image

import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';

class CachedImageExample extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("이미지 캐싱 예제")),
      body: Center(
        child: CachedNetworkImage(
          imageUrl: 'https://example.com/image.jpg',
          placeholder: (context, url) => CircularProgressIndicator(),
          errorWidget: (context, url, error) => Icon(Icons.error),
        ),
      ),
    );
  }
}

CachedNetworkImage를 사용하면 동일한 이미지를 다시 다운로드하지 않고 캐싱하여 성능을 최적화할 수 있습니다.


4. 네트워크 데이터 압축 및 최적화

(1) JSON 데이터 압축

네트워크 데이터를 압축하여 성능을 개선할 수 있습니다. 서버에서 GZIP 압축을 활성화하면 네트워크 트래픽을 줄일 수 있습니다.


final Dio dio = Dio(BaseOptions(
  headers: {
    'Accept-Encoding': 'gzip',
  },
));

위 설정을 추가하면 서버가 GZIP을 지원하는 경우 데이터가 자동으로 압축되어 전송됩니다.

(2) 불필요한 데이터 필터링

필요한 데이터만 요청하도록 API 요청 시 필터링할 수 있습니다.


Response response = await dio.get('/posts', queryParameters: {'userId': 1});

위 코드에서는 userId=1인 데이터만 요청하여 네트워크 부하를 줄입니다.


5. WebSocket을 사용한 실시간 데이터 최적화

실시간 데이터 업데이트가 필요한 경우 WebSocket을 사용하면 지속적인 HTTP 요청보다 성능이 향상됩니다.

(1) web_socket_channel 패키지 설치


flutter pub add web_socket_channel

(2) WebSocket을 활용한 실시간 데이터 통신


import 'package:flutter/material.dart';
import 'package:web_socket_channel/web_socket_channel.dart';
import 'package:web_socket_channel/status.dart' as status;

class WebSocketExample extends StatefulWidget {
  @override
  _WebSocketExampleState createState() => _WebSocketExampleState();
}

class _WebSocketExampleState extends State<WebSocketExample> {
  final WebSocketChannel channel = WebSocketChannel.connect(Uri.parse('wss://example.com/socket'));

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text("WebSocket 예제")),
      body: StreamBuilder(
        stream: channel.stream,
        builder: (context, snapshot) {
          return Center(child: Text(snapshot.hasData ? '${snapshot.data}' : '데이터 수신 대기 중...'));
        },
      ),
    );
  }

  @override
  void dispose() {
    channel.sink.close(status.goingAway);
    super.dispose();
  }
}

WebSocket을 사용하면 반복적인 HTTP 요청 없이 실시간 데이터를 받아올 수 있어 네트워크 부하를 줄일 수 있습니다.


결론

Flutter에서 네트워크 성능을 최적화하는 방법은 다음과 같습니다.

  • dio 활용: 네트워크 요청 속도 향상 및 타임아웃 설정
  • API 요청 최소화: 캐싱 및 WebSocket 활용
  • 데이터 압축: GZIP 활성화 및 불필요한 데이터 제거
  • 이미지 캐싱: cached_network_image 사용

이제 네트워크 성능을 최적화하여 더욱 빠르고 안정적인 Flutter 앱을 개발해 보세요!

728x90
반응형