[Android] 비동기 프로그래밍

Minji Jeong·2022년 5월 4일
1

Android

목록 보기
11/37
post-thumbnail

✅ 비동기 프로그래밍

비동기 프로그래밍은 안드로이드 개발을 하던 다른 플랫폼으로 개발을 하던, 필수적으로 알아야하는 개념이라고 생각한다. 특히 안드로이드의 경우 RxJava나 Coroutine같은 비동기 라이브러리를 사용해 백그라운드 작업을 해야하는 경우가 많기 때문에 더더욱 알아야한다. 처음엔 Coroutine -> RxJava 순대로 포스팅을 작성하려고 했으나, 이 둘을 이해하고 사용하기가 꽤 까다롭고(특히 RxJava의 경우 공부해야하는 양이 매우 방대하다), 얘네를 알기 전에 이 둘의 근본이라고 할 수 있는 "비동기 프로그래밍(Asynchronous Programming)"의 개념에 대해 짚고 넘어가야 할 것 같아서 이렇게 간단하게 글을 남기고자 한다.

동기(Synchronous) vs 비동기(Asynchronous)

먼저 동기와 비동기가 뭔지부터 알아보자. StackOverFlow에서 이 둘의 차이를 단번에 알 수 있는 매우 좋은 예시가 있어서 갖고와봤다(직역하진 않고 이해하기 편하게 번역했다).

동기 프로그래밍 예시



나의 상사는 매우 바쁘다. 그는 나에게 코드를 작성하라고 지시했고, 나는 지시에 따랐다. 그는 내 어깨 너머에 서서 내가 코딩하는 모습을 계속 감시하기만 했다. 저 시간에 다른 걸 하지, 나는 상사가 매우 비효율적으로 행동한다고 생각했다.

비동기 프로그래밍 예시

나의 상사는 코드를 작성하라고 지시했고, 내가 지시받은 업무를 하는 동안 그는 다른 업무를 수행했다. 내가 업무를 끝낸 후 그에게 보고했을 때 그도 역시 자신의 업무를 끝낸 상태였다.

위 예시를 보면 동기/비동기가 무엇이고, 둘의 차이가 뭔지 알 수 있다. 다수의 작업들이 진행되어야 하는 멀티스레드 환경을 예로 들면, 동기 프로그래밍이란 여러개의 작업들이 한번에 한개씩, 하나의 작업이 끝나야만 그 다음 순서의 작업을 수행할 수 있는 프로그래밍 방식이고, 비동기 프로그래밍이란 여러개의 작업들을 동시에 수행할 수 있는 프로그래밍 방식이다.

비동기에 대해 배우지 않은 이전의 우리는 안드로이드 개발을 할 때 동기 프로그래밍만 경험해봤을 것이다. 그래서 비동기의 개념이 생소하게 느껴질 것이고, 방대하고 복잡한 비동기 프로그래밍 라이브러리들의 사용방법을 익히는데에 시간이 좀 걸릴 수 있다. 하지만 비동기 프로그래밍을 구현하면 1개의 작업만 할 수 있는게 아니라 동시에 여러가지 작업을 수행할 수 있고, 이것은 곧 프로그램의 퍼포먼스와 속도를 향상시킬 수 있다는 큰 장점으로 이어진다. 우리는 이러한 이유로 적절한 때에 비동기 프로그래밍을 구현해야 한다.

그렇다면 우리는 언제 비동기 프로그래밍을 구현할까?

모바일 앱이 A,B 2개의 버튼을 가지고 있다고 가정해보자. A버튼을 클릭하면 날씨 정보를 , B버튼을 클릭하면 앱의 폰트 색을 변경할 수 있다. 사용자는 앱이 백그라운드에서 날씨 데이터를 가져오는 동안 폰트 색을 변경하기 위해 B버튼을 누를 수도 있다. 그러니까 날씨 정보를 얻는 것과 폰트 색을 변경하는 두 개의 작업이 서로 독립적으로 진행되어야 하고, 이런 경우 비동기로 해결할 수 있다. 이렇게 반응형 UI를 구현하는데 비동기 프로그래밍을 사용할 수 있다.

또한 서버 관련 작업 시 확장성 및 효율성을 위해 사용한다. 서버 요청 시 많은 데이터베이스 호출을 수행하는 백엔드 서비스가 있다고 가정해보자. 이러한 서비스가 많은 수의 요청을 받을 것으로 예상되고 이러한 요청을 특정 시간 내에 완료해야 하는 경우 역시 비동기가 필요하다.

안드로이드 앱은 실행되면 Main Thread가 실행되고, thread는 기본적으로 요청을 동기적으로 하나씩 처리한다. Main Thread에선 보통 UI 관련 작업들을 하는데, 여기에 네트워크나 DB 작업과 같은 복잡한 연산을 하게 되면 Main Thread가 하는 일이 너무 많아져 사용자에게 보여지는 UI 처리가 늦을 수 있다. 따라서 앞서 설명했던 작업들처럼 요청의 응답을 대기해야 하는 작업이나 처리에 오랜 시간이 소요되는 복잡한 연산 작업들은 thread를 하나 더 만들어서 처리를 해주어야 한다.

  • Main Thread : 프로세스 시작과 동시에 실행되는 스레드, 즉 메인화면
  • Thread : 하나의 작업 단위이자 독립적인 실행 흐름

하지만 "아, 비동기는 무조건 좋은거구나!"라고 생각해선 안된다. 비동기 프로그래밍을 남발하면 코드 한 줄로 간단하게 짤 수 있는 걸 쓸데없이 복잡하게 만들 수 있기 때문이다. 또한 동기 프로그래밍처럼 순서가 지켜지지 않기 때문에, 만약 순차적으로 진행되어야 하는 작업이 있다면 비동기 프로그래밍을 사용해선 안된다.

References

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

profile
Flutter Developer

0개의 댓글