[Android] Android Service와 Thread의 차이

Android에서 흔히(?) 사용되는 ServiceThread의 차이에 대해서 생각해 보려고 한다. 보통 Service를 사용한다고 하면 앱의 Background 작업을 떠올리게 된다. Background에서 동영상 업로드 다운로드 등 시간이 오래 걸리는 작업을 UI ThreadBlock 시키지 않고 수행하기 위해 Service 등을 활용한다.

하지만 Service 구현 시 고려해야 할 기본적인 사항이 있다.

Service 자체는 main thread에서 동작한다는 사실.

Service를 구현하면 별도의 thread에서 동작하리라 생각할 수 있지만 Service는 기본적으로 UI가 동작하는 main thread에서 동작한다. 그래서 Service 내에서 별도의 Thread를 생성해서 작업을 수행해야 한다.

Service 내에서 Thread를 사용해야 한다면 그냥 일반적인 코드에서 Thread를 사용하는 것이 무엇이 다를까?

Service는 Android에서 설명하는 4대 컴포넌트 Activity, Service, Broadcast, Content Provider 중에 하나이므로 Android 시스템의 아키텍처에 기반을 둔 유용한 컴포넌트로서의 역할을 한다.

앱이 구동 중에 시스템에 의해서 프로세스가 강제 종료되었다고 생각해보자. ServiceonStartCommand 의 반환 값에 따라서 강제 종료된 Service를 시스템이 다시 자동으로 시작하게 만든다. 하지만 Thread는 Android 시스템이 다시 복구시켜 주진 않는다.

기본적으로 Thread는 하나의 프로세스 내에서 Thread 간 메모리를 공유하지만 다른 프로세스에 접근할 수는 없다. ServiceBind 방식의 Service를 구현함으로써 프로세스 간 통신 (IPC)을 수행할 수 있다. 우리가 흔히 사용하는 위치 서비스, 알람 서비스, 노티 서비스 등이 IPC 통신을 할 수 있게 해당 프로세스를 bind할 수 있도록 인터페이스를 제공하고 있다.

또한 Service의 구현체 중 하나인 IntentService는 작업 요청을 보내면 한 번에 하나씩 sequential 하게 작업을 수행한다. IntentService로 작업 요청을 보내면 내부적으로 Worker Thread를 생성하고 작업을 완료하면 종료된다. 작업 요청은 Queue에 담겨 FIFO로 처리되고 Single Thread로 처리되기 때문에 한 번에 하나씩 처리된다. IntentService도 요구 사항에 맞춰 적절한 곳에 유용하게 쓰일 수 있다.

Service에 대해서 자세히 담기엔 내용이 너무 광범위 해질 것 같다. Android Developer 사이트의 Service 관련 섹션을 정독하면 도움이 많이 될 것이다. 만약 위에서 설명한 Service 관련 유용한 기능들을 Thread로 구현하려고 한다면 상당히 골치가 아플 것이며 버그들이 난무할 것이다.

ServiceThread가 사용될 시점을 생각해 보자. Thread는 앱이 사용자와 상호작용하는 과정에서 UI ThreadBlock 되지 않기 위한 작업등을 처리하기 위한 Foreground 작업에 적합하고 Service는 앱이 사용자와 상호작용하지 않아도 계속 수행되어야 하는 Background 작업에 적합하다고 볼 수 있다. 물론 Service 내부에서 Thread가 사용되어야 하지만 큰 틀에서 봤을 때 위와 같은 개념으로 나눌 수 있을 것이다.

ServiceThread에 대해서 자세히 적으려고 했으나 자료 정리가 제대로 안되어 있고 시간의 압박으로 인해 다음번에 다시 정리하여 부족한 부분 내용 보충하고자 한다. 미루면 안 되는데 언제가 될지…