[Flutter] dio 패키지에 대한 짧막한 설명

2026. 3. 11. 12:32·Flutter

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

사용

  1. 전역 설정 및 인터셉터 추가(보통 싱글톤이나 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);
            },
        ),
    );
  2. 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 프로토콜 기반 디코딩 응답으로 온 데이터를 별도 변환 없이 바로 딕셔너리로 쓸 수 있음

사용 흐름

  1. dio 인스턴스 생성 : 앱 생명주기 내내 재사용할 전역 dio 객체를 만듭니다.
  2. BaseOptions 부여 : 앱 서버의 고정된 루트 도메인(baseUrl)이나 공통 타임아웃 제한 시간을 설정하여 매번 적는 수고를 덜어줍니다.
  3. Interceptor 장착 :
    • 로그인 토큰 주입 : onRequest에서 늘 헤더에 최신 토큰을 꽂아줍니다.
    • 토큰 만료 재발급 : onError에서 서버가 401(인증 에러)을 내려보내면, 토큰을 갱신하고 실패했던 통신을 다시 진행합니다.
  4. API 호출 방식(Read/Write) : API 명세서에 맞춰 dio.get(), dio.post(), dio.patch(), dio.delete() 메서드를 호출합니다.
  5. 모델 매치(JSON -> Dart Object) : 응답받은 response.data(보통 Map<String, dynamic>)코드를 모델 클래스의 fromJson() 공장에 넣어서 다트 객체로 바꿔 화면에 뿌려줍니다.

간단히 요약하자면 Flutter의 dio패키지는 Swift에서 URLSession을 쓰기 귀찮아서 Alamofire를 사용하는거구나 라고 이해하시면 됩니다.

'Flutter' 카테고리의 다른 글
  • [Flutter] cached_network_image에 대한 짧막한 설명
  • [Flutter] go_router 패키지에 대한 짧막한 설명
  • [Flutter] Isar 패키지에 대한 짧막한 설명
  • [Flutter] Riverpod 패키지에 대한 짧막한 설명
GwanSon
GwanSon
귀찮음과 불편함을 해결하는 개발자가 되자.
  • GwanSon
    관슨의 개발일지
    GwanSon
  • 전체
    오늘
    어제
    • 분류 전체보기 (57)
      • iOS (5)
      • swift (16)
      • UIKit (0)
      • swiftUI (3)
      • 알고리즘 (9)
      • CS (8)
      • 면접 (0)
      • Flutter (11)
      • 회고 (3)
      • 잡담 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    UIImagePickerController
    SwiftUI
    토스
    SDK
    부스트캠프
    FirebaseAuth
    네이버 부스트캠프
    백준
    fluuter
    Flutter
    Riverpod
    부스트캠프 10기
    Dio
    네이버 부스트캠프 후기
    구슬 탈출2
    cached_network_image
    go_router
    모듈화
    Provider
    android
    Swift
    ISAR
    ios
    후기
    boj
    Firebase
    fatal error
    2025 토스 Next
    챌린지
    tuist
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
GwanSon
[Flutter] dio 패키지에 대한 짧막한 설명
상단으로

티스토리툴바