값을 변형하고 전달하는 Operator
지금까지 Combine의 핵심 요소인 Publisher와 Subscriber에 대해 알아보았습니다.
이제 그 둘 사이에서 값을 가공하고 흐름을 제어하는 중간 단계,
바로 Operator에 대해 살펴볼 차례입니다.
Operator의 기본 정의
Operator는 Publisher가 전달한 값을
변형(transform)하거나 필터링(filter) 한 후,
그 결과를 Subscriber에게 전달하는 중간 처리 역할을 합니다.
Operator는 Combine에서 아주 유연한 존재입니다.
입력(Input), 출력(Output), 실패 타입(Failure) 을 각각 다르게 가질 수 있고,
앞단 Publisher의 값을 받아 Subscriber처럼 동작하며,
동시에 그 값을 가공해 다음 Subscriber에게 보내는 Publisher 역할도 합니다.
즉, Operator는 Publisher이면서 Subscriber인 구조를 가지고 있습니다.
다양한 빌트인 Operator
아래 이미지에서 볼 수 있듯이, Combine은 매우 다양한 종류의 Operator를 기본으로 제공합니다. 이 중 자주 사용되는 빌트인 Operator들은 따로 정리해서 다음 글에서 자세히 소개해드릴 예정입니다.
작업의 실행 타이밍을 조절하는 Scheduler
지금까지 Combine에서 데이터를 생성하는 Publisher, 그 데이터를 수신하는 Subscriber,
그리고 그 사이에서 값을 가공하는 Operator에 대해 알아보았습니다.
이번에는 이 모든 흐름에서 “언제, 어떤 스레드에서 작업이 실행될지” 를 결정짓는
마지막 퍼즐 조각인 Scheduler에 대해 살펴보겠습니다.
Scheduler의 기본 정의
Apple은 Scheduler를 다음과 같이 정의합니다:
A protocol that defines when and how to execute a closure.
(클로저를 언제 그리고 어떻게 실행할지 정의하는 프로토콜)
즉, Combine에서 Scheduler는 비동기 흐름 중 작업이 실행될 타이밍과 위치를 조절하는 역할을 합니다.
다양한 Operator에서 Scheduler를 파라미터로 받기 때문에, 작업을 백그라운드에서 수행하거나
메인 스레드에서 UI를 업데이트하는 등의 동작 제어가 가능합니다.
Scheduler 자체는 스레드가 아니라, 스레드와 연관된 실행 정책을 추상화한 객체입니다.
두 가지 Scheduler 메서드
Combine에서 Scheduler를 설정할 수 있는 대표적인 메서드는 두 가지입니다:
1. .subscribe(on:)
→ Publisher가 어떤 스레드에서 데이터를 생성하고 방출할지 결정합니다.
무거운 작업은 메인스레드가 아닌 다른 스레드에서 실행하도록 합니다.
예시:
- 백그라운드 계산이 필요한 경우
- 파일 다운로드, JSON 파싱 등 무거운 작업
2. .receive(on:)
→ Subscriber(또는 이후 Operator)가 어떤 스레드에서 데이터를 받을지 결정합니다.
주로 UI 업데이트가 필요한 경우 메인 스레드에서 진행하도록 합니다.
예시:
- 서버에서 받은 데이터를 UI에 바인딩해야 할 때
import Combine
let jsonPublisher = MyJSONLoaderPublisher() // Some publisher
jsonPublisher
.subscribe(on: backgroundQueue) // 백그라운드에서 네트워크 작업
.receive(on: RunLoop.main) // 메인 스레드에서 UI 업데이트
.sink { value in
label.text = value
}
이 코드를 통해 Combine은 다음과 같은 흐름을 따릅니다:
- 서버에서 JSON 데이터를 받는 작업을 백그라운드 큐에서 수행하고,
- 받아온 데이터를 실제 UI에 반영할 때는 메인 스레드로 전환해
- 안전하게 label.text와 같은 UI 요소를 업데이트합니다.
기본적으로 Combine을 사용하지 않고 DispatchQueue, RunLoop, OperationQueue 등을 기반으로 구현을 할 수 있으나
Apple은 이러한 객체를 직접 사용하는 것보다 Combine의 Scheduler를 통해 작업을 제어하는 방식을 권장하고 있습니다.
마무리
이번 글에서는 Combine의 Operator와 Scheduler에 대해 알아보았습니다.
다음 글에서는 자주 사용하는 Operator의 예시를 소개해드릴게요. 🚀
궁금한 점이나 피드백은 언제든 댓글로 남겨주세요! 부족한 내용이지만 끝까지 읽어봐주셔서 감사합니다.
오늘도 개발자를 위한 명언으로 마무리하도록 하겠습니다! 파이팅입니다~
Successful development includes not only coding, but also debugging, testing, deployment, and maintenance.
성공적인 개발은 코딩만이 아니라, 디버깅, 테스팅, 배포, 유지보수도 포함된다.(피터 푸어 )
'iOS 개발 > Combine' 카테고리의 다른 글
[Combine] Operator Guide (1) | 2025.05.02 |
---|---|
[Combine] 데이터를 처리하는 Subscriber (0) | 2025.04.28 |
[Combine] 데이터를 생산하는 Publisher (0) | 2025.04.25 |
[Combine] 왜 Combine을 알아야 할까? (0) | 2025.04.23 |