RxSwift

concat & merge

GREEN.1229 2021. 8. 16. 14:40

안녕하세요. 그린입니다🟢
이번 포스팅에서는 concat과 merge에 대해 학습해보겠습니다🧑🏻‍💻

일단 두 단어의 사전적인 의미부터 살펴보면,

concat은 concatenate의 약자로 연줄의, 사슬을 잇다 라는 그런 뉘앙스의 뜻을 가지고 있습니다.
merge는 합병, 합치다, 융합하다, 어우어리지다 등등의 뉘앙스의 뜻이 있네요!


다들 merge는 깃을 사용하던 뭘하던 다양하게 들어보셨을텐데 concat도 사전적 의미를 보면 동일한 기능을 해줄거라는 느낌이 옵니다.
왜 concat과 merge에 대해 알아보기 시작했는지 풀어보자면,
현재 RxSwift를 공부하면서 여러 퍼블리셔들을 한 동작 즉, 한 스트림에서 동작하게 하고 싶을때 concat과 merge라는 메서드를 호출하여
사용하곤 합니다.
두 기능 모두 한 스트림에서 여러 퍼블리셔의 동작을 해주는것이 공통점인데 반면 차이점이 무엇인지에 대해 궁금해졌습니다😁

concat과 merge 모두 RxSwift뿐 아니라 문자열에서도 사용되고 수학적, 함수적인곳에서도 해당 용어의 차이를 통해 사용되고 있습니다.
그러나 이번 포스팅에선 RxSwift를 현재 학습하고 있기에 퍼블리셔들의 동작과 스트림이 일어나는 관점에서 생각하고 알아보겠습니다💪🏻

그럼 본격적으로 두 메서드의 의미뿐 아니라 기능적 차이까지 알아보도록 하죠!

concat

위에서 말했듯 주 기능은 merge와 동일하게 한 스트림에서 여러 퍼블리셔의 동작을 하게 해줍니다.
다만 힌트가 위에 있듯이 사슬을 잇는 뜻을 가졌다 했죠?
이에 연관이 있습니다.
예제를 통해 살펴보면 아래 세개의 옵저버블이 있고 이를 하나의 스트림으로 합쳐 subscribe 해준 다음
해당 스트림이 호출되면 동작을 하는걸 볼 수 있습니다.

let first = Observable.of("첫번째") 
let second = Observable.of("두번째") 
let third = Observable.of("세번째")

Observable.concat(
	first, 
    second,
    third
).subscribe(onNext: { 
	value in print(value) 
    }
)

// 첫번째
// 두번째
// 세번째

concat을 사용하면 순차적으로 지정해준 옵저버블이 순차적으로 동작하는것을 볼 수 있습니다.
즉, concat은 하나의 스트림으로 합쳐도 합쳐준 순서대로 동작시킵니다.

그럼 반대로, merge는 concat과 어떤 차이가 있을까요?

merge

합치다, 병합하다라는 뜻을 가진 merge는 먼저 결론적으로 말을 해보자면 concat은 순차적으로 잇는것으로
순서를 보장해주지만 merge는 합치는 기능뿐이라 순서를 보장해주진 않습니다.
음.. Rx적인 관점말고 우리가 다아는 swift에서 동기, 비동기의 개념으로 생각해보는게 더 나을것 같습니다.
concat이 동기적인 관점이라면 merge는 비동기적인 관점으로 의미만을 가져와볼 수 있습니다.

위의 예제를 concat대신 단순히 merge로 바꿔주게되면,

let first = Observable.of("첫번째") 
let second = Observable.of("두번째") 
let third = Observable.of("세번째")

Observable.concat(
	first, 
    second,
    third
).subscribe(onNext: { 
	value in print(value) 
    }
)

// 처음 실행
// 첫번째
// 세번째
// 두번째

// 두번째 실행
// 두번째
// 첫번째
// 세번째

위와 같이 매 실행마다 순서를 보장해주지 않기에 결과값이 달라질 수 있습니다.

저는 RxSwift를 학습하고 적용시키며 위의 두 개념에 대해 명확한 차이가 있다 생각하고 상황에 따라 맞는 메서드를 사용하고 있습니다.
예를들어, 순서가 필요한 즉 사용자의 반응으로 팝업이 올라온다음 토스트 메시지가 나타나야하는 상황에서는 순서가 중요합니다.
이에는 concat을 사용하며,
사용자에게는 순서별로 반응해주지 않아도 백에서 처리해줄 수 있고 순서가 중요하지 않는 부분
사용자에겐 팝업이 나타나고 어떠한 계산을 해줄때 꼭 하나의 순서가 정해져 있지 않을때 merge를 사용합니다.

음... 말이 좀 어렵긴 한데요.
꼭 concat이나 merge를 써야하는게 아닌 둘중 아무거나 선택해도 될때는
어떤것을 선택할지는 프로그래머의 취향차이라고 생각을 합니다.


또 concat과 merge를 한 스트림에서 사용하는 경우도 있습니다.
전체적으로는 merge를 통해 순서를 정해주고 그 안에서 몇개의 옵저버블을 concat으로 묶어줄 수도 있습니다.
물론 반대로도 사용할 수 있습니다!

이번 포스팅에서는 concat과 merge에 대해 알아보았는데요.
아쉽지만 이번 포스팅에선 예제보다 저의 주절주절한 설명이 길었네요😅

좋은 예제가 있다면 다시 재포스팅해보겠습니다😊

[참고자료]
https://brunch.co.kr/@tilltue/6

RxSwift, Observable 의 합성

combineLatest, merge, switch, zip,amb | payWard * 이 포스트는 RxSwift 4.3.1, swift 4.2 버전을 기준으로 작성되었습니다. Observable 의 결합은 연결고리가 있는 몇가지 이벤트들을 같이 처리 해야 할때 사용할 수

brunch.co.kr