[flutter] 네트워크 요청 실패 시 재시도 로직 구현하기

안녕하세요! 이번에는 Flutter 앱에서 네트워크 요청이 실패한 경우에 자동으로 재시도하는 로직을 구현하는 방법을 알아보겠습니다.

1. Retry 패키지 설치

먼저, retry 패키지를 프로젝트에 추가해야 합니다. retry 패키지는 네트워크 요청 실패 시 자동으로 재시도해주는 기능을 제공합니다. 다음 명령어를 실행하여 패키지를 설치합니다:

flutter pub add retry

2. Retry 로직 구현하기

이제 retry 패키지를 사용하여 재시도 로직을 구현해보겠습니다. 먼저, 네트워크 요청을 보낼 API 메서드를 만들어야 합니다. 예를 들어, 다음과 같이 fetchData라는 메서드가 있다고 가정해봅시다:

Future<dynamic> fetchData() async {
  // 네트워크 요청 로직 구현
}

이제 retry 패키지를 사용하여 재시도 로직을 추가해보겠습니다. 메서드를 다음과 같이 수정해주세요:

import 'package:retry/retry.dart';

Future<dynamic> fetchDataWithRetry() async {
  final retryOptions = RetryOptions(maxAttempts: 3);  // 최대 3번 재시도 설정

  final response = await retry(
    () => fetchData(),  // fetchData 메서드를 호출하기 위해 사용
    retryIf: (e) => e is SocketException,  // 네트워크 에러가 발생한 경우에만 재시도
    retryOptions: retryOptions,
  );

  return response;
}

fetchDataWithRetry 메서드에서 retry 함수를 사용하여 fetchData 메서드를 호출하는 부분을 감싸줍니다. retryIf 콜백 함수를 사용하여 네트워크 에러가 발생한 경우에만 재시도하도록 설정할 수 있습니다.

위 예시에서는 최대 3번의 재시도를 설정했지만, 필요에 따라 RetryOptions 클래스를 사용하여 재시도 설정을 변경할 수 있습니다.

3. 사용하기

이제 fetchDataWithRetry 메서드를 사용하여 네트워크 요청을 보낼 수 있습니다. 예를 들어, 다음과 같이 사용할 수 있습니다:

fetchDataWithRetry().then((response) {
  // 성공적으로 데이터를 받아온 경우 처리
}).catchError((error) {
  // 최대 재시도 횟수를 모두 시도한 후에도 에러가 발생한 경우 처리
});

위 예시에서는 then을 사용하여 데이터를 받아온 경우를 처리하고, catchError를 사용하여 최대 재시도 횟수를 모두 시도한 후에도 에러가 발생한 경우를 처리하고 있습니다.

결론

위의 간단한 예제를 통해 Flutter 앱에서 네트워크 요청 실패 시 자동으로 재시도하는 로직을 구현하는 방법을 알아보았습니다. retry 패키지를 사용하면 편리하게 재시도 로직을 구현할 수 있으니, 비동기 네트워크 요청에서 문제가 발생할 때 유용하게 사용할 수 있습니다.

더 자세한 내용은 retry 패키지 문서를 참고하시기 바랍니다.