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보다 안전하고 명확하게 쓸 수 있나? ✅ 특히 상태 추적용으로
'Devlog👩🏻💻 > Swift' 카테고리의 다른 글
[RxSwift] 값 방출: onNext vs accept (0) | 2025.05.21 |
---|---|
[Swift] compactMap vs filter (0) | 2025.02.19 |
[Swift] 초기화(Initializers) (0) | 2024.03.13 |
[Swift] Optional (3) | 2024.03.08 |
[Swift] 컬렉션 타입(Collection Type) - Dictionary, Set (2) | 2024.01.24 |