TIL 30: RxSwift 맛보기
TL;DR
RxSwift
를 적용하면, 콜백 지옥에서 벗어나 새로운 방식으로 비즈니스 로직을 구현할 수 있다.- 얼른 맛보자 😋
ReactiveX
Observer 패턴, Iterator 패턴, 함수형 프로그래밍의 집합체로 정의된 ReactiveX
는
흐름에 따른 비동기 프로그래밍 방식을 지원해주는 유용한 API다.
자세한 설명은 공식 홈페이지에
문서가 잘 되어 있으니 어떤 느낌인지 알아가는 데 도움이 될 것이다.
흐름과 비동기, 그리고 함수형을 이용함으로써, 프로그래밍 방식이 매우 달라진다.
흐름
을 통해 여러 처리를 하나의 흐름으로 합쳐 동기적으로 동작하게 하거나, 다수의 흐름을 병렬적으로 수행하고 하나의 흐름으로 결과를 내거나, 중간에 에러를 발생시켜 흐름을 끊어버리는 등과 같이 다양한 조작으로 원하는 로직을 자연스럽게 처리할 수 있다.비동기
를 기반으로 하기 때문에 각 흐름의 입력과 출력에만 집중해 로직을 구현할 수 있다. 항상 처리를 기다릴 필요 없이 흐름의 출력을 바탕으로 원하는 로직으로 조립해 사용하면 된다.함수형
프로그래밍이 기본이므로, 내부에서 상태를 조작하는 것보다는 입력과 출력에 집중해 비즈니스 로직을 구현할 수 있다. 그로 인해 상태가 꼬이는 실수를 하거나 로직이 복잡해지는 등의 문제를 방지할 수 있다.
이러한 장점을 느껴보고자 ReactiveX
의 Swift 버전인 RxSwift
를 공부해서 사내 프로젝트에 일부 도입을 시도해봤고,
성공적으로 적용되어 만족감을 느꼈다.
콜백 지옥에서 벗어나자
일단, RxSwift
를 네트워크 처리 부분에 먼저 도입했다.
기존에 Alamofire
오픈 소스 라이브러리를 사용해 사내 라이브러리에 맞게 커스텀한 부분을
RxSwift
를 이용해 Wrapping하여 Rx
버전을 추가로 구현했다.
네트워크 처리를 구현하면서 자주 사용하던 방식은 성공, 실패, 완료 등의 콜백 Closure를 전달한 방식이다. 이는 다수의 네트워크 처리나 로직이 연쇄될 경우 콜백 지옥을 야기할 수 있다. 중괄호 Depth가 계속 생기는 것이다. 콜백 지옥을 느껴보면, 코드의 품질이 낮아보이고 어떻게든 개선하고 싶은 욕구가 생길 것이다.
이 부분을 RxSwift
를 적용해 처리해보니,
항상 매개변수로 전달하던 콜백 Closure는 사라지고,
응답 흐름에 대해서 다른 흐름을 추가로 연쇄하거나 응답을 변형하는 등과 같이 원하는 로직을 자연스럽게 처리할 수 있었다.
그리고 다수의 네트워크 처리를 병렬로 수행해 그 결과에 따른 처리가 편해지고,
DisposeBag
을 활용하니 효율적으로 리소스를 관리할 수 있었다.
이제 맛보기 단계인데 정말 맛있어서 얼른 다른 부분에도 적용하고 싶은 욕심이 생긴다.
다른 오픈 소스 라이브러리와의 조합(특히, UIKit
과 연동된 RxCocoa
)도 좋아서 차근차근 도입할 예정이다.
최종적으로 MVVM
디자인 패턴을 사내 프로젝트에 적용할 예정이다.
아직도 재밌는 일이 많이 남아있어 프로그래밍을 놓을 수 없는 것 같다. 👨🏻💻