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
'Study > Flutter' 카테고리의 다른 글
[Dart] Sound Null Safety 견고한 널 안전성이란? (0) | 2022.05.09 |
---|---|
[Dart] 동적변수 var, dynamic 비교 (0) | 2022.05.09 |
[Dart] Final , Const 차이점 (0) | 2022.05.05 |
[Flutter] Hot Restart, Hot Reload 차이점 (0) | 2022.05.05 |
[Flutter] Pubspec.yaml 에 대해서 (0) | 2022.05.05 |