비동기화 프로그램
내 1차멘붕이 함수형 프로그래밍이라면 2차멘붕은 Future였다.
async를 어디에 붙여할지? then과의 차이점이 무엇인지? Future 에 제네릭은 왜 써야하는지...
요런 기저에 깔려있는 내용을 짚어보면서 차근차근 해보도록하자.
Future를 좀 알고 나면 추후에 나올 Provider나 Stream을 공부할때 상당히 도움이되는 뿌리이다. 코딩에 대한 내용이지만 시나리오를 상정하여 기억해보자.(아직도 문과갬성)
왜써야할까?
이걸 알려면 Dart 언어가 어떻게 작동하는지 알아야한다.
- 다트언어는 프로그램하나당 스레드를 하나를 쓴다.
- 파이프 안에 작업이 하나들어간다 →다른한쪽으로 나온다.
- 이 작업이 들어가서 나올때 작업에 소요되는 시간이 있다.
- 그런데 작업 마다 시간이 다르다, 빨리끝나는 작업, 오래걸리는 작업
- 문제는 오래걸리는 작업이다.
- 이 오래걸리는 작업 때문에 파이프가 막혀서 다른 작업들 빨리끝나는 작업들도 기다리게 되는 현상이 생긴다.
- 그런것을 방지하기 위해서 Async Programing이 필요한거다.
Future API의 3가지 상태
- 완료되지않은 Futrure object 상태
- 완료된 Futrure object의 데이터 상태
- 완료된 Futrure object의 에러 상태
Async Programing 사용하는 2가지 방법
- Future API
- Async Await Keyword
시나리오 1
- HTTP 라이브러리를 사용하여 이미지를 다운받는데 작업이 오래걸리는A라는 이미지를 받는다고 가정해보자
- HTTP 라이브러리에 이미지를 다운받게해달라고 요청을 하면 Future Object를 준다.
- 하지만 이것은 열리지않는 상태이다, 이것을 Future Object 라고 인식하면 다른한쪽에 두게된다.
- 다른 작업을 계속 받게되고 처리를한다, 처리도중에 Future Object 작업이끝났다고(이미지 다운이 끝났다고) 신호가 온다
- 그럼 Future Object 가 열리면서 이미지 데이터가 나오게된다→데이터를 가지고 처리를 하게된다.
시나리오2
- 그럼 Future Object 가 열리면서 에러가 나오게된다→에러를 가지고 처리를 하게된다.
- Future object를 받아서 한쪽에서 작업을 하지만
- 내가 선택권을 가질수 없을까? Future object를 구석에 두고 기다리지 말고 끝날때까지 기다리면안될까?
- 즉 다른작업들이 있지만 기다려 내가 Future object 작업이 끝날때까지 기다렸다가 데이터나 에러를 처리를 하고 다른작업을 받을게~
- 이런 기능도 필요하여 Async Await Keyword 가 나온것이다.
중요한 점
- 다트는 단일 스레드에서 실행된다.
- 스레드를 차단하는 코드는 프로그램을 정지시킬 수 있다.
- Future는 Async 코드의 결과를 나타낸다. 처리 또는 입출력은 나중에 완료된다.
- future가 완료 될때까지 실행을 일시 중단하려면 Async함수에서 Await를 사용하면된다.
- Async함수에서 Try catch를 사용해서 에러를 잡느다.
Future<String> gatherNewsReports() =>
Future.delayed(oneSecond, () => news);
Future 라이브러리를 사용해서 delayed를 하는것이다.
1초동안 기다렸다가 news를 리턴하라 이다.
void printDailyNewsDigest() async {
var newsDigest = await gatherNewsReports();
print(newsDigest);
}
gatherNewsReports 이것을 받을때까지 await 기다려라 그리고나서 print(newsDigest)
하자.