flutter async 함수 안에서는 await를 여러 번 사용할 수 있을까?
Dart나 Flutter를 처음 접하면 가장 먼저 눈에 띄는 키워드 중 하나가 async와 await이다.
그리고 문득 이런 의문이 생긴다.
"async 붙인 함수 안에서 await는 한 번만 써야 하는 거 아니야?"
사실은 그렇지 않다. 결론부터 말하면, async 함수 내부에서는 await를 여러 번 사용하는 게 가능하고, 오히려 그렇게 사용하는 게 자연스럽다.
비동기 처리는 외부에서 시간이 오래 걸리는 작업이 있을 때 자주 쓰게 된다. 예를 들어, 서버에서 데이터를 받아오거나, 파일을 업로드하거나, DB에 정보를 저장하는 등 Flutter에서 UI를 멈추지 않게 하려면 이 모든 작업을 비동기로 처리해야 한다. 이때 await 키워드를 통해 결과가 올 때까지 기다리고, 그 이후 로직을 작성하는 흐름이 일반적이다.
예를 들어보자.
Future<void> uploadUserProfile() async {
final imageUrl = await uploadImage();
final userId = await getCurrentUserId();
await saveUserProfile(userId, imageUrl);
}
이 함수는 순서대로 세 가지 작업을 처리한다. 이미지 업로드, 사용자 ID 조회, 프로필 저장이다. 각각이 비동기 함수이고, await 키워드를 통해 완료를 기다린 뒤에야 다음 작업으로 넘어간다. 여기서 중요한 점은 한 번의 await로 끝나는 게 아니라, 필요한 만큼 await를 여러 번 사용하고 있다는 것이다.
Dart의 async는 내부에서 await를 하나만 사용하라고 제한하지 않는다. 오히려 필요한 만큼 await를 적절히 배치해서 안정적인 흐름을 유지하도록 설계되어 있다.
또 한 가지 알아둘 것은, 비동기 작업이 서로 의존하지 않는 경우에는 순차적으로 처리할 필요 없이 병렬로 처리하는 것도 가능하다는 점이다. 이럴 땐 Future.wait를 활용할 수 있다.
final results = await Future.wait([
loadImage(),
fetchUserInfo(),
readLocalFile(),
]);
이 코드는 세 개의 작업을 동시에 실행하고, 모든 결과가 올 때까지 기다린다. 각 작업이 서로 영향을 주지 않을 경우에는 훨씬 효율적이다.
정리하자면, async 함수 안에서는 await를 한 번만 쓰는 게 아니라 필요한 만큼 여러 번 사용할 수 있고, 사용 순서나 방식에 따라 흐름을 유연하게 제어할 수 있다. Flutter에서 자연스럽고 안정적인 비동기 흐름을 구성하기 위해서는 이 구조에 익숙해지는 것이 중요하다.