홍로그

Combine vs Async/Await 본문

iOS

Combine vs Async/Await

성홍민 2023. 5. 29. 12:05

Combine과 Async/Await 비교~

  Swift는 현대적인 비동기 프로그래밍을 위한 여러 가지 기술을 제공한다. Swift의 Combine 프레임워크와 Swift 5.5에서 도입된 Async/Await 패턴은 개발자들이 비동기 작업을 처리하고 조합하는 데 사용됩니다.

Combine 소개

    Combine은 Swift에서 비동기 및 이벤트 기반 프로그래밍을 위한 프레임워크다. Combine은 Publisher-Subscriber 패턴을 기반으로 하며, 데이터의 흐름을 선언적으로 처리할 수 있도록 한다. Combine은 주로 데이터 스트림의 변환, 조합 및 필터링과 같은 작업에 사용된다.

    Combine은 비동기 작업과 이벤트 처리를 쉽게 조합할 수 있는 많은 연산자를 제공한다. 이를 통해 다양한 데이터 처리 및 비동기 작업 흐름을 간결하게 표현할 수 있다. Combine의 핵심 개념은 Publisher와 Subscriber다. Publisher는 데이터나 이벤트를 생성하고 Subscriber는 이러한 데이터나 이벤트를 처리하는 역할을 한다. 다음은 Combine을 사용한 예시 코드다.

import Combine

func fetchUser() -> AnyPublisher<User, Error> {
    // User 데이터를 비동기적으로 가져오는 Publisher 생성
    // ...
}

func fetchPosts(userId: String) -> AnyPublisher<[Post], Error> {
    // 해당 사용자의 포스트들을 비동기적으로 가져오는 Publisher 생성
    // ...
}

func fetchComments(postIds: [String]) -> AnyPublisher<[Comment], Error> {
    // 포스트들에 대한 댓글들을 비동기적으로 가져오는 Publisher 생성
    // ...
}

func fetchUserData() -> AnyPublisher<UserData, Error> {
    return fetchUser()
        .flatMap { user in
            fetchPosts(userId: user.id)
                .map { posts in
                    (user, posts)
                }
        }
        .flatMap { user, posts in
            fetchComments(postIds: posts.map { $0.id })
                .map { comments in
                    UserData(user: user, posts: posts, comments: comments)
                }
        }
        .eraseToAnyPublisher()
}

fetchUserData()
    .sink { completion in
        // 완료 처리 로직 작성
    } receiveValue: { userData in
        // userData를 처리하는 로직 작성
    }

Async/Await 소개

    Async/Await은 Swift 5.5부터 도입된 기능으로, 비동기 코드를 동기적인 구문으로 작성할 수 있게 해 준다. Async/Await은 비동기 작업을 쉽게 표현하고 제어하기 위해 사용된다. 코드를 선언적이고 읽기 쉽게 작성할 수 있어 개발자의 생산성을 높여준다.

    Async/Await은 비동기 작업을 호출하는 함수 앞에 async 키워드를 붙이고, 해당 작업을 기다리는 부분에 await 키워드를 사용한다. 이를 통해 비동기 코드를 동기적인 구문과 유사하게 작성할 수 있으며, 에러 처리도 편리하게 처리할 수 있다. 다음은 Async/Await을 사용한 예시 코드다.

func fetchUser() async throws -> User {
    // User 데이터를 비동기적으로 가져오는 함수
    // ...
}

func fetchPosts(userId: String) async throws -> [Post] {
    // 해당 사용자의 포스트들을 비동기적으로 가져오는 함수
    // ...
}

func fetchComments(postIds: [String]) async throws -> [Comment] {
    // 포스트들에 대한 댓글들을 비동기적으로 가져오는 함수
    // ...
}

func fetchUserData() async throws -> UserData {
    let user = try await fetchUser()
    let posts = try await fetchPosts(userId: user.id)
    let comments = try await fetchComments(postIds: posts.map { $0.id })
    
    return UserData(user: user, posts: posts, comments: comments)
}

do {
    let userData = try await fetchUserData()
    // userData를 처리하는 로직 작성
} catch {
    // 에러 처리 로직 작성
}

Combine vs Async/Await

Combine과 Async/Await은 모두 비동기 프로그래밍을 위한 유용한 도구다. 그러나 어떤 상황에서 어느 것을 선택해야 할까?

  • Combine은 주로 데이터 스트림의 처리와 변환에 사용된다. 데이터의 흐름을 표현하고 여러 연산자를 조합해 작업을 수행할 수 있다. Combine은 복잡한 비동기 작업의 흐름을 다루기에 적합하다.
  • Async/Await은 비동기 작업을 간결하고 직관적으로 작성할 수 있도록 해준다. 코드를 동기적인 구문과 유사하게 작성할 수 있으며, 에러 처리도 편리하게 처리할 수 있다. Async/Await은 비동기 작업을 단순하고 직관적으로 다루기에 적합하다.
  • 따라서, 데이터 스트림의 처리와 복잡한 비동기 작업 흐름을 다루어야 하는 경우 Combine을 사용하는 것이 좋고, 단순한 비동기 작업 처리와 읽기 쉬운 코드 작성을 위해서는 Async/Await을 사용하는 것이 좋습니다.

결론

Swift의 Combine과 Async/Await은 모두 비동기 프로그래밍을 위한 강력한 도구다. Combine은 데이터 스트림의 처리와 변환에 적합하며, Async/Await은 비동기 작업을 간결하고 직관적으로 처리할 수 있도록 도와준다. 개발자는 사용 사례와 요구 사항을 고려하여 적절한 도구를 선택할 수 있어야 한다.

 

 

 

반응형

'iOS' 카테고리의 다른 글

SwiftUI @State  (0) 2023.06.01
MVVM 패턴  (0) 2023.05.31
Swift Async/Await  (0) 2023.05.28
Swift Combine  (0) 2023.05.27
inout / mutating  (2) 2023.05.26