Devlog👩🏻‍💻/Swift

[RxSwift] BehaviorSubject 🆚 BehaviorRelay 값 보관 스트림

yujjne 2025. 5. 22. 14:26

BehaviorSubject와 BehaviorRelay 를 사용하는 것의 차이를 공부해보자 📚

 

👇 BehaviorSubject와 BehaviorRelay는 RxSwift에서 자주 사용하는 값 보관형 스트림(시퀀스)이지만, 몇 가지 중요한 차이점이 있다!

 

✅ BehaviorSubject

특징

  • RxSwift의 Subject 계열 타입 (Observer + Observable)
  • 초기값이 필요하며, 이후 .onNext()로 값을 방출함
  • 현재 값을 유지하고 있고, 새로운 구독자에게는 마지막으로 방출된 값을 즉시 전달함
  • .onError(), .onCompleted() 호출 가능
let subject = BehaviorSubject(value: "초기값")

subject.onNext("A")
subject.subscribe(onNext: { print($0) }) // -> "A" 출력

 

✅ BehaviorRelay

🔁 BehaviorSubject를 래핑(wrap)한 형태지만, 상태를 계속 유지하고 완료/에러가 없음 !!

 

특징

  • RxCocoa에서 제공
  • 내부적으로는 BehaviorSubject를 사용
  • .accept() 로 값 설정 (기존의 .onNext() 대신)
  • .asObservable() 없이도 바인딩에 적합
  • .onError()나 .onCompleted()가 없음 (UI 상태 관리에 안정적)
let relay = BehaviorRelay(value: "초기값")

relay.accept("B")
relay.subscribe(onNext: { print($0) }) // 👉 "B" 출력

 

🆚 주요 차이점 정리

항목 BehaviorSubject BehaviorRelay (RxCocoa)
초기값 필요함 필요함
값 변경 .onNext(value) .accept(value)
완료/에러 이벤트 이벤트 가능 (onCompleted, onError) ❌ 불가능 (안정적 상태 유지)
Observavle로 사용 asObservable() 필요 필요 생략 가능
주로 사용 위치 일반 로직, 네트워크 처리 등 UI 상태 관리, ViewModel

 

🔎 결론

BehaviorSubject

  •  일반 스트림 또는 네트워크 응답 처리 : 일시적으로 완료되거나 실패할 가능성이 있는 스트림에 적합하다.
  • 상태(state) 관리가 목적

 

BehaviorRelay

  •  UI 상태 관리 (ViewModel):  UI 바인딩, 상태 관리, 목록 관리 등 지속적인 상태에 적합하다.
  • 에러/완료 필요 없다면 BehaviorRelay가 더 안전하고 깔끔 ! → Relay는 끝남이나 에러 라는 개념 자체가 없기에 계속 전달 가능하다

 

 

패턴 추천
ViewModel의 상태 저장 ✅ BehaviorRelay
사용자 이벤트 처리 ✅ PublishSubject
비동기 처리 결과 전파 ✅ Subject 계열 (에러/완료 가능)

 

  • 상태를 저장하고 UI에 바인딩하는데 더 적합한 건? ✅ BehaviorRelay
  • BehaviorSubject보다 안전하고 명확하게 쓸 수 있나? ✅ 특히 상태 추적용으로