Service와 Thread의 차이 및 사용 시점

1. Service

  • 정의: 안드로이드에서 백그라운드 작업을 수행하는 컴포넌트.
  • 특징:
    • 애플리케이션이 종료되더라도 백그라운드에서 실행될 수 있음.
    • 기본적으로 메인 스레드(UI 스레드)에서 실행됨.
    • 별도의 스레드를 생성하지 않음 → 따라서 무거운 작업(네트워크 요청, 파일 처리 등)을 수행하면 ANR (Application Not Responding) 오류 발생 가능.
    • startService() → 독립 실행 (종료 필요)
    • bindService() → 다른 컴포넌트와 바인딩하여 실행 (사용 중이면 유지됨)
  • 언제 사용하나?
    • 사용자가 직접 조작하지 않아도 실행되어야 하는 작업.
    • 예시:
      • 음악 재생 서비스
      • 백그라운드에서 데이터 동기화
      • GPS 기반 위치 서비스

 

2. Thread

  • 정의: 프로세스 내에서 실행되는 독립적인 작업 단위.
  • 특징:
    • 별도의 메인 스레드(UI 스레드)와는 독립적으로 실행됨.
    • 여러 개 생성 가능하여 다중 작업 병렬 실행 가능.
    • UI 업데이트는 불가능 (UI 변경이 필요하면 Handler, runOnUiThread(), LiveData 등을 사용해야 함).
  • 언제 사용하나?
    • CPU를 많이 사용하는 작업을 처리할 때.
    • 예시:
      • 네트워크 요청 (API 호출)
      • 데이터베이스 작업
      • 이미지 로딩 및 처리

 

Service vs Thread 요약 비교

실행 환경 메인 스레드에서 실행 별도의 백그라운드에서 실행
멀티태스킹 메인 스레드 점유 멀티태스킹 가능
실행 지속성 앱 종료 후에도 지속 가능 앱 종료 시 종료됨
UI 접근 가능하지만 무거운 작업 시 ANR 발생 가능 직접 접근 불가능 (Handler 필요)
주요 목적 장기간 실행되는 작업 짧고 집약적인 작업

 

 

언제 Service + Thread를 함께 사용할까?

  • 서비스 내에서 별도 스레드를 생성하여 백그라운드 작업을 수행하는 경우
    • 기본적으로 Service는 메인 스레드에서 실행되므로 네트워크 요청, 데이터베이스 쿼리 등 긴 작업이 필요할 경우 새로운 Thread를 생성하여 실행해야 한다.
    • 안드로이드에서는 IntentService(현재는 WorkManager가 권장됨)를 사용하여 자동으로 백그라운드 작업을 처리할 수도 있음.

 

예제 코드

1. 잘못된 서비스 사용 (ANR 발생 가능)

public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // 메인 스레드에서 실행되므로 ANR 발생 가능
        for (int i = 0; i < 1000000; i++) {
            Log.d("MyService", "Heavy task running: " + i);
        }
        return START_STICKY;
    }
}

 

 

해결 방법: 새로운 스레드 생성

public class MyService extends Service {
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        new Thread(() -> {
            for (int i = 0; i < 1000000; i++) {
                Log.d("MyService", "Heavy task running: " + i);
            }
        }).start();
        return START_STICKY;
    }
}

 

 

 

 

결론

  • 단순한 병렬 작업은 Thread 사용.
  • 백그라운드에서 장기간 실행되는 작업은 Service 사용.
  • Service 내에서 무거운 작업을 할 경우, 반드시 별도 Thread를 생성하여 실행해야 함.

+ Recent posts