본문 바로가기

iOS

[iOS] Combine 프레임워크

안녕하세요. 테크지니어22입니다.

오늘은 combine 프레임워크에 대해서 알아보도록 하겠습니다.

 

1. Combine이란 ?

선언적 방식으로 비동기 프로그래밍을 단순화한 반응형(Reactive) 프레임워크
  • 선언적이면 뭐가 좋아?
    • 선언형은 how가 아니라 what에 집중한 방식.
    • 데이터 흐름이 간결해지고, 체이닝을 통한 직관적 코드 작성이 가능함. → 이는 곧 유지보수를 용이하게 함.
  • 반응형이란?
    • 변화하는 데이터나 이벤트에 따라 자동으로 반응.

2. Combine이 탄생한 이유

기존 비동기 처리 방식의 한계
  • 콜백 지옥 발생
    • 데이터 흐름 추적 , 유지보수 어려움
  • NotificationCenter & KVO (Key-Value Observing)의 복잡성
    • 옵저버 등록/해제 필수
    • 놓쳤을때 메모리 관리 이슈 발생 가능.
  • 클로저 기반 비동기 처리 한계
    • 여러 비동기 작업 체이닝 시 가독성 떨어짐
    • 에러 처리 복잡해짐.

3. Combine 특징

  • Publisher(데이터를 방출) & Subscriber(데이터를 받아서 처리) 패턴
  • 비동기 데이터 스트림을 체계적으로 관리하여 데이터 흐름 추적 용이
  • 콜백 지옥 해결
  • 에러처리 단순화
  • UI 업데이트 등 이벤트 프로그래밍에 효과적.

4. Combine 핵심 개념

1)  Publisher

  • 데이터를 생성하고, 데이터 변경사항을 방출하는 역할
  • ex) Just, Future, @Published로 선언된 속성 등.

2) Subscriber

  • Publisher가 방출한 데이터를 받아서 처리하는 역할
  • ex) sink(receiveValue:), assign(to:on:)

3) Operator

  • Publisher가 방출한 데이터가 Subscriber에게 가기 전에 데이터를 변환하고 조작하는 역할
  • 예시
    • map(값변환), filter(특정조건에 맞는 값만), flatMap(여러 Publisher 하나의 Publisher로 처리)
    • combineLatest(모든 Publisher가 최소 한 번 값을 방출해야 동작, 이후 하나라도 변경되면 최신 값을 결합하여 방출),
    • merge(여러 Publisher를 하나의 스트림으로결합, 동일한 Output타입만 결합가능)
    • debounce(짧은 시간 내에 여러 개의 값 무시, 마지막 값만 지정한 시간 후에 전)

4) Subject( Publisher + Subscriber )

  • Publisher처럼 데이터를 방출할 수 있고, Subscriber처럼 외부에서 값을 받아서 처리할 수 있음
  • 외부에서 값을 직접 제어해야하는 경우 사용.
  • PassthroughSubject
    • 값을 받으면 subscriber에게 즉시 전달.
    • UI 이벤트, 네트워크 응답에 활용
  • CurrentValueSubject
    • 초기값을 가짐, 최신 값을 저장하고 있어서 새로운 Subscriber가 구독하면 가장 최근 값 받음.
    • 상태 관리 (UI 상태 저장)

5. 번외 - 언제 Combine을 쓰고, 언제 async/await을 써야 할까?

Combine이 적합한 경우

  • 데이터가 지속적으로 변화하는 경우 → 이벤트 스트림 처리
  • UI 업데이트 및 데이터 바인딩 (예: SwiftUI의 @Published와 결합)
  • 다중 이벤트를 처리해야 하는 경우 (예: 네트워크 스트리밍, WebSocket, 실시간 업데이트)
  • 여러 개의 비동기 작업을 조합해야 하는 경우 (예: merge, combineLatest 활용)

async/await이 적합한 경우

  • 한 번의 요청/응답이 있는 비동기 작업 (예: API 호출)
  • 단순한 비동기 작업을 동기 코드처럼 쉽게 작성하고 싶을 때
  • Combine을 사용하기 어려운 기존 코드와 통합해야 할 때