ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Hello Combine
    Combine 2022. 10. 1. 16:44
    공부한 내용을 바탕으로 생각을 정리한 글입니다.
    잘못된 내용이나 수정 보완이 필요한 내용은 댓글로 알려주시면 감사하겠습니다.

     

    핵심 요약 👨🏻‍💻

    Combine 은 비동기 이벤트를 처리하기 위해 declarative Swift API 를 제공하는 프레임워크 입니다.
    Combine 의 3가지 핵심 개념은 Publisher, Operator, Subscriber 입니다.
    Publisher 가 이벤트를 방출하면, 그걸 Subscriber받아주고, 중간에서 Operator 들을 사용해 원하는 형태로 이벤트를 전달합니다.
    Operator는 upstream 을 받아, downstream 을 내보내며, 순서를 건너뛰지 않고 다른 Operator 를 바꿀 수 없습니다.

     

    Combine

    Combine은 비동기 이벤트를 손쉽게 다루기 위해  ios 13부터 애플에서 제공하는 프레임워크 입니다.
    Publisher (protocol) 이 이벤트를 방출하고 이를 Subscriber (protocol) 이 구독하는 메커니즘 입니다.
    이전에는 비공식이지만 거의 공식(?)처럼 널리 사용되어 왔던 RxSwift 와 큰 메커니즘이 거의 비슷합니다.

     

    Asynchronous Programming

    멀티 스레드 환경에서는 병렬적으로 일어나는 비동기 작업들을 처리해야 하는 상황을 쉽게 만날 수 있습니다.
    대부분의 앱에서는 사용자가 터치하는 순간 서버로 요청을 보내거나 정보를 저장하고 그 와중에 사용자는 계속해서 스크롤도 하고 다른 작업들을 할 수 있어야 하기 때문이죠. 
    기본적으로 병렬적으로 수행되는 일련의 작업들은 어느 작업이 먼저 끝날지 장담할 수 없습니다. 네트워크 상황에 따라 다를 수도 있고, 시스템 상황에 따라 달라질 수 있습니다. 하지만 우리는 일련의 작업들을 순서에 맞게 처리해야 합니다. 서버에 요청을 했다면 그 응답에 따라 다른 정보를 제공해야 하죠. 애플에서는 이러한 비동기 작업들을 처리하기 위해 다음과 같은 방법들을 제공해왔습니다.

    - NotificationCenter
    - Delegate Pattern
    - GCD (Grand Central Dispatch), Operations
    - Closure

    이러한 도구들을 이용해 충분히 훌륭한 앱을 만들 수 있지만 꽤나 복잡하고 많은 양의 코드가 필요합니다. 이는 실수를 유발하고 점점 유지보수를 어렵게 합니다. 그렇기에 이를 효율적으로 처리하기 위한 RxSwift 같은 여러 프레임워크들이 만들어져왔겠죠. 하지만 이러한 프레임워크는 써드파티 라는 부담감이 항상 존재합니다. 애플에서 무언갈 바꿀 때마다 누군가는 이에 맞춰 업데이트 시켜줘야 하는거죠. 물론 지금까지는 너무도 감사하고 훌륭한 개발자들께서 잘 관리해주셔서 편하게 사용해왔고 사용하고 있지만요.

    이제는 드디어 애플에서 Combine 이라는 공식 프레임워크를 만들어주었습니다. SwiftUI 를 만들고 MVVM 을 아키텍처 패턴을 밀려고 하다보니 자기들도 너무 불편하다는 걸 깨달은거겠죠..? 😅

    Basic Combine

    Combine의 기본 메커니즘은 Publisher가 이벤트를 방출하고 Subscriber가 이를 구독해서 받는 구조입니다. 먼저 구독 관계를 설정하고 처리 방식을 정한다는 측면에서 선언적입니다.

    따라서 Combine의 핵심 개념은 보내는 Publisher, 받는 Subscriber, 중간에서 이벤트를 원하는 형태로 다루는 여러 Operator 라고 볼 수 있습니다.

    - Publishers
    - Operators
    - Subscribers

    Publishers

    앞서 Publisher 가 이벤트를 방출하는 역할을 한다고 말씀드렸는데요. 여러 이벤트를 방출할 수 있지만
    성공(원하는 Output), 완료, 실패(Failure) 3가지 형태로 방출합니다.

    - Output
    - completion
    - Failure

    완료는 말 그대로 스트림 (이벤트의 흐름을)이 완료되었을 때이며 스트림이 종료됩니다. Failure는 이벤트가 어떤 이유로 이벤트가 정상적으로 원하는 결과를 내보낼 수 없음을 의미합니다. 이 경우에도 스트림이 종료됩니다. 원하는 형태의 Ouput 이벤트는 여러 번 방출할 수 있습니다.

    따라서 Publisher는 어떤 결과를 받을 것인지, 실패 타입은 어떤 건지 정의해줘야 하고 다음과 같이 정의됩니다.

    protocol Publisher<Output, Failure>

     

    Operators

    Operator 는 Publisher 에 정의된 메소드입니다. 어떤 이벤트를 받아서 (Input) 어떤 이벤트를 내보낼지 (Output) 에만 집중합니다. 독립적이고 여러 Operator 와 결합할 수 있습니다. 이전 Operator 에서 이벤트를 받아 다음 Operator 로 전달합니다. Operator를 사용하므로써 비동기 이벤트들을 건너뛰지 않고 중간에 다른 이벤트의 상태를 바꾸지도 않는다는 걸 보장할 수 있습니다.

    받는 이벤트를 upstream, 내보내는 이벤트를 downstream 이라고 부릅니다. 

    Subscribers

    subscriber는 publisher를 구독하고 있다가 publisher 가 방출한 이벤트를 받습니다.
    (publisher는 하나 이상의 subscriber가 있어야만 이벤트를 방출합니다.)

    publisher 가 방출하는 3가지 타입의 이벤트를 받아 이를 처리합니다.

    이벤트를 받아 클로저 안에서 특정 작업 처리하거나 (sink), 모델이나 UI와 결합시키는 (흔히 바인딩이라 부름) (assign) 2가지 형태로 이벤트를 받을 수 있습니다.

    - sink
    - assign

    댓글

Designed by Tistory.