Flutter에서는 외부 서버와의 통신을 위해 다양한 패키지를 사용할 수 있으며, 사용 목적에 맞게 선택할 수 있습니다.
API 통신은 서버로부터 데이터를 받아오거나 서버로 데이터를 전송하기 위해 사용됩니다. Flutter에서는 주로 다음과 같은 패키지를 사용합니다.
http
패키지import 'package:http/http.dart' as http;
import 'dart:convert';
Future<void> fetchData() async {
final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/posts/1'));
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
print(data);
} else {
throw Exception('Failed to load data');
}
}
dio
패키지import 'package:dio/dio.dart';
final dio = Dio();
Future<void> fetchData() async {
try {
final response = await dio.get('https://jsonplaceholder.typicode.com/posts/1');
print(response.data);
} catch (e) {
print('Error: $e');
}
}
GetX
의 API 통신 기능graphql_flutter
패키지import 'package:graphql_flutter/graphql_flutter.dart';
final HttpLink httpLink = HttpLink('https://example.com/graphql');
ValueNotifier<GraphQLClient> client = ValueNotifier(
GraphQLClient(
link: httpLink,
cache: GraphQLCache(store: HiveStore()),
),
);
✅ 장점:
❗ 단점:
chopper
패키지import 'package:chopper/chopper.dart';
part 'post_service.chopper.dart';
()
abstract class PostService extends ChopperService {
(path: '/posts/{id}')
Future<Response> getPost(('id') int id);
static PostService create() {
final client = ChopperClient(
baseUrl: 'https://jsonplaceholder.typicode.com',
services: [
_$PostService(),
],
converter: JsonConverter(),
);
return _$PostService(client);
}
}
✅ 장점:
❗ 단점:
build_runner
를 통한 코드 생성을 필요로 함.retrofit
패키지dio
와 결합해 더욱 강력한 기능 제공.import 'package:retrofit/retrofit.dart';
import 'package:dio/dio.dart';
part 'client.g.dart';
(baseUrl: "https://jsonplaceholder.typicode.com")
abstract class RestClient {
factory RestClient(Dio dio, {String baseUrl}) = _RestClient;
("/posts/{id}")
Future<HttpResponse> getPost(("id") int id);
}
✅ 장점:
dio
와 결합해 인터셉터, 에러 핸들링 등 강력한 기능 지원.❗ 단점:
build_runner
) 사용 필요.import 'package:get/get.dart';
Future<void> fetchData() async {
final response = await GetConnect().get('https://jsonplaceholder.typicode.com/posts/1');
if (response.statusCode == 200) {
print(response.body);
}
}
다양한 API 통신 패키지가 존재하지만, 프로젝트의 규모와 필요에 따라 적절한 패키지를 선택해야 합니다. 다음은 주요 Flutter API 통신 패키지의 비교입니다.
패키지 | 장점 | 단점 | 주 사용 이유 |
---|---|---|---|
http | 간단한 사용법, 가벼움 | 인터셉터, 요청 취소, 파일 업로드 등의 고급 기능 부족 | 작은 프로젝트나 간단한 요청 처리에 적합 |
dio | 고급 기능 지원(인터셉터, 요청 취소, 파일 업로드), 에러 핸들링 용이 | 패키지 크기가 크고 설정이 복잡할 수 있음 | 대규모 프로젝트나 복잡한 API 통신에서 사용 |
GetX | 상태 관리, 라우팅, 의존성 주입과 통합, 빠르고 간단함 | 네트워크 로직 구조화 및 확장성 부족, 고급 네트워크 기능 부족 | 빠른 개발이 필요한 소규모 프로젝트 |
graphql_flutter | GraphQL API 통합, 실시간 데이터 처리 및 캐싱 지원 | REST API보다 설정이 복잡, GraphQL 도입 필요 | GraphQL 기반 서버와 통신 시 사용 |
chopper | Retrofit 스타일, 코드 자동 생성, 유지보수 용이 | 추가 설정 및 코드 생성 필요, 학습 곡선 존재 | REST API와의 직관적인 통신이 필요한 경우 |
retrofit | dio 와 결합해 강력한 기능 제공, 직관적인 API 작성 | build_runner 필요, 추가 설정 필요 | 고급 네트워크 로직 구현 및 코드 일관성이 중요한 경우 |
dio
와 결합해 효율적인 네트워크 레이어 구성.json_serializable
vs freezed
API 응답으로 받은 JSON 데이터를 모델로 변환하기 위해 Flutter에서는 **json_serializable
**과 **freezed
**를 많이 사용합니다.
json_serializable
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';
()
class User {
final int id;
final String name;
User({required this.id, required this.name});
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}
🔧 의존성 추가
dependencies:
json_annotation: ^4.8.1
dev_dependencies:
build_runner: ^2.4.0
json_serializable: ^6.6.1
⚡ 코드 생성
flutter pub run build_runner build
freezed
json_serializable
과 함께 사용 가능.import 'package:freezed_annotation/freezed_annotation.dart';
part 'user.freezed.dart';
part 'user.g.dart';
class User with _$User {
const factory User({
required int id,
required String name,
}) = _User;
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
🔧 의존성 추가
dependencies:
freezed_annotation: ^2.2.0
dev_dependencies:
build_runner: ^2.4.0
freezed: ^2.3.2
json_serializable: ^6.6.1
⚡ 코드 생성
flutter pub run build_runner build
json_serializable
vs freezed
비교구분 | json_serializable | freezed |
---|---|---|
목적 | JSON 직렬화/역직렬화 | 불변 객체, 데이터 클래스 자동 생성 |
가독성 | 코드가 단순하고 직관적 | 다양한 기능으로 인해 상대적으로 복잡함 |
기능 | JSON 변환에 특화 | 복사, 비교, 패턴 매칭 등 다양한 기능 제공 |
유지보수 | 간편한 데이터 모델 관리 | 복잡한 로직을 효율적으로 관리 가능 |
주 사용처 | 단순 데이터 변환이 필요한 경우 | 상태 관리, 복잡한 모델링이 필요한 경우 |
http
, 고급 네트워크 처리는 dio
사용.freezed
, 단순한 JSON 변환은 json_serializable
사용.