022. Dart로 API 통신하기: JSON 데이터 처리 방법
Dart는 Google에서 개발한 현대적인 프로그래밍 언어로, 주로 Flutter 앱 개발에 쓰입니다. 하지만 Dart는 서버 사이드 개발에도 사용될 수 있으며, REST API와의 통신 또한 간단하게 처리할 수 있습니다. 이 글에서는 Dart를 사용하여 API와 통신하고 JSON 데이터를 처리하는 방법에 대해 자세히 설명하겠습니다.
1. Dart 환경 설정
Dart를 시작하기 위해서는 우선 Dart SDK를 설치해야 합니다. Dart SDK를 설치한 후, 기본 Dart 프로젝트를 생성합니다. Terminal 또는 Command Prompt를 열고 아래 명령어를 실행하세요.
dart create my_api_app
프로젝트를 생성한 후, my_api_app
디렉토리로 이동하여 pubspec.yaml
파일을 엽니다. API 통신과 JSON 처리를 위해 http
패키지를 추가해야 합니다.
dependencies:
http: ^0.14.0
패키지를 추가한 후, 프로젝트 루트 디렉토리에서 다음 명령어를 실행하여 종속성을 설치합니다.
dart pub get
2. HTTP 패키지를 사용한 API 통신
이제 우리는 http
패키지를 사용하여 API와 통신할 준비가 되었습니다. http
패키지를 사용하기 위해 먼저 패키지를 import 해야 합니다.
import 'package:http/http.dart' as http;
예를 들어, JSONPlaceholder라는 무료 API를 사용하여 사용자 정보를 가져오는 예제를 만들어보겠습니다. 해당 API는 가상의 사용자 데이터를 제공합니다. 아래와 같이 GET 요청을 수행하여 데이터를 가져올 수 있습니다.
Future
fetchUsers() async { final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/users')); if (response.statusCode == 200) { print('Users fetched successfully: ${response.body}'); } else { throw Exception('Failed to load users'); } }
3. JSON 데이터 처리
API에서 가져온 데이터는 JSON 형식입니다. Dart에서는 JSON 데이터를 쉽게 처리할 수 있도록 dart:convert
라이브러리를 제공합니다. JSON 데이터를 Dart 객체로 변환하기 위해 다음과 같이 jsonDecode
함수를 사용할 수 있습니다.
import 'dart:convert';
...
if (response.statusCode == 200) {
var users = jsonDecode(response.body);
print('Users: $users');
}
위 코드는 JSON 응답을 Dart의 Map 형태로 변환합니다. 이제 우리는 이 데이터를 Dart 객체로 매핑하여 사용해보겠습니다. 사용자 정보를 저장할 모델 클래스를 정의해보겠습니다.
class User {
final int id;
final String name;
final String email;
User({required this.id, required this.name, required this.email});
factory User.fromJson(Map
json) {
return User(
id: json[‘id’],
name: json[‘name’],
email: json[’email’],
);
}
}
이제 JSON 데이터를 User 객체 목록으로 변환할 수 있는 함수를 작성해보겠습니다.
List
parseUsers(String responseBody) { final parsed = jsonDecode(responseBody).cast>(); return parsed.map((json) => User.fromJson(json)).toList(); }
이제 우리가 가져온 사용자 데이터를 fetchUsers
함수에서 사용할 수 있습니다.
Future
fetchUsers() async { final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/users')); if (response.statusCode == 200) { List users = parseUsers(response.body); users.forEach((user) { print('${user.name} - ${user.email}'); }); } else { throw Exception('Failed to load users'); } }
4. API 데이터 저장 및 업데이트
이제 API에서 데이터를 가져오는 방법을 배웠으니, 데이터를 업데이트하거나 추가하는 방법도 알아보겠습니다. PATCH 요청이나 POST 요청을 사용하여 서버에 데이터를 전송할 수 있습니다. 예를 들어, 사용자를 추가하려면 다음과 같이 POST 요청을 작성할 수 있습니다.
Future
createUser(User user) async { final response = await http.post( Uri.parse('https://jsonplaceholder.typicode.com/users'), headers: { 'Content-Type': 'application/json; charset=UTF-8', }, body: jsonEncode({ 'name': user.name, 'email': user.email, }), ); if (response.statusCode == 201) { print('User created successfully: ${response.body}'); } else { throw Exception('Failed to create user'); } }
이와 같은 방식으로 API에 데이터를 POST하여 사용자 정보를 추가할 수 있습니다. 한편, 기존 사용자 정보를 수정하는 방법은 PATCH 요청을 사용하여 다음과 같이 처리할 수 있습니다.
Future
updateUser(int id, User user) async { final response = await http.patch( Uri.parse('https://jsonplaceholder.typicode.com/users/$id'), headers: { 'Content-Type': 'application/json; charset=UTF-8', }, body: jsonEncode({ 'name': user.name, 'email': user.email, }), ); if (response.statusCode == 200) { print('User updated successfully: ${response.body}'); } else { throw Exception('Failed to update user'); } }
5. 오류 처리
API와의 통신에서 오류가 발생할 수 있기 때문에 오류 처리는 매우 중요합니다. 위의 코드 예제에서 throw Exception
을 통해 발생한 오류를 던지게 되지만, 사용자가 보기 쉽게 처리하려면 적절한 오류 메시지 및 오류 유형을 정의하는 것이 필요합니다.
try {
await fetchUsers();
} catch (e) {
print('An error occurred: ${e.toString()}');
}
6. 테스트 및 검증
마지막으로, API 통신 기능을 테스트하는 것은 개발 과정에서 중요한 부분입니다. Dart의 test
패키지를 활용하여 작성한 함수들을 단위 테스트할 수 있습니다. 예를 들어, fetchUsers
함수를 테스트하는 샘플 코드는 다음과 같습니다.
import 'package:test/test.dart';
void main() {
test('fetchUsers returns a list of Users', () async {
final users = await fetchUsers();
expect(users, isA
>());
});
}
테스트를 작성하고 실행하여 API 통신 로직이 예상대로 작동하는지 확인합니다.
결론
Dart를 사용하여 REST API와 통신하고 JSON 데이터를 처리하는 과정은 생각보다 간단합니다. HTTP 요청을 수행하고 받은 JSON 데이터를 Dart 객체로 변환하는 모든 과정은 http
및 dart:convert
라이브러리를 통해 쉽게 다룰 수 있습니다. 또한, 오류 처리 및 테스트를 통해 코드를 더욱 견고하게 만들 수 있습니다.
Dart 언어 자체의 장점과 Flutter 프레임워크의 힘을 빌려, 더 많은 애플리케이션에서 효율적으로 API를 활용할 수 있게 되길 바랍니다.