비동기 처리 ( Asynchronous )
코드 실행 결과를 기다리지 않고 바로 다음 코드를 실행하는 병렬 처리 방식을 말합니다.
클라이언트에서 서버로 요청을 보냈을 때, 서버가 언제 요청을 줄지 모르기 때문에
비동기 처리가 필수적입니다. 만약 네트워킹 코드를 "동기적" 으로 작성했을 때에는
아래와 같이 응답(다운로드)이 완료될 때 까지 UI 가 멈추게 됩니다.
( Main Thread 에서 UI 를 update 하는데, 병목 현상이 걸리는 모습 )
Swift 는 비동기 처리를 위해 아래와 같은 API를 사용할 수 있습니다.
GCD ( Grand Central Dispatch )
- 멀티 코어와 멀티 프로세스 환경에서 최적화된 프로그래밍을 할 수 있도록
애플에서 개발한 기술
- 성능이 중요한 작업에 효율적임
Operation Queue
- 내부적으로 GCD 를 사용, 작업이 실행되는 방식을 제어할 수 있는 추가 기능 지원
- Objective-c 코코아 클래스로 구현되어 있음
GCD, Closure Callbacks 사용한 이미지 비동기 처리 코드는 다음과 같습니다.
다른 스레드에서 다운로드를 실행하고, 메인 스레드에서 다운 받은 이미지를 설정하면
동기처리에서 발생한 병목 현상이 생기지 않습니다. 하지만 위 코드 같이 이미지를 다운받도록
구현하는 것은 간단하지만 비동기 코드가 순서를 이루어야 할 경우는 코드가 복잡해집니다.
ex ( 서버에 로그인 요청 -> 로그인 토큰 수신 -> 토큰을 가지고 다시 이미지 요청할 경우 )
위와 같은 복잡한 비동기처리를 간편하게 처리 하기 위해
반응형 ( Reactive ) 프로그래밍 이라는 개념이 등장하게 되었습니다.
반응형 프로그래밍 ( Reactive Programming )
함수형 프로그래밍을 통해 비동기적 데이터 흐름을 제어하는 패러다임
간단하게 설명하기 어려운 개념이지만,
iOS 에서 사용되는 주요 이유는 다음와 같습니다.
1) 비동기 API 를 통합하여 사용할 수 있다.
2) 코드 가독성을 높이고, 간결하게 코딩할 수 있다.
리액티브 프로그래밍은 선언형(함수형 프로그래밍) 방식으로 구성되어,
동기식처럼 코드를 위에서 아래로 읽기 편하게 구성되어 있다는 것이 장점입니다.
또한 Apple 에서는 여러 비동기 API 에서 통합하여 사용할 수 있도록
여러 Publisher 를 제공하고 있습니다.
현업에서 발생될 수 있는 여러 복잡한 비동기 처리를 간편하게 해줄 수 있다는 점에서
좋은 기술이라고 생각했습니다. 하지만 러닝커브가 높기 때문에
초보 개발자가 사용할 때에는 충분한 학습이 필요하다고 생각했습니다.
참고: https://www.raywenderlich.com/books/combine-asynchronous-programming-with-swift/v2.0/chapters/1-hello-combine#toc-chapter-004-anchor-001
'iOS Dev > Reactive' 카테고리의 다른 글
반응형 (Reactive) 프로그래밍을 위한 기초 지식 - 1 (Functional Programming) (0) | 2020.10.14 |
---|