RxSwift, 쉽게 이해하고 싶다.

sonny·2024년 12월 26일
2

TIL

목록 보기
83/140

1. RxSwift란

RxSwift는 데이터의 변화를 감지하고 반응하는 리액티브 프로그래밍(Reactive Programming)을 위한 Swift 라이브러리인데,
한마디로 이벤트가 발생할 때마다 자동으로 반응하는 프로그램을 쉽게 만들 수 있게 도와주는 라이브러리라고 보면 된다.

실생활 비유

버스 정류장에서 버스를 기다린다고 상상해 보자.

  • Observable(관찰 가능한 것): 버스가 온다.
  • Observer(관찰자): 나는 버스를 기다리고 있다.
  • 버스가 도착하면(이벤트), 나는(관찰자) 반응한다. 타야하니까.

RxSwift에서는 이 과정을 코드로 표현해주는 것과 같은데 데이터의 흐름을 마치 "버스를 기다리는 것처럼" 선언적으로 다룰 수가 있다.


2. 왜 RxSwift를 사용할까?

기존 방식에서는 UI 업데이트, 비동기 작업(API 호출 등), 이벤트 처리 등을 코드로 모두 직접 연결해야 했는데, 이렇게 되면 코드가 길어지고 유지보수가 어려워진다고 한다.

RxSwift를 사용한다면,

  • 데이터를 깔끔하게 관리하고!
  • 비동기 작업을 쉽게 처리하고!
  • UI 이벤트와 데이터 흐름을 자연스럽게 연결할 수 있다!

3. RxSwift 기본 개념

1) Observable

Observable은 이벤트 스트림(데이터 흐름)을 나타내는데, 표현하자면 "변화를 관찰할 수 있는 데이터"라고 생각하면 된다.

let observable = Observable.of(1, 2, 3)
observable.subscribe { event in
    print(event)
}

위 코드는 1, 2, 3이라는 데이터 흐름을 출력한다.

2) Observer

Observer는 Observable을 구독(subscribe)해서 데이터가 바뀌면 반응하는 역할을 한다.

observable.subscribe(onNext: { value in
    print("다음 값: \(value)")
})

3) Operators (연산자)

연산자는 Observable의 데이터를 변형하거나 필터링을 한다.

let numbers = Observable.of(1, 2, 3, 4, 5)
numbers.filter { $0 % 2 == 0 }
    .map { $0 * 10 }
    .subscribe(onNext: { print($0) })

결과 값은 20, 40 이 나온다.


4. RxSwift와 UI의 만남 – RxCocoa?

RxCocoa는 UI 이벤트와 RxSwift를 연결하는 다리 역할을 하는데,
예를 들어 버튼 클릭 이벤트를 처리하려면

button.rx.tap
    .subscribe(onNext: {
        print("버튼이 클릭되었습니다!")
    })
    .disposed(by: disposeBag)

텍스트 입력 반응형 UI 예시

textField.rx.text.orEmpty
    .map { $0.uppercased() }
    .bind(to: label.rx.text)
    .disposed(by: disposeBag)

입력된 텍스트가 실시간으로 대문자로 변환되어 라벨에 표시된다.

코드 동작을 요약하자면,

  • 사용자가 텍스트 필드에 입력 → textField.rx.text.orEmpty로 감지.
  • 입력 값을 대문자로 변환 → .map { $0.uppercased() }
  • 변환된 대문자 값을 라벨에 반영 → .bind(to: label.rx.text)
  • 메모리 관리를 위해 disposeBag에 구독 추가 → .disposed(by: disposeBag)

자, 다시 RxSwift의 기초 개념 복습하기

기초 개념

  • Observable: 데이터를 비동기로 방출하는 스트림이다.
  • Observer: Observable을 구독하여 데이터를 받는 역할을 한다.

Subjects

BehaviorSubject: 가장 최근 값을 저장하고, 새로운 구독자가 구독하면 즉시 전달한다.
PublishSubject, ReplaySubject 등도 사용법을 익히는 것이 좋다고 한다. 하아...

Operators

map, filter, flatMap, withLatestFrom 등의 주요 연산자를 공부해놓으면 좋다고한다.
특히 withLatestFrom의 경우 두 개의 스트림을 결합하는데 자주 사용되어서 이 연산자를 잘 이해하는게 포인트라고..

그럼 바로 공부해야지 withLatestFrom!!


withLatestFrom을 아주 쉽게 설명하자면 "버튼을 누를 때마다 최신 정보를 가져오는 도구"라고 한다.

쉽게 생각해 보자

  1. 텍스트 필드에 무언가를 입력한다고 생각하면,
    • 여기서 입력된 값이 계속 바뀔 것이다.
  2. 그리고 버튼을 누른 순간, 버튼이 입력된 값 중 가장 마지막 값을 가져온다.
    • 즉 최신 값만 가져오는 역할을 한다는 것.

상황으로 비유하자면,

  • 데이터(텍스트 필드): "사용자가 메시지를 입력하는 창" 이 있을 것이고
  • 트리거(버튼): "보내기 버튼" 이 있을 것이다.

사용자가 메시지를 입력하다가 보내기 버튼을 누르면, 버튼을 누른 순간에 메시지 창에 적힌 최신 메시지가 전송되는 것이다.


예시를 보자

let button = PublishSubject<Void>()   // 버튼 클릭
let textField = BehaviorSubject<String>(value: "안녕") // 텍스트 입력값

button.withLatestFrom(textField)
    .subscribe(onNext: { latestText in
        print("버튼 클릭 후 가져온 텍스트: \(latestText)")
    })
    .disposed(by: disposeBag)
  1. 텍스트 필드의 값이 "안녕"으로 시작할 것이고,
  2. 사용자가 텍스트 필드에 "안녕하세요"라고 입력했다고 하자.
  3. 그리고 버튼을 누르는데,
  4. 버튼을 누른 순간, 텍스트 필드의 최신 값인 "안녕하세요"가 출력이 된다.

그러니까..

  • 버튼을 누른다(트리거)텍스트 필드에서 최신 값을 가져온다.
  • "클릭한 순간에 최신 정보만 필요할 때" 쓰는 도구라고 생각하면 된다.

음...

솔직히 rxSwift 공부시작할 때 기존에 배웠던 swift 랑은 아예 다른 언어를 배운다는 느낌이 들어서 괜히 피하고 싶고 공부하기 제일 힘들었던 것 같다.

차근차근 공부해도 어려울 것 같은데 시간은 촉박하니 마음만 급해졌지만, 어쩌겠어 해야지.

네트워크 요청과 RxSwift를 결합하는 방법을 공부해서 간단한 RxSwift 기반의 프로젝트(검색 앱이나 To-Do 리스트 앱)를 만들어보는걸 시도해봐야겠다.

profile
iOS 좋아. swift 좋아.

0개의 댓글

관련 채용 정보