dio란?
dio는 Flutter와 Dart 환경에서 가장 널리 사용되는 HTTP 네트워킹 패키지입니다. 기본적인 웹 요철뿐만 아니라, 인터셉터(Interceptor), 파라미터 글로벌 설정(BaseURL 등), 파일 다운로드/업로드, 타임아웃 처리, 요청 취소 등 복잡한 네트워크 작업을 매우 적은 코드로 쉽게 처리할 수 있게 해주는 통신 라이브러리입니다.
기존 http 패키지와의 차이점
Flutter에서 API 통신을 할 때 보통 기본 http 패키지로 시작하지만, 앱이 커지면 거의 대부분 dio로 넘어갑니다.
| 기능 | 기본 http패키지 |
dio패키지 |
|---|---|---|
| 복잡도 | 가볍고 단순한 통신에 적합 | 기능이 많고 엔터프라이즈급 앱에 적합 |
| JSON 파싱 | jsonDecode()로 직접 변환해야 함 |
응답을 자동으로 JSON₩ 변환해줌 |
| 인터셉터(Interceptor) | 직접 구현해야 해서 매우 번거로움 | 기본 내장(매 요청/응답 지점마다 가로채기 가능) |
| 공통 설정(BaseURL 등) | 매번 수동으로 주소를 합쳐서 호출해야 함 | BaseOptions에 등록해두면 알아서 붙음 |
| 파일 업로드(FormData) | 복잡한 코드를 직접 작성해야 함 | FormData.fromMap()으로 한줄 컷 가능 |
| 요청 취소 및 타임아웃 | 구현이 까다롭거나 제한적임 | CancelToken및 속성 제공으로 매우 쉬움 |
요약:
http패키지는 순정 기본 도구라면,dio는 자동화 옵션이 잔뜩 달린 풀옵션 도구입니다. 토큰을 헤더에 넣어서 관리하는 로그인/인증 로직이 있다면 무조건 dio를 쓰는 것이 정신건강에 좋습니다.
설치
dependencies:
flutter:
sdk: flutter
dio: ^5.4.3사용
전역 설정 및 인터셉터 추가(보통 싱글톤이나 Provider로 관리)
import 'package:dio/dio.dart'; // 1. 기본 설정 (BaseOptions) final options = BaseOptions( baseUrl: 'https://api.example.com', connectTimeout: const Duration(seconds: 5), // 5초동안 응답 없으면 에러 receiveTimeout: const Duration(seconds: 3), ); final dio = Dio(options) // 2. 인터셉터 추가 (모든 통신 전에 토큰 검사/에러 로그 출력 등) dio.interceptors.add( InterceptorsWrapper( onRequest: (options, handler) { // 모든 API 요청을 보내기 직전에 실행됨 (예: 헤더에 토큰 넣기) options.headers['Authorization'] = 'Bearer 유저토큰1234'; return handler.next(options); }, onResponse: (response, handler) { // 서버에서 정상 응답이 왔을 때 return handler.next(response); }, onError: (DioException e, handler) { // 에러가 났을 때 (예: 토큰 만료 시 자동 재발급 로직 실행) return handler.next(e); }, ), );API 요청하기(기본 호출 & 자동 JSON 파싱)
// GET 요청 (http와 달리 jsonDecoder를 안 써도 이미 Map으로 들어옴) final response = await dio.get('/users/1'); print(response.data['name']); // POST 요청 (Body 데이터를 직관적으로 보냄) final postResponse = await dio.post( '/login', data: {'id': 'user1', 'password': '123'}, );
Swift와 비교
| Flutter(dio) | Swift(Alamofire/URLSession) | 역할 |
|---|---|---|
기본 http패키지 |
URLSession |
언어에서 기본 제공하는 순정 네트워크 클래스 |
dio패키지 |
Alamofire |
보일러플레이트를 줄여주는 강력한 서드파티 라이브러리 |
BaseOptions |
URLSessionConfiguration |
타임아웃, 중복 헤더, BaseURL 등 전역 환경 설정 |
Interceptor |
RequestInterceptor |
통신을 쏘기 직전이나 받기 직전에 코드를 가로채는 역할 |
FormData |
MultipartFormData |
이미지 다운로드/업로드 등 큰 파일을 보낼 때 쓰는 방식 |
| 자동 JSON 파싱 | Codable 프로토콜 기반 디코딩 |
응답으로 온 데이터를 별도 변환 없이 바로 딕셔너리로 쓸 수 있음 |
사용 흐름
dio인스턴스 생성 : 앱 생명주기 내내 재사용할 전역dio객체를 만듭니다.BaseOptions부여 : 앱 서버의 고정된 루트 도메인(baseUrl)이나 공통 타임아웃 제한 시간을 설정하여 매번 적는 수고를 덜어줍니다.Interceptor장착 :- 로그인 토큰 주입 :
onRequest에서 늘 헤더에 최신 토큰을 꽂아줍니다. - 토큰 만료 재발급 :
onError에서 서버가 401(인증 에러)을 내려보내면, 토큰을 갱신하고 실패했던 통신을 다시 진행합니다.
- 로그인 토큰 주입 :
- API 호출 방식(Read/Write) : API 명세서에 맞춰
dio.get(),dio.post(),dio.patch(),dio.delete()메서드를 호출합니다. - 모델 매치(JSON -> Dart Object) : 응답받은
response.data(보통Map<String, dynamic>)코드를 모델 클래스의fromJson()공장에 넣어서 다트 객체로 바꿔 화면에 뿌려줍니다.
간단히 요약하자면 Flutter의 dio패키지는 Swift에서 URLSession을 쓰기 귀찮아서 Alamofire를 사용하는거구나 라고 이해하시면 됩니다.
