본문 바로가기
IOS

[iOS] Rx 다시 정복(1) feat. Rx Study발표 - 에이젠

by eigen96 2022. 12. 19.
728x90

 

이전에도 Rx에 대해 포스팅한 적이 있습니다. 그때보다 더 쉽게 더 자세하게 간지러웠던 부분까지 다시 정리해보려고 합니다. 


CMC에서 알게된 iOS 개발자분들과(8기, 10기, 11기) 취업을 목표로 스터디를 시작하게 되었습니다.

주제는 세션마다 바꿀 예정이구요. 첫 주제는 RxSwift가 되었습니다.

프로젝트에 RxSwift를 적용해본 경험이 있던 제가 먼저 자연스럽게 첫 발표를 맡게 되었습니다.

막상 Rx가 처음이신 분들께 설명해보려고 하니 이전에 정리한 글과 공식문서의 설명은 마음에 들지 않더군요. ㅎㅎㅎ

 

RxSwift는 반응형 프로그래밍 프레임워크라고 소개됩니다.

반응형 프로그래밍 패러다임. 반응형 프로그래밍을 가능하게 해주는 도구죠.

 

그리고 함수형 프로그래밍과 결합하여 더 반응성이 좋은 앱을 만들 수가 있다고 합니다.

Rx 처음 정리할때는 그냥 그렇구나... 했고 예제나 빨리 적용해야지 하고 넘어갔었습니다. 

 

함수형 프로그래밍이랑 어떻게 결합하는 거고 반응형 프로그래밍은 뭔데? 함수형 프로그래밍이 뭔지 설명해보라하면 설명 가능한가? 면접때 질문 들어오면 이걸로도 말릴 수 있겠죠 ㅎㅎㅎㅎ

 

함수형 프로그래밍이란?

함수를 사용하여 데이터를 변환하는 것을 강조하는 프로그래밍 패러다임입니다.

함수형 패러다임이란?? 디자인패턴이랑 뭐가 달라??

1. 프로그래밍 패러다임은 컴퓨터 프로그램의 구조와 동작에 대해 생각하고 구성하는 방법

2. 디자인 패턴은 소프트웨어 디자인의 일반적인 문제에 대한 재사용 가능한 솔루션.

일반적으로 프로그래밍 패러다임은 프로그램의 전체 구조 및 구성과 관련이 있는 반면 디자인 패턴은 소프트웨어 디자인의 일반적인 문제에 대한 특정 솔루션에 중점을 둡니다.

선언적 방식으로 데이터에서 작동하는 작고 재사용 가능한 함수를 정의하고 구성됩니다.

 

1. 변경 불가능한 데이터를 사용합니다.  ex) let, imutable

 

2. 일급 함수를 사용.

    함수 자체가 다른 데이터 조각처럼 취급되어 인자로 전달되거나 값으로 반환. 우리가 알고 있던 클로져죠?

 

3. 제어 구조로 재귀를 사용합니다. 복잡한 작업을 수행하기 위해 함수가 자신을 호출.

    (대충 더 모듈화되고 ;테스트하기 쉬운 코드 작성 가능 하다는 것)

 

 

반응형 프로그래밍이란? 

프로그램이 작동하는 데이터 스트림의 변경 사항에 어떻게 반응해야하는지 선언적으로 지정할 수 있다.

 

1. 시간이 지남에 따라 일련의 이벤트를 내보내는 데이터 스트림(Observables)를 만들고 조작합니다.

 

위 두가지 패러다임을 어떻게 결합한다는 게 아직은 추상적으로 느껴지실 겁니다.

예제를 하나 가져와봤습니다.

import RxSwift

let disposeBag = DisposeBag()

let numbers = Observable.of(1, 2, 3, 4, 5)

let squaredNumbers = numbers.map { $0 * $0 }

let evenNumbers = squaredNumbers.filter { $0 % 2 == 0 }

evenNumbers.subscribe(onNext: { value in
    print(value)
}).disposed(by: disposeBag)

이 예제에서는 map 연산자를 사용하여 시퀀스의 각 요소를 제곱하여 변환후 filter 연산자를 사용하여 짝수만 유지합니다.

이 두 연산자는 함수형 프로그래밍 개념의 예입니다.

map은 시퀀스의 각 요소의 변환을 적용하는 고차함수입니다.

filter는 시퀀스의 특정 조건을 만족하는 요소만 유지하는 고차함수입니다.

 

그와 동시에 rxSwift를 통해 시간이 지남에 따라 일련의 이벤트를 방출하는 Observable을 생성하고 조작하기 때문에 반응형 프로그래밍 패러다임을 보여줍니다.

 

subscribe 메소드를 사용하여 이러한 이벤트에 반응하고 새 값이 방출될 때마다 작업을 수행하게 됩니다. 

이렇게 반응형 프로그래밍과 함수형 프로그래밍을 결합하여 선언적이고 더 명확한 코드를 만들 수 있다고 합니다.

 

 

 

An API for asynchronous programming
with observable streams

비동기처리를 쉽게 도와주는 API라고도 소개가 되는데 어떻게 도와준다는 걸까요?

보통 이벤트가 발생하면 콜백 처리를 해줍니다.

리스트 화면을 만든다고 생각해봅시다.

외부 API를 요청하여 데이터가 반환됩니다. ->

해당 데이터를 배열이나 변수에 담고 ->

받은 데이터를 리스트화면에 update시켜주기 위해 직접 테이블뷰의 reloadData() 메서드 호출해주어야합니다. 

너무 귀찮죠. 데이터가 한번 받아오고 끝나는 것이 아닌 데이터가 변화할때마다 처리를 해주어야할 수도 있습니다.

 

RxSwift에서는 

이러한 이벤트들을 구독을 통해서 비동기적으로 이벤트가 발생하였을때 해당 작업을 수행할 수 있도록 해줍니다.

 

 

728x90

댓글