회고

20220829 TIL #비동기 then과 async/await

paran21 2022. 8. 30. 20:49

자바를 공부할 때 비동기를 다뤄보지 않아서 그런지 플러터 공부하면서 비동기가 좀 어렵다.

 

그래도 어떻게 찾아가며 이럴 때 쓰는구나, 하고 있는데 강의를 듣다가 궁금한 점이 생겼다.

 

패키지의 공식문서에서는 then을 사용해서 콜백을 처리하고 있는데,

강의에서는 async와 await를 사용해서 처리하는 것을 보았다.

 

Flutter 공식문서에서도 async/await를 권하고 있다.

 

팀원과 대화하면서 여러가지 방향으로 이해할 수 있었고, 관련된 좋은 포스팅을 추천받아서 둘의 차이를 정리해보았다!

 

Futre.then 대신 async/await를 권하는 이유

참고자료

https://medium.com/flutter-senior/why-use-async-await-instead-of-future-then-2e9c340aabfb

 

Why use async/await instead of Future.then?

7 reasons including exception handling differences, breakpoints, Dart formatter support etc.

medium.com

여러 가지 이유들이 있겠지만, 내가 느끼는 가장 큰 차이는 1. 에러 처리2. 가독성 문제이다.

 

1. 에러 처리

  • then은 .catchError를 통해, async/await를 try/catch를 통해 에러를 처리한다.
  • .catchError는 then에서 실행되는 콜백 함수에 대한 에러 처리이기 때문이 이 로직 전/후에 에러처리가 필요하다면 별도로 처리를 해주어야 한다.
  • 반면에, async/await는 에러처리가 필요한 부분을 쉽게 조정할 수 있다.

2. 가독성

  • then보다 async/await가 가독성이 좋다.
  • then은 로직이 추가되면 중첩을 해야하고, 익명함수가 반복되기 때문에 알아보기 힘들다.
  • 반면에, async/await는 필요하다면 앞/뒤에 필요한 함수를 추가하면 되고 한줄한줄 이해하기 쉽게 작성할 수 있다.

 

처음에 then은 에러처리가 가능하다, 는 것만 보고 그럼 then이 좋은 거 아닌가 라고 생각했다.

그런데 위에 인용한 블로그 글을 읽으면서 단순히 콜백 함수에 대한 에러 처리뿐만 아니라 비동기를 사용하는 메서드에서 에러 처리를 어떻게 하는지가 중요하다고 느꼈다.

then이 포함된 메서드에서 에러처리를 한다면 어떻게 해야하는지가 개발을 할 때는 더 중요한 문제일 수 있다.

 

또, 예제들을 보면서 async/await가 훨씬 더 가독성이 좋다고 느꼈다.

자바를 사용하면서도 쭉 이어서 로직을 처리하는 것보다 중간중간에 끊어주는게 더 이해하기 쉽다고 생각된 적이 많았다.

특히 함수형 프로그래밍을 할 때 중첩해서 사용하면, (내가 아직 덜 익숙해서일수도 있지만), 가독성이 정말 많이 떨어지는 것 같다.

 

await로 리턴 값을 받을 수 있기 때문에 이 값에 대한 추가 작업도 쉽고, 여기서 한 번 끊어주는 게 이해하기도 훨씬 더 쉬운 것 같다.

그만큼 나중에 코드를 수정하더라도 더 빠르게 수정할 수 있을 거라고 생각한다.