본문 바로가기
Dart/Dart Server

[중급] Dart 서버 비동기 프로그래밍 심화 / 비동기 API 호출 처리 및 병렬 작업 관리

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

 

서버 사이드 개발에서 API 호출은 자주 사용되는 작업입니다.

특히 비동기 API 호출을 효율적으로 처리하고 병렬 작업을 관리하는 것은 중요한 기술입니다.

Dart에서는 비동기 프로그래밍을 통해 이러한 작업을 간단하고 효율적으로 수행할 수 있습니다.

이번 블로그에서는 Dart에서 비동기 API 호출을 처리하고, 병렬 작업을 관리하는 방법에 대해 초보자도 이해할 수 있도록 설명하겠습니다.

1. 비동기 API 호출이란?

비동기 API 호출은 서버가 API 요청을 보내고, 응답이 올 때까지 기다리지 않고 다른 작업을 계속 수행하는 방식입니다. 이렇게 하면 서버가 효율적으로 여러 요청을 처리할 수 있습니다.

2. Future와 async/await를 사용한 비동기 API 호출

Dart에서 비동기 API 호출을 처리할 때 Future, async, await를 사용하여 비동기 작업을 간단하게 관리할 수 있습니다.

2.1 Future와 async 함수

Future는 비동기 작업의 결과를 나타내는 객체입니다. async 함수는 비동기 작업을 수행하는 함수로, 항상 Future를 반환합니다.

import 'dart:convert';
import 'package:http/http.dart' as http;

Future<Map<String, dynamic>> fetchData(String url) async {
  final response = await http.get(Uri.parse(url));
  
  if (response.statusCode == 200) {
    return jsonDecode(response.body);
  } else {
    throw Exception('Failed to load data');
  }
}
  • fetchData 함수는 비동기적으로 API 호출을 수행합니다.
  • await http.get(Uri.parse(url)): API 호출이 완료될 때까지 기다립니다.
  • jsonDecode(response.body): JSON 응답을 Dart 객체로 변환합니다.

2.2 await를 사용하여 결과 기다리기

await는 async 함수 내에서 Future의 결과를 기다리는 데 사용됩니다.

Future<void> main() async {
  try {
    final data = await fetchData('https://api.example.com/data');
    print(data);
  } catch (e) {
    print('Error: $e');
  }
}
  • await fetchData(...): fetchData가 완료될 때까지 기다립니다.
  • print(data): 결과를 출력합니다.
  • catch (e): 오류를 처리합니다.

3. 병렬 비동기 작업 관리하기

여러 비동기 작업을 동시에 처리할 때는 Future.wait()를 사용하여 모든 작업이 완료될 때까지 기다릴 수 있습니다.

3.1 병렬 API 호출 예제

다음은 여러 API 호출을 병렬로 처리하는 예제입니다.

Future<Map<String, dynamic>> fetchUserData() async {
  final response = await http.get(Uri.parse('https://api.example.com/user'));
  return jsonDecode(response.body);
}

Future<Map<String, dynamic>> fetchPostsData() async {
  final response = await http.get(Uri.parse('https://api.example.com/posts'));
  return jsonDecode(response.body);
}

Future<void> main() async {
  try {
    final results = await Future.wait([
      fetchUserData(),
      fetchPostsData(),
    ]);

    final userData = results[0];
    final postsData = results[1];

    print('User Data: $userData');
    print('Posts Data: $postsData');
  } catch (e) {
    print('Error: $e');
  }
}
  • Future.wait([...]): 여러 비동기 작업을 병렬로 실행하고, 모든 작업이 완료될 때까지 기다립니다.
  • results[0]: 첫 번째 Future의 결과
  • results[1]: 두 번째 Future의 결과

4. 비동기 작업과 병렬 작업에서 발생할 수 있는 문제

4.1 예외 처리

비동기 작업에서 예외가 발생할 수 있습니다. try/catch 블록을 사용하여 예외를 처리해야 합니다.

Future<void> main() async {
  try {
    final results = await Future.wait([
      fetchUserData(),
      fetchPostsData(),
    ]);

    // 작업 결과 처리
  } catch (e) {
    print('Error: $e');
  }
}
  • try: 비동기 작업을 시도합니다.
  • catch (e): 발생한 예외를 처리합니다.

4.2 타임아웃 설정

비동기 작업이 예상보다 오래 걸릴 경우, 타임아웃을 설정하여 일정 시간 후 작업을 중단할 수 있습니다.

Future<Map<String, dynamic>> fetchDataWithTimeout(String url) async {
  try {
    final response = await http.get(Uri.parse(url)).timeout(Duration(seconds: 5));
    return jsonDecode(response.body);
  } catch (e) {
    print('Error: $e');
    rethrow;
  }
}
  • timeout(Duration(seconds: 5)): 5초 후에 타임아웃이 발생합니다.

Dart에서 비동기 API 호출과 병렬 작업 관리는 서버 사이드 개발에서 매우 유용한 기술입니다.

Future, async/await를 활용하여 비동기 작업을 쉽게 처리하고, Future.wait()를 통해 병렬 작업을 관리할 수 있습니다.

이 블로그가 비동기 프로그래밍을 이해하는 데 도움이 되었기를 바랍니다.

 

추가적인 질문이나 도움이 필요하시면 언제든지 말씀해 주세요!

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

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

반응형