---
# System prepended metadata

title: 'Single, Completable, Maybe의 차이점에 대해 설명하고, 언제 적용하면 좋을지 설명하시오.'

---

# Single, Completable, Maybe의 차이점에 대해 설명하고, 언제 적용하면 좋을지 설명하시오.

Single, Completable, Maybe는 RxSwift의 Traits라고 불리는 Observable의 변형된 타입들 입니다.

먼저, 각 Traits의 특징과 차이점을 말씀드리겠습니다.

## 각 Traits 특징
> 핵심키워드: 각 Traits가 방출하는 이벤트

Single 같은 경우 just Observable과 같이 단일 요소를 방출하지만, Swift에 Result 타입과 유사하게 `.success` 혹은 `.error` 이벤트 만을 방출할 수 있습니다. 즉, `.completed` 이벤트를 따로 방출하지 않습니다.

![](https://i.imgur.com/8uZaPlr.png)


Completable이 Single과 가장 큰 차이점은 Completable은 아무 요소도 방출하지 않습니다. Completable은 `.completed`과 `.error` 만을 방출합니다.

![](https://i.imgur.com/mkBZi7o.png)


Maybe의 특징은 위에서 설명한 두 Traits의 특징을 모두 가지는 Traits입니다. 때문에 `.success`, `.completed`, `.error` 세 가지 이벤트를 모두 방출할 수 있습니다.

![](https://i.imgur.com/q5quQuE.png)


## 각 Traits를 언제 적용하면 좋을지
> 핵심키워드: Single => 네트워크 / Completable => 비동기등 에러처리 / Maybe => 캐시 데이터 얻어오기

Single 같은 경우 output의 결과가 에러 혹은 단일 요소이며, 한 번의 스트림으로 이벤트를 방출하는 경우 사용하면 좋을 것 같습니다. 예를 들어 네트워크 통신에서 Result 대신 RxSwift의 Single을 이용할 수 있습니다.

Completable는 작업을 핸들링 할 때 사용할 수 있습니다. 작업이 끝난 후 특정 값을 방출하는 것보단, 작업이 끝난 시점과, 에러가 방출되었는지 확인할 필요가 있을 때 적용하는 것이 적절합니다. 예를 들어, 비동기 작업의 성공 여부 등 에러 처리에 사용할 수 있습니다.

Maybe는 Single과 Completable의 특징을 모두 가지는 Traits인 만큼 에러를 포함해 요소를 방출할 수도 안 할 수도 있습니다. 때문에 캐시에서 데이터를 읽어올 때 사용할 수 있습니다.

# 꼬리질문 

## Traits란 무엇인가요??
> 핵심키워드: 인터페이스 처리에 특화되어 만들어진 Observable

Traits는 모든 경계에서 사용할수 있는 원시 Observable과 비교할때 인터페이스 경계에서 observable 프로퍼티를 전달하고 보장하며, 문법적으로도 더 쉽고 구체적인 사용 사례를 타켓팅하는데 도움이 됩니다.(한마디로 코드적으로 간단하고 쉽게 Rx의 흐름을 파악할 수 있도록 도와주는 특성을 가진 객체들입니다.)

## Observable을 asXXX으로 Traits로 변환하여 사용하는것에 대해 어떻게 생각하나요??
> 핵심키워드: Observable를 Traits로 변환하는 것은 지양하는 것이 좋다.

Traits는 Observable를 변형시킨 형태입니다. 때문에 그 과정에서 에러가 발생할 수 있습니다.
예를 들어, Single 같은 경우 completed 이벤트를 방출하지 않습니다. 좀 더 자세히 말씀드리면, Single의 success 같은 경우 (next + completed)입니다. 때문에 completed 이벤트만을 방출한 Observable를 asSingle 통해 변형시킨다면, 에러가 발생하게 됩니다. 이러한 위험이 있기 때문에 Observable를 Traits로 변환하는 것은 지양하는 것이 좋습니다.

# 출처

https://medium.com/@priya_talreja/rxswift-traits-4408d66cb6ad
