본문 바로가기
iOS

[Combine] Basics #1 (Combine 개념, Publisher 기초)

by SiO2whocode 2025. 6. 18.

Combine은 무엇인가

GPT: 데이터가 시간에 따라 바뀌는 걸 선언적으로 처리하는 프레임워크

Apple:
The Combine framework provides a declarative Swift API for processing values over time. These values can represent many kinds of asynchronous events. Combine declares publishers to expose values that can change over time, and subscribers to receive those values from the publishers.
Combine은 시간의 흐름에 따른 값들을 처리하기 위한 (선언적 Swift API를 제공하는) 프레임워크!
여기서 말하는 값들은 비동기적인 이벤트를 말한다. 즉, 네트워크 API 호출 같은 비동기적인 이벤트에 의해서 시간에 따라 변하는 값을 처리하기 위한 API를 제공하는 것!
Combine은 'publisher'를 선언하여 시간에 따라 변하는 값을 내보내고, 'subscriber'를 선언하여 publisher가 내보낸 값들을 받는 방식으로 동작한다. 
Customize handling of asynchronous events by combining event-processing operators.
그래서, Combine이 제공하는 이벤트 처리 연산자를 조합해서 비동기 이벤트를 필요한 대로 조작할 수 있도록 하는 것이 Combine의 목적.
으로 이해했다.

 

가장 잘 와닿았던 설명은
"비동기 처리는 곧 함수나 이벤트의 완료 순간을 인지한 다음 그 다음 동작을 실행시킬 수 있는 것. 이고, 이를 처리하기 위한 여러가지 비동기 처리 수단 (GrandCentralDispatch (DispatchQueue), Operations, Notification Center 등등) 이 있지만, 이를 통합하여 사용할 수 있도록 만든 것이 Combine" 이라고 합니다.

 

여기서 함수의 완료 순간에 이벤트를 발생시켜 주는 Publisher라는 인터페이스를 활용하면 기존의 비동기 이벤트 처리 수단을 Combine으로 다룰 수 있다. 이런 의미인 것 같습니다. 자세한 내용은 Publisher에 대해서 정리하면서 더 이해해보는 걸로.

 

Combine : Publisher라는 것을 사용해서 비동기 이벤트 처리를 쉽게 할 수 있도록 도와주는 API를 제공하는 프레임워크

 

 

Combine의 3요소

Publisher, Subscriber, Operator 인데요.
- Publisher: 값을 내보내는 것
- Subscriber: Publisher에 의해 방출된(published) 값, 즉 완료된 이벤트를 통해 "무언가"를 하는 것
(여기서 무언가는 스크린에 반영한다던지, 웹서버로 보낸다던지 등등)
- Operator: Publisher가 내보낸 값에 대해 '연산'을 수행하는 것
(ex. map() 내보낸 값을 뭔가 다른 값으로 대응시키는 거겠죠..?)

 

그리고, 이 Operator는 처리된 값에 대해 다시 Publisher를 발행합니다. 즉, 연쇄적인 처리가 가능하다는 거죠 (고차함수 쓰는 것 처럼)

 

Publisher와 Subscriber의 관계

우선 Publisher는 Publisher<OutputType, FailureType>으로 선언됩니다. 즉 Publisher가 값을 내보내는 친구니까, 내보내는 값이 어떤 타입인지 = OutputType, 오류가 발생했을 때 어떤 타입의 오류를 내보낼건지 FailureType을 정해야하는 거겠죠. (참고로 FailureType에는 Never라는 '에러가 발생하지 않음' 이라는 타입도 있습니다.) 
*여기서 Failure는 Error타입입니다.
그리고 이 Publisher가 내보내는 값을 받는 'Subscriber'은 Subscriber<InputType, FailureType>으로 정의되고, 이는 이 Subscriber가 값을 받아올 Publisher의 OutputType, FailureType과 동일해야합니다.
 
Publisher와 Subscriber를 연결하는 것은 publisher의 receive(subscriber) method를 통해서 입니다.
연결 후에는 Publisher가 Subscriber의 함수를 호출할 수 있다고 합니다 (receive 같은... - 이것도 뒤에 자세히)
 

Publisher 종류

앞에서 Publisher는 인터페이스 즉 프로토콜이라고 했는데요, 애플에서 Publisher를 편하게 쓸 수 있도록 몇가지 구현체를 만들어 두었습니다. 는 아래와 같이 Future, Just, Deferred, Empty, Fail, Record 가 있고 이 외에도 직접 커스텀한 Publisher를 만들어서 사용할 수도 있습니다.
여기서 간단하게 각각 설명하자면,
- Future : 1회성으로 값 or 실패 에러를 방출하고 완료되는 Publisher
- Just: Just Publisher를 구독하고 있는 Subscriber에게 한번씩 값을 방출하고 완료되는 Publisher
 ex. Just("hello")라고 하면 이 Publisher는 hello를 내보낸 뒤 종료됩니다.
- Empty: 값을 내보내지 않고 즉시 종료하는 Publisher
- Fail: 에러와 함께 종료되는 Publisher
- Deffered: 구독할 때 생성되는 Publisher 즉, 지금이 아니라 Publisher가 구독 됐을 때 값을 방출하고 싶을 때 사용
- Record: 미리 녹음(Record)된 이벤트를 발행하는 Publisher. 테스트나 시뮬레이션 용으로 미리 정의된 값들을 순서대로 발행하는 Publisher.
+ 추가로 custom publisher의 생성 방법 중 하나는 변수에 @published를 선언하는 것임. 이러면 그 변수 값이 변할 때 마다 이벤트를 방출하는 publisher를 얻을 수 있다고 합니다.
우리가 Observable Object에서 @published선언 해두면 그 구조체를 감시하는(?) @Observed 의 값이 갱신되는 것과 연결된 개념인 것 같습니다.

 

 
728x90