서버 사이드 개발에서 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.
'Dart > Dart Server' 카테고리의 다른 글
[중급] Dart 서버 인증 및 보안/ JWT(JSON Web Token)를 사용한 사용자 인증 구현 (0) | 2024.09.12 |
---|---|
[중급] Dart 서버 비동기 프로그래밍 심화/ Stream을 사용한 실시간 데이터 처리 및 이벤트 핸들링 (1) | 2024.09.11 |
[중급] Dart 서버 비동기 프로그래밍 심화/ Dart의 비동기 프로그래밍 심화 개념 (async/await, Future) (0) | 2024.09.11 |
[중급] Dart 서버 데이터베이스 연동/ 간단한 데이터 모델링 및 쿼리 작성 (1) | 2024.09.11 |
[중급] Dart 서버 데이터베이스 연동/ ORM(Object-Relational Mapping) 도구 사용법 (Aqueduct ORM 등) (0) | 2024.09.11 |