Concurrency

이미지
Swift 5.5 이후 async, await, task 개념들이 등장하였다. 기존의 동시성 프로그래밍을 할때는 여러 스레드를 한꺼번에 사용하여 Thread Safe하지 않은 코드를 작성할 잠재적인 가능성이 있고 디버깅하기 어려웠다.
Swift6의 목표는 컴파일 시점에 Thread Safe한 코드를 작성하기 위한 최적의 솔루션 제공을 목적으로 한다.
공식문서




📝 Swift 비동기 처리방식

1. NSThread

  • Object-C 시절부터 사용되었다
  • 직접 스레드를 셍성하고 괸리해야 한다.
  • 수동으로 동기화 해야하다.
  • GCD나 OperationQueue에 비해 사용성이 떨어진다.
  • ❌ 현재 사용 여부: 현재 거의 사용되지 않는다.

    let thread = Thread {
        print("Background 작업 실행")
    }
      
    thread.start()
    

2. OperationQueue (iOS 2.0/2008)

  • GCD보다 객체 지향적이고 세밀한 제어 가능하다.
  • 여러 작업을 동시에 실행 가능하다.
  • 의존성(Dependency) 설절 가능하다.
  • ✅ 현재 사용 여부: 여러 작업 간 의존성이 있는 경우 사용된다.

    let queue = OperationQueue()
    let operation = BlockOperation {
        print("Background 작업 실행")
    }
    queue.addOperation(operation)
    

3. GCD(Grand Central Dispatch) (iOS 4.0/2010)

  • 백그라운드 실행이 간편하다.
  • 성능 최적화된 C 기반 API이다.
  • 메인 스레드에서 UI 업데이트 가능하다.
  • ✅ 현재 사용 여부: 많이 사용된다. (백그라운드 처리, UI 업데이트)

    DispatchQueue.gloal(qos: .background).async {
        // Background 작업 실행
        let result = heavyTask() 
        
        DispatchQueue.main.async {
            updateUI(with: result)
        }
    }
    

4. RxSwift (ReactiveX)

  • 오픈소스 라이브러리이다.
  • 리액티브 프로그래밍을 위한 강력한 프레임워크다.
  • 비동기 데이터 스트림을 선언적으로 처리 가능하다.
  • Obserable과 Observer 패턴 사용한다.
  • ✅ 현재 사용 여부: 많이 사용된다. (MVVM 아키텍쳐에서 활용됨)

    import RxSwift
      
    let disposeBag = DisposeBag()
    let observable = Observable.just("Background 작업 실행")
      
    observable.subscribe(onNext: { value in
        print(value)
    }).disposed(by: disposeBag)
    

5. Combine (iOS 13.0/2019)

  • 리액티브 프로그래밍 프레임워크이다.
  • 데이터 스트림을 다룰 때 유용하다.
  • Publisher와 Subscriber 패턴을 사용한다.
  • ✅ 현재 사용 여부: 특정 상황에서 사용된다. (API 응답, 데이터 스트림 처리 등)

    import Combine
      
    let publisher = Just("Background 작업 실행")
    let cancellable = publisher.sink { value in
        print(value)                                
    }
    

6. Async/await (Switt Concurrency) (iOS 15.0/2021/Swift5.5)

  • 가독성이 뛰어난 최신 비동기 처리 방식이다.
  • 동기 코드처럼 작성 가능하다
  • Task를 활용해 SwiftUI에서도 사용 가능하다.
  • ✅ 현재 사용 여부: 가장 추천되는 방식이다. (Swift 5.5+ 환경에서 최적의 선택)
    func fetchData() async -> String {
        // Background 작업 실행
        try await Task.sleep(nanoseconds: 1_000_000_000) // 1초 대기
        return "Fetched Data"
    }
      
    Task {
        let data = await fetchData()
        print(data)
    }
    

✅ 정리 (비동기 처리 방식 비교)

도입 순서 비동기 방식 특징 현재 사용 여부
1 NSThread 직접 스레드 관리, 수동 동기화 필요 거의 안 씀 ❌
2 OperationQueue 객체 지향적, 작업 의존성 설정 가능 사용됨 ✅
3 GCD (DispatchQueue) 백그라운드 처리, UI 업데이트 가능 많이 사용됨 ✅
4 RxSwift 리액티브 프로그래밍, Observable 활용 많이 사용됨 ✅
5 Combine 데이터 스트림을 다루는 리액티브 프로그래밍 특정 상황에서 사용됨 ✅
6 async/await 최신 Swift 비동기 처리 방식, 가독성이 좋음 가장 추천됨 🚀✅

Leave a comment