먼저 동기와 비동기가 뭔지부터 알아보자. StackOverFlow에서 이 둘의 차이를 단번에 알 수 있는 매우 좋은 예시가 있어서 갖고와봤다(직역하진 않고 이해하기 편하게 번역했다).
나의 상사는 매우 바쁘다. 그는 나에게 코드를 작성하라고 지시했고, 나는 지시에 따랐다. 그는 내 어깨 너머에 서서 내가 코딩하는 모습을 계속 감시하기만 했다. 저 시간에 다른 걸 하지, 나는 상사가 매우 비효율적으로 행동한다고 생각했다.
나의 상사는 코드를 작성하라고 지시했고, 내가 지시받은 업무를 하는 동안 그는 다른 업무를 수행했다. 내가 업무를 끝낸 후 그에게 보고했을 때 그도 역시 자신의 업무를 끝낸 상태였다.
위 예시를 보면 동기/비동기가 무엇이고, 둘의 차이가 뭔지 알 수 있다. 다수의 작업들이 진행되어야 하는 멀티스레드 환경을 예로 들면, 동기 프로그래밍이란 여러개의 작업들이 한번에 한개씩, 하나의 작업이 끝나야만 그 다음 순서의 작업을 수행할 수 있는 프로그래밍 방식이고, 비동기 프로그래밍이란 여러개의 작업들을 동시에 수행할 수 있는 프로그래밍 방식이다.
비동기에 대해 배우지 않은 이전의 우리는 안드로이드 개발을 할 때 동기 프로그래밍만 경험해봤을 것이다. 그래서 비동기의 개념이 생소하게 느껴질 것이고, 방대하고 복잡한 비동기 프로그래밍 라이브러리들의 사용방법을 익히는데에 시간이 좀 걸릴 수 있다. 하지만 비동기 프로그래밍을 구현하면 1개의 작업만 할 수 있는게 아니라 동시에 여러가지 작업을 수행할 수 있고, 이것은 곧 프로그램의 퍼포먼스와 속도를 향상시킬 수 있다는 큰 장점으로 이어진다. 우리는 이러한 이유로 적절한 때에 비동기 프로그래밍을 구현해야 한다.
모바일 앱이 A,B 2개의 버튼을 가지고 있다고 가정해보자. A버튼을 클릭하면 날씨 정보를 , B버튼을 클릭하면 앱의 폰트 색을 변경할 수 있다. 사용자는 앱이 백그라운드에서 날씨 데이터를 가져오는 동안 폰트 색을 변경하기 위해 B버튼을 누를 수도 있다. 그러니까 날씨 정보를 얻는 것과 폰트 색을 변경하는 두 개의 작업이 서로 독립적으로 진행되어야 하고, 이런 경우 비동기로 해결할 수 있다. 이렇게 반응형 UI를 구현하는데 비동기 프로그래밍을 사용할 수 있다.
또한 서버 관련 작업 시 확장성 및 효율성을 위해 사용한다. 서버 요청 시 많은 데이터베이스 호출을 수행하는 백엔드 서비스가 있다고 가정해보자. 이러한 서비스가 많은 수의 요청을 받을 것으로 예상되고 이러한 요청을 특정 시간 내에 완료해야 하는 경우 역시 비동기가 필요하다.
안드로이드 앱은 실행되면 Main Thread가 실행되고, thread는 기본적으로 요청을 동기적으로 하나씩 처리한다. Main Thread에선 보통 UI 관련 작업들을 하는데, 여기에 네트워크나 DB 작업과 같은 복잡한 연산을 하게 되면 Main Thread가 하는 일이 너무 많아져 사용자에게 보여지는 UI 처리가 늦을 수 있다. 따라서 앞서 설명했던 작업들처럼 요청의 응답을 대기해야 하는 작업이나 처리에 오랜 시간이 소요되는 복잡한 연산 작업들은 thread를 하나 더 만들어서 처리를 해주어야 한다.
하지만 "아, 비동기는 무조건 좋은거구나!"라고 생각해선 안된다. 비동기 프로그래밍을 남발하면 코드 한 줄로 간단하게 짤 수 있는 걸 쓸데없이 복잡하게 만들 수 있기 때문이다. 또한 동기 프로그래밍처럼 순서가 지켜지지 않기 때문에, 만약 순차적으로 진행되어야 하는 작업이 있다면 비동기 프로그래밍을 사용해선 안된다.
https://www.indeed.com/career-advice/career-development/asynchronous-programming
https://medium.com/@rajatsikder/asynchronous-programming-use-cases-86727de31992
https://velog.io/@peppermint100/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%BD%94%EB%A3%A8%ED%8B%B4-1