본문 바로가기
Dart, Flutter for App

Dart - 비동기 활용

by Oliver J 2024. 2. 7.
반응형

Dart 언어에서 비동기 프로그래밍을 위해 Future객체와 async와 await 키워드를 사용합니다. 즉, 특정 요청에 대해서 비동기적으로 수행하고 응답을 기다릴 때 async와 await를 사용할 수 있습니다.

비동기 함수로 정의하기 위해서는 함수명 뒤에 async 키워드 붙이면 됩니다. 비동기 작업을 수행하는 부분에는 await 키워드를 사용함으로써, 해당 작업이 완료될 때까지 대기하게 정의할 수 있습니다.

Future<void> futureFileCopy(String source, String target) async {
  final sourceFile = File(source);
  try {
    String data = await File(source).readAsString();
    if (data.contains(validName)) {
      data = data.replaceAll(validName, changedName);
    }
    await File(target).writeAsString(data);

  } on FileSystemException catch (e) {
    print(e.toString());
  }
}

위의 futureFileCopy 함수는 비동기 함수로 정의되었습니다. File객체를 활용하여 source의 데이타를 target에 write하도록 구현되어 있으며, await 키워드를 사용함으로써 해당 기능을 수행이 완료되어 응답이 올 때까지 대기를 한 후에 다음 로직을 수행합니다.

또한, 통신에서 많은 데이터를 Json으로 사용되어지는데요? 이때에도 await 을 활용하여 비동기적으로 처리 할 수 있습니다.

반응형
Future<String> getMovieInfo() async {
  await Future.delayed(Duration(seconds: 2));
  final mockData = {
    'title': 'Star Wars',
    'director': 'George Lucas',
    'year': 1977,
  };

void main() async {
  final String movieInfo = await getMovieInfo();
  print(MovieInfo.fromMap(jsonDecode(movieInfo)).director);
 
  // Same Result
  print(jsonDecode(await getMovieInfo())['director']);
}

위의 코드는 간단하게 Future<String> 으로 결과를 돌려받습니다. 이때에도 비동기적으로 리턴값을 활용해야 하므로 await키워드를 적어주어야 하며, void main() 에서 받기에 여기에도 async키워드를 추가해 주어야 합니다.

해당 리턴 값을 마냥 기다릴 수 없는 상황에서는 시간 제한을 주어 활용할 수 있습니다.

void main() async {
  try {
    final String result = await timeoutFuture().timeout(const Duration(seconds: 5));
  } on TimeoutException catch (e) {
    print(e.toString());
  }
}

위의 코드는 비동기 main() 함수로서 5초 이상의 시간이 걸릴 경우에 timeout()을 수행되도록 하는 코드로서, 해당 작업 수행에 제한 시간 이상의 시간이 걸릴 경우 TimeoutException 으로 예외를 처리할 수 있도록 구현되어 있습니다. 그리고 아래의 출력은 시간 제한을 초과하였을 때의 결과입니다.

TimeoutException after 0:00:05.000000: Future not completed

 

이렇게 Dart언어에서 비동기 프로그래밍을 활용할 수 있으며, 응답을 기다리는 동안 다른 작업을 수행할 수 있습니다.

728x90
반응형