안녕하세요, iOS 개발하는 루피입니다.
오늘은 제가 RxSwift 관련 강의를 보며 공부했던 내용을 정리해보고, 그 과정에서 생긴 의문들도 해결해 보려고 합니다. 혹시 여러분도 iOS 개발을 하면서 네트워크 작업을 어떻게 처리할지 고민해본 적이 있으신가요?
저는 매번 그런 난관에 마주합니다 네트워크 요청이 끝난 후 데이터를 어떻게 처리하고, UI는 어떻게 유지할 것인지, 그리고 비동기적으로 모든 걸 처리하는 방법들 고민하는데 쉽지 않더라고요... 하지만 이번에 RxSwift와 RxAlamofire를 사용해 네트워크 요청을 처리하는 방법을 배워 보았습니다.
네트워크 작업을 쉽게 관리하는 구조
RxSwift는 단순한 비동기 처리 이상의 강력한 기능을 제공합니다. 특히 RxAlamofire와 함께 사용하면 Alamofire의 네트워크 요청을 리액티브하게 다룰 수 있죠! 이제 RxSwift와 RxAlamofire로 네트워크 모듈을 만들어보겠습니다.
네트워크 클래스 구현하기
import Foundation
import RxSwift
import RxAlamofire
class Network<T: Decodable> {
private let endpoint: String
private let queue: ConcurrentDispatchQueueScheduler
init(endpoint: String) {
self.endpoint = endpoint
self.queue = ConcurrentDispatchQueueScheduler(qos: .background)
}
}
- 제네릭 클래스: 여기서 T는 제네릭 타입으로, Decodable 프로토콜을 준수하는 객체여야 합니다. 이렇게 하면 다양한 API 응답을 유연하게 처리할 수 있겠죠?? API에서 무슨 데이터가 오든 문제없다는 뜻입니다.
- endpoint: API의 기본 URL을 저장합니다. 이 URL에 경로를 붙여서 요청을 보낼 예정입니다.
- queue: 네트워크 작업이 메인 스레드를 차지하지 않도록 백그라운드 스레드에서 실행되도록 설정했습니다.
비동기 네트워크 요청, 정말 간단하게!
이제 본격적으로 네트워크 요청을 만들어보겠습니다. RxAlamofire를 사용하면 네트워크 요청을 정말 간단하게 처리할 수 있더라고요. 저는 이번에 처음 써봤는데 많이 편했습니다 ㅎㅎ.
func getItemList(path: String) -> Observable<T> {
let fullPath = "\\(endpoint)\\(path)?api_key=\\(apiKey)&language=ko"
return RxAlamofire.data(.get, fullPath)
.observeOn(queue)
.debug()
.map { data -> T in
return try JSONDecoder().decode(T.self, from: data)
}
}
여기서 중요한 코드들을 하나씩 설명해볼게요!
RxAlamofire.data(.get, fullPath)
- RxAlamofire의 data 메서드를 통해 GET 요청을 보냅니다. 요청이 성공하면 Observable를 통해 비동기적으로 데이터를 받을 수 있습니다.
.observeOn(queue)
- 이 메서드는 네트워크 요청 이후 어느 스레드에서 처리될지를 결정하는 메서드입니다. 여기서는 데이터를 백그라운드에서 처리하도록 지정했어요. 만약 이 설정이 없다면, 메인 스레드에서 실행되면서 UI가 버벅거릴 수 있겠죠?
.debug()
- 디버깅을 도와주는 연산자입니다. 요청과 응답의 흐름을 쉽게 확인할 수 있어서, 디버깅할 때 아주 유용해요!
.map { data -> T in }
- 네트워크에서 받은 JSON 데이터를 제네릭 타입 T로 변환합니다. JSONDecoder를 사용해 데이터를 디코딩하는 과정인데, 이때 디코딩이 실패할 경우를 대비해 try로 처리합니다.
나의 질문
이번 코드를 공부하면서 observeOn()에 대해 궁금증이 생겼어요. 네트워크 요청을 비동기적으로 처리하는데, 왜 observeOn()을 API 요청 시에는 사용하지 않고, 이후에 사용하는 걸까?라는 질문이었습니다.
답: RxAlamofire.data는 이미 네트워크 요청을 비동기적으로 처리하고 있기 때문에, 요청하는 단계에서 observeOn()을 사용하지 않아도 됩니다. 대신 데이터를 받아서 처리하는 과정에서 스레드를 백그라운드로 변경하는 것이죠. 이 부분을 이해하고 나니까 observeOn()이 왜 중요한지 더 명확해졌습니다!
오늘은 RxSwift와 RxAlamofire를 사용해 간단한 네트워크 모듈을 만들어보고, 그 과정에서 생긴 궁금증도 해결해 보았습니다. 아직 배워야 할 것도 많고, 이해해야 할 부분도 많지만, 하나하나 해결해 나가는 과정이 정말 재미있군요. 피드백은 언제든지 환영입니다 !!
'iOS > RxSwift' 카테고리의 다른 글
| [RxSwift] 3. Operators (0) | 2024.12.20 |
|---|---|
| [RxSwift] 2. Disposing (0) | 2024.12.20 |
| [RxSwift] 1. Observables aka Sequences (0) | 2024.12.20 |
| [RxSwift] From / Just / Of / Repeat / Interval / Timer / Range (0) | 2024.12.20 |
| [RxSwift] Empty / Never / Throw (0) | 2024.12.20 |