본문 바로가기
Study/Flutter

[Dart] Future async await 란?

Flutter 비동기 처리 프로그램을 제어하기 위해 존재하는  Future와 async/await 가 있습니다.

 

 1. 비동기 처리

일반적인 프로그래밍은 단일 스레드 환경에서 순차적으로 (동기적으로) 수행이 이루어집니다.

프로그램에서 파일 읽기, 데이터베이스 쿼리, 웹 페이지 가져오기 등 과 같이

긴 작업을 하면 오랜시간을 프로그래밍이 멈춰있게 되므로 이런 작업을 비동기 처리로 진행합니다.

 

비동기 계산은 시간이 걸리는 작업이 끝날때까지 기다리지 않고, 계속적으로 다른 작업들을 처리할 수 있도록 해줍니다. 

Dart에 Future클래스는 미래에 요청한 데이터 혹은 에러가 담길 그릇과 같습니다.

 

2. Future 란?

Future는 크게 두가지 상태를 가지며, [ 완료 / 미완료 ] 

두가지의 결과 값을 가질 수 있습니다.   [ data / error ]

비동기적으로 실행에 두가지 결과값 Case에 맞게 then, catchError 키워드로 처리를 다룹니다.

Example Code

then, catchError로 반환값이 data일때와, error일때 수행할 코드를 작성해줍니다.

import 'dart:async';

Future<int> futureNumber() {
  // 3초 후 100이 상자에서 나옵니다
  return Future<int>.delayed(Duration(seconds: 3), () {
    return 100;
  });
}

void main() {
  // future 라는 변수에서 미래에(3초 후에) int가 나올 것입니다
  Future<int> future = futureNumber();

  future.then((val) {
    // int가 나오면 해당 값을 출력
    print('val: $val');
  }).catchError((error) {
    // error가 해당 에러를 출력
    print('error: $error');
  });

  print('main 종료');
}

main에서 futureNumber를 실행하였을때,

순차적인 동기 실행이라면, "val: 100" 출력 후 "main 종료" 문이 프린트 되겠지만,

future 타입 futureNumber()를 수행하였기에, 결과가 오기전까지 다음 작업들을 진행한 것입니다.

 

3. async / await 란?

비동기 처리에 장점은 요청이 긴 I/O작업이나 데이터작업 등을

멈춤없이 기다리지않고 바로 다음 코드들을 수행한다는 것인데요,

 

하지만, 비동기 처리라도 때로는 기다렸다가 동기적으로 처리할 필요가 있는 경우,

외부 요청에 의해 받아온 반환값이 있어야 후 작업들을 진행할 수 있는 경우라면,

비동기 요청을 동기적으로 수행시켜주어야 합니다.

 

그럴 경우에 async / await 키워드를 사용합니다

await은 "기다리다"는 의미로 비동기처리 요청 후 결과가 올 때까지 기다리라는 메소드입니다.

await은 반드시 async (비동기) 를 명시해준 메소드안에서 사용이 가능하며,

비동기처리 작업에 결과를  Future을 반환 받지않고, 해당 객체타입으로 반환받을수 있게 됩니다.

 

Example Code

위에서 작성했던 코드를 async / await 키워드로 변경해보겠습니다.

import 'dart:async';

Future<int> futureNumber() {
  // 3초 후 100을 반환
  return Future<int>.delayed(Duration(seconds: 3), () {
    return 100;
  });
}

void main() async{
  // future 라는 변수에서 미래에(3초 후에) int가 나올 것입니다
  int result = await futureNumber();
  print(result);
  print('main 종료');
}

이렇게 출력순서가 동기적이고 절차적으로 진행되었음을 볼 수 있습니다.

단, 이렇게 프로그래밍한다면, 최종적인 출력을 얻기까지 오랜 시간이 걸리므로, 

멈춰있는시간이 길어지게 됩니다.

 

 

 

https://dart.dev/codelabs/async-await