개발/iOS

[Swift] Concurrency와 Async/Await

D_Da 2024. 8. 23. 15:35

 

최근 Swift에 도입된 Concurrency(동시성)와 Async/Await 기능은 많은 개발자들의 주목을 받고 있습니다.

이 기능은 비동기 코드를 더 간결하고 이해하기 쉽게 작성할 수 있도록 도와주며, 복잡한 콜백 지옥을 피할 수 있는 방법을 제공합니다.

이번 글에서는 Concurrency와 Async/Await가 무엇인지, 어떻게 활용할 수 있는지에 대해 알아보겠습니다.

OS 개발자들에게 비동기 작업을 더 쉽게 관리할 수 있는 방법을 제공하여 이를 통해 더 간결하고 효율적인 코드를 작성할 수 있을 것입니다.

Concurrency(동시성)란?

Concurrency는 여러 작업을 동시에 실행하는 프로그래밍 기법을 의미합니다.

iOS 애플리케이션에서는 네트워크 요청, 데이터베이스 쿼리, 이미지 처리 등 많은 작업이 비동기적으로 실행됩니다.

기존에는 GCD(Grand Central Dispatch)나 OperationQueue와 같은 API를 사용해 동시성을 구현했지만, 코드가 복잡해지고 이해하기 어려운 경우가 많았습니다.

 

Async/Await의 도입

Swift 5.5 버전에서 도입된 Async/Await는 이러한 문제를 해결하기 위해 고안되었습니다. 이 기능을 사용하면 비동기 작업을 마치 동기 코드처럼 간단하게 작성할 수 있습니다. 아래 예제를 통해 Async/Await의 기본 사용법을 살펴보겠습니다.

 

아래와 같이 기존의 콜백 지옥을 벗어나 더 직관적이고 읽기 쉬운 코드로 작성할 수 있습니다.

// 기존의 콜백 기반 비동기 코드
func fetchData(completion: @escaping (Data?, Error?) -> Void) {
    let url = URL(string: "https://sodud.example.com/data")!
    URLSession.shared.dataTask(with: url) { data, _, error in
        completion(data, error)
    }.resume()
}

// Async/Await을 사용한 코드
func fetchData() async throws -> Data {
    let url = URL(string: "https://sodud.example.com/data")!
    let (data, _) = try await URLSession.shared.data(from: url)
    return data
}

Async/Await의 장점

  1. 가독성 향상: 동기 코드처럼 작성할 수 있어 가독성이 크게 향상됩니다.
  2. 에러 처리: try 키워드를 사용하여 비동기 작업에서 발생하는 에러를 명확하게 처리할 수 있습니다.
  3. 중첩 제거: 여러 비동기 작업을 중첩하여 사용할 때 발생하는 복잡함을 줄일 수 있습니다.

사용 시 주의사항

Async/Await는 강력한 도구이지만, 모든 상황에서 사용하는 것이 최선은 아닙니다.

동시성 문제를 잘 이해하고, 메인 스레드에서의 사용을 주의해야 합니다. 또한, 기존 코드베이스에 이를 도입할 때는 단계적으로 적용하는 것이 좋습니다.