[flutter] 플러터(Flutter)에서 비동기(Asynchronous) 처리하기

플러터(Flutter)는 UI를 빠르고 반응적으로 만들기 위해 많은 작업을 비동기적으로 처리해야 합니다. 비동기 처리는 앱의 성능과 사용자 경험에 크게 기여하므로, 플러터에서 이를 효과적으로 처리하기 위한 방법에 대해 알아보겠습니다.

비동기 처리란?

비동기 처리는 앱의 실행중에 발생하는 오랜 시간이 걸리는 작업을 블로킹하지 않고 계속 진행하는 것을 의미합니다. 이는 주로 네트워크 요청, 데이터베이스 쿼리, 파일 입출력 등의 작업에서 사용됩니다.

Future와 async/await

플러터에서는 Future 객체와 async/await 키워드를 사용하여 비동기 처리를 구현할 수 있습니다. Future는 비동기 작업의 결과를 나타내는 객체이고, async는 비동기 함수를 정의하는 키워드입니다. await는 비동기 작업의 결과를 기다리는 키워드로, Future가 완료될 때까지 실행을 일시정지하고 다음 코드를 실행합니다.

아래는 Future와 async/await를 사용한 예시 코드입니다.

Future<int> fetchData() async {
  await Future.delayed(Duration(seconds: 1)); // 1초간 기다림
  return 42; // 결과를 반환
}

void main() async {
  print('데이터를 가져오는 중...');
  int data = await fetchData(); // fetchData의 결과를 기다림
  print('데이터: $data');
}

위 코드에서 fetchData 함수는 1초간 기다린 후 42를 반환하는 Future를 생성합니다. main 함수에서는 fetchData 함수를 await 키워드와 함께 호출하여 비동기로 데이터를 가져온 뒤 출력합니다.

에러 처리하기

비동기 작업 중에 발생하는 에러를 처리해야 합니다. 플러터에서는 try-catch문을 사용하여 비동기 작업의 에러를 처리할 수 있습니다.

Future fetchData() async {
  await Future.delayed(Duration(seconds: 1));
  throw Exception('데이터를 가져오는데 에러가 발생했습니다.');
}

void main() async {
  try {
    print('데이터를 가져오는 중...');
    await fetchData();
  } catch (e) {
    print('에러: $e');
  }
}

위 코드에서 fetchData 함수에서는 에러를 발생시키고, main 함수에서는 try-catch문으로 에러를 처리합니다. 에러가 발생하면 catch 블록이 실행되어 에러를 출력합니다.

비동기 작업 병렬 처리하기

때로는 여러 개의 비동기 작업을 동시에 처리해야 할 때가 있습니다. 플러터에서는 Future.wait() 메서드를 사용하여 여러 개의 Future를 병렬로 처리할 수 있습니다.

Future fetchData(int id) async {
  await Future.delayed(Duration(seconds: id % 3 == 0 ? 2 : 1));
  return '데이터 $id';
}

void main() async {
  List<Future> futures = [];
  
  for (int i = 1; i <= 5; i++) {
    futures.add(fetchData(i));
  }
  
  print('데이터를 가져오는 중...');
  List results = await Future.wait(futures);
  print('데이터: $results');
}

위 코드에서 fetchData 함수는 인자로 전달받은 id의 값에 따라 1초 또는 2초 동안 기다린 후, ‘데이터 id’를 반환합니다. main 함수에서는 for문을 통해 1부터 5까지의 데이터를 병렬로 가져온 뒤, Future.wait() 메서드를 사용하여 결과를 기다립니다.

결론

플러터에서 비동기 처리는 앱의 성능과 사용자 경험에 중요한 역할을 합니다. Future와 async/await를 사용하여 플러터에서 효과적으로 비동기 작업을 처리할 수 있으며, 에러 처리와 병렬 처리에 대한 기능도 함께 제공됩니다. 비동기 처리를 통해 앱의 성능을 향상시켜 사용자에게 더 나은 경험을 제공해보세요.

참고 자료