guricode

[영화정보앱 만들기-2] [트러블 슈팅] Dio 인터셉터 handler.next 누락으로 요청 영구 대기 본문

앱/Flutter&Dart

[영화정보앱 만들기-2] [트러블 슈팅] Dio 인터셉터 handler.next 누락으로 요청 영구 대기

agentrakugaki 2025. 8. 27. 11:27
  • [상황 인지]
      • usecase.execute() 이후 진행 멈춤.
      • 콘솔에 usecase 로그까지만 출력. 에러/타임아웃 없음.
      • 화면은 로딩 스피너 유지.
    • [고민]
      • 왜 Future가 완료되지 않을까?
      • 네트워크 계층에서 요청이 막힌 듯하다.
      • Dio Interceptor.onRequest에서 체인을 진행하지 않으면 파이프라인이 정지한다.
    • [적용]
      • 인터셉터에 handler.next(options) 추가.
      • 타임아웃·로그로 빠른 탐지 설정.

 

 

              문제코드

    • import 'package:dio/dio.dart';
      import 'package:flutter_dotenv/flutter_dotenv.dart';
      
      //통신
      class DioClient {
      // await dotenv.load(fileName: ".env");
        static Dio get client => _client;
      
        static Dio _client = Dio(
          BaseOptions(
            baseUrl: 'https://api.themoviedb.org/3/movie/',
            validateStatus: (status) => true,
          ),
        )..interceptors.add(interceptor); //하이잭킹 -> 헤더
        static AuthInterceptor interceptor = AuthInterceptor();
      }
      
      class AuthInterceptor extends Interceptor {
        @override
        void onRequest(
          RequestOptions options,
          RequestInterceptorHandler handler,
        ) {
          //
          options.headers.addAll(
            {
              'Authorization': 'Bearer ${dotenv.env['TMDB_TOKEN']}',
              'accept': 'application/json',
            },
          );
        }
      }
       
    •  
    •  
    •  
    •  
    • 해결코드
import 'package:dio/dio.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';

//통신
class DioClient {
// await dotenv.load(fileName: ".env");
  static Dio get client => _client;

  static Dio _client = Dio(
    BaseOptions(
      baseUrl: 'https://api.themoviedb.org/3/movie/',
      validateStatus: (status) => true,
    ),
  )..interceptors.add(interceptor); //하이잭킹 -> 헤더
  static AuthInterceptor interceptor = AuthInterceptor();
}

class AuthInterceptor extends Interceptor {
  @override
  void onRequest(
    RequestOptions options,
    RequestInterceptorHandler handler,
  ) {
    //
    options.headers.addAll(
      {
        'Authorization': 'Bearer ${dotenv.env['TMDB_TOKEN']}',
        'accept': 'application/json',
      },
    );
    super.onRequest(options, handler);
  }
}

 

  •  
  •  
    •   

      • [결과]
        • 요청이 정상 완료(200 또는 401 등)되고 화면 로딩 해제.
        • 무한 대기 제거. 디버깅 로그로 원인 분리 쉬워짐.
        • 내가 배운 것:
          • Dio 인터셉터는 항상 handler.next/resolve/reject로 체인을 종료해야 한다.
          • 무한 대기는 대개 “체인 미호출”이나 “await 누락” 같은 제어 흐름 문제다.
          • 타임아웃·요청/응답 로깅을 기본값으로 둬서 조기 감지하라.

체크리스트

  • onRequest 마지막 줄에 handler.next(options) 있는가.
  • .env가 로드됐고 TMDB_TOKEN이 비어 있지 않은가.
  • baseUrl와 엔드포인트 조합이 중복되지 않는가.
  • 타임아웃이 설정되어 있는가.
  • 401, 404 등 오류도 “완료”로 떨어지는지 로그 확인.

 

 

 

' > Flutter&Dart' 카테고리의 다른 글

[클린아키텍쳐]Clean Architecture -1  (1) 2025.08.30
CICD 관련 메모  (0) 2025.08.29
[영화정보앱 만들기] 의존성 설정,dotenv  (2) 2025.08.26
MVVM 패턴 연습  (3) 2025.08.25
[TIL] 20250819 - GoRouter,Responsive UI  (0) 2025.08.19