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 디자인 패턴을 사내 프로젝트에 적용할 예정이다.

아직도 재밌는 일이 많이 남아있어 프로그래밍을 놓을 수 없는 것 같다. 👨🏻‍💻

TIL 31: Objective-C의 Block 사용 시 메모리 누수 주의! 프로그래머스 문제 풀이: 42862 - 체육복