[Swift] Combine 입문하기3 — 네트워크요청

이전편

Harry The Great
해리의 유목코딩
4 min readFeb 9, 2020

--

Rx나 Ractive를 사용하면 네트워크 통신에 참 많이 사용됩니다. 마찬가지로 Combine도 네트워크 통신을 작성할 때 매우 유용합니다. 먼저 별도의 프레임워크 없이 직접 작성한다고 예를 들어보겠습니다. 이번예제는 Swift.Dev의 예제를 인용하였습니다. 우리가 데이터를 받아 올 곳은 더미 데이터를 제공하는 JSON Placeholder입니다.

https://jsonplaceholder.typicode.com/posts//데이터형식
[
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
.....중략
]

Combine없이 작성하기

만약 위와같은 데이터를 직접 구현한다고하면 아래와같이 구현할 수 있습니다.

Combine으로 작성하기

위와같은 코드를 Combine으로 바꾼다면 어떻게될까요

이번예제도 플레이그라운드에서 간단히 작성해볼 수 있습니다.

eraseToAnyPublisher

뜬금없이 erastToAnyPublisher가 보입니다. Publisher가 아닌 AnyPublisher형태로 리턴해줍니다. eraseToAnyPublisher은 지금까지의 데이터 스트림이 어떠했던 최종적인 형태의 Publisher를 리턴합니다. 아래 예를 들어보겠습니다.

위와 같은 PassthoughSubject는 PassthoughSubject에 FlatMap 오버 레이터를 사용하고 다시 에러 처리를 별도로 해주었습니다. 만약 타입 형식으로 데이터를 받는다면 어떤 타입이 될까요? 수없이 많은 프로퍼티 래퍼가 들어갔기 때문에 아래와 같습니다.

Publishers.FlatMap<Publishers.Map<Publishers.Catch<Future<String, Error>, Just<String>>, String>, PassthroughSubject<String, Never>>

타입이 너무 긴 데다 개발자 입장에선 데이터 파이프라인이 어떤 흐름으로 연결되는지 외부에 노출됩니다. 우리에게 중요한 건 Publsiher와 Operator의 결과로 Subscrbier가 받게 될 결괏값만이 중요합니다.

let x = PassthroughSubject<String, Never>()
//////////생략
}.eraseToAnyPublisher()

이제 x는 간단히 아래와 같은 타입이 됩니다.

AnyPublisher<String, Never>

Operation에서의 데이터를 처리할 땐 Operation 상호 간 에러 처리나 혹은 스트림 제어를 위해서 데이터 형식을 알아야 하지만 Subscrbier에게 전달될 땐 필요가 없게 됩니다. 따라서 최종적인 형태로 데이터를 전달할 땐 eraseToAnyPublisher를 사용하게 됩니다.

ErrorHandling

.replaceError(with: [])

이전 코드에서는 replaceError를 이용하여 에러 스트림이 전달 안되도록 처리하였습니다. 하지만 조금 더 상세한 에러 처리가 필요한 경우는 어떻게 해야 할까요?

Operation들 중 try가 붙는 Operator들은 대부분 블록 안에서 발생한 에러를 파이프라인 외부로 방출하지 않습니다. 만약 하단에 catch나 retry Operator가 선언되어있다면 에러를 받아 적절히 처리할 수 있습니다.

이상으로 시리즈를 마치겠습니다~

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.