[WWDC 19 / Combine] Combine 소개하기 with Publisher

박준혁 - Niro·2023년 10월 24일
1

WWDC

목록 보기
1/11
post-thumbnail

안녕하세요 Niro 🚗 입니다!

WWDC 19 에서 Combine FrameWork 가 새로 공개되었습니다!

Combine 은 시간이 지남에 따라 값을 처리하기 위한 선언적 Swift API를 제공합니다

라고 문서에 설명이 되어 있지만 참 어렵죠...?

문서를 차근히 읽어도 어렵고.. 영상을 다보고 정리하는게 시간이 많이 들지만..
그래도 머리속에는 확실히 남아 WWDC 19 영상을 통해 Combine 을 알아보도록 하겠습니다!

내용이 긴 관계로 이번 글에서는 Combine 소개와 함께 Publisher 에 대해 설명하겠습니다!


1. 들어가기 앞서서

영상에서는 간단한 시연 앱을 보여주고 있는데

  1. 네트워크 요청을 통해 확인할 유요한 사용자의 이름이 필요
  2. 앱에서 로컬로 확인할 수 있는 일치한 비밀번호가 있어야 한다
  3. 모든 작업을 수행하는 동안 메인 스레드를 차단하지 않고 반응형 사용자 UI를 유지 해야 한다

라는 조건이 있었습니다!

앱을 동작하는데 있어 Cocoa SDK 에서는 수 많은 비동기 인터페이스가 위와 같이 존재한다고 합니다... 저는.. 다 못써봤지만... 하여튼..

이렇게 다양한 비동기 인터페이스를 함께 구성해야할 때 굉장히 어려운 작업이 될 수도 있게 됩니다.

그러면 모든 기술을 새로운 기술로 대체해야 할까요?

그것은 아닙니다!

모두 대체하는 것이 아닌 공통점을 찾기위해 착수하게 되었고 Combine시간이 지남에 따라 값을 처리하기 위해 통합된 선언적 API 가 탄생하게 되었습니다.


2. Combine Features

자, 바로 나열된 Combine 의 특징에 대해 알아볼까요?


  1. Swift 의 가장 큰 특징인 Generic 이라는 것입니다.

사실 Generic 을 잘 사용하지 못하기도 하고 얼마나 큰 장점이지 와닫지는 않지만 뒤에있는 예시를 통해 감을 느끼실 수 있을겁니다...


  1. Type 에 대해 안전 합니다.

이것도 Swift 의 강점 중에 하나인데 런타임이 아닌 컴파일 타임에 오류를 잡을 수 있게 되므로 미리 예방할 수 있다는 것입니다.


  1. Composition first 입니다.

Combine 의 가장 중요한 포인트로 데이터 스트림을 생성하고 처리하는데 강력한 조합을 제공한다는 의미입니다!

즉, 여러 연산자를 통해 여러 데이터를 하나의 조합으로 만들 수 있다는 것이죠!

  1. Request driven 하다는 것입니다.

요청 기반이기 때문에 앱의 메모리 사용량과 성능을 더욱 주의 깊게 관리할 수 있는 기회를 제공할 수 있게 됩니다.


3. Key Concepts

이제, Combine 의 주요 기능에 대해 알아볼까요?

3-1. Publishers - 게시자

Value type 으로 Combine API 의 선언적인 부분으로 값과 오류가 생성되는 방식을 설명해줍니다. 하지만 모든 상황에서 실제로 생성하는 것은 아니라는 점!

그럼 값과 오류가 왜 생성이 되고 방식을 설정해야 할까요?

Publisher 는 뒤에서 나올 Subscribers (구독자) 의 등록을 허용을 해줍니다.
즉, 시간이 지남에 따라 값을 받는다는 것을 의미합니다

특징을 알았으니 Publishers 의 구조에 대해 알아봅시다

Protocol 로 선언이 되어 있고 생성되는 값의 종류인 Output 과 생성되는 오류의 종류인 Failure 라는 두가지 유형이 존재합니다.

만약 Publishers 가 오류를 생설할 수 없는 경우에는 Never 유형을 사용할수도 있습니다.


다음으로 subscribe 라는 메서드와 함께 Generic 이 보입니다

여기서 S 는 Subscriber protocol 을 따르는 어떠한 타입을 나타냅니다.

Subscriber Protocol 은 Publisher 에서 전달되는 데이터와 오류를 처리하고 구독을 관리하는 인터페이스를 정의하는 곳입니다!

따라서, Subscriber Protocol 을 따르는 S 의 Input 이 Publishers 의 Output 과 일치하고 Subscribers 의 Failure 가 Publishers 의 Failure 와 일치해야 합니다.

위에서 말한 값과 오류가 생성되는 방식을 설명한다는게 subscribe 메서드에서 정의하는거 같습니다!

3-2. Publishers 의 예시

지금 우리는 Publishers 의 특징도 알고 구조도 알게 되었습니다.
그러면 어떻게 쓰이는지 알아봐야겠죠?

글 소개 부분에서 설명드렸던 비동기 인터페이스 중 NotificationCenter 를 통해 알아보고자 합니다.

위에서 Publisher 는 Value Type 으로 되어있다 했습니다!
저도 그랬지만 움.. Value Type 이면 Struct 여야 하는데 왜 Protocol 일까 고민을 했었습니다...

근데.. 예시를 보니 Publisher 가 Struct 로 선언되어 있네요..! 하하...


typealias 는 기존 타입에 대한 별칭을 만드는데 사용을 하죠?

Publisher Protocol 에서 associatedtype 으로 OutputFailure 타입을 만들었으니 채택한 곳에서 실제 타입을 지정해주어야 합니다.

그래서 Output 에는 Notification, Failure 에는 Never 를 지정해주었습니다.
NotificationCenter 는 항상 정상적으로 동작하고 실패할 일이 없나봅니다...


그 다음으로 publisher 를 초기화하는 이니셜라이저가 보입니다.
각 파라미터들은 외부에 NotificationCenter 를 선언한 것을 통해 Publihser 를 설정합니다.

여기서 center 는 NotificationCenter 의 인스턴스를 나타내고, name 은 Notification.Name 타입의 이름으로 이벤트를 구독할 때 필요한 이름입니다!

object 는 옵셔널로 되어있고 특정 객체에 대해 제한하려고 할때 사용하는 것으로 보입니다.

이처럼 NotificationCenter API 에 익숙하다면 매우 친숙해보인다고 설명을 하는데... 저는 잘모르겠어요 ㅠㅠㅠㅠ

가장 중요한 점은 Combine 을 위해 NotificationCenter 를 바꾸는 것이 아닌 Extension 을 통해 Combine 을 적용하는 모습이 보입니다.


3-3. subscribe 메서드 구현부는 어디있어..?

정리하면서 의문점이 생기기 시작했습니다.
제가 아는 지식으로는 Protocol 을 채택한 곳에서 내부의 속성과 메서드에 대해 구현을 해야한다고 알고 있습니다...

위의 코드에서는 2개의 속성에 대해서는 값을 할당한 것을 볼 수 있지만 subscribe 메서드에 대한 구현부가 왜 없을까 라는... 궁금증과 함께 저의 단짝인 Chat GPT 에 물어보았습니다..

움.. Combine 에 따로 구현이 되어 있기때문에 정의할 필요가 없다! 라고 되어있네요..

이 부분만 따로 예외적인건지... 아니면 제가 아직 문법이나 다른 부분에서 놓친게 있는건지 모르겠습니다 ㅠㅠㅠ

내용을 요약해보자면!

subscribe 메서드에 대한 문서를 요약해보면 Combine 프레임워크에서 제공하는 subscribe(_:) 메서드는 내부적으로 receive(subscriber:) 메서드를 호출하게되어 커스텀 Publisher 내부에서 Subscriber 와 구독이 설정되고 데이터 스트림이 시작된다

뭔가 속시원하게 해결되지는 않았지만.. 개발자에게 데이터를 생성하고 어떻게 처리할 것인지에 집중하도록 만들어져있는거 아닌가 싶습니다...


4. 정리하자면

자, 우리는 Combine FrameWork 의 특징과 기능에 대해 알아보았고 첫번째로 Publisher 에 대해 알아보았습니다.

맨 처음에 설명했던 '시간이 지남에 따라 값을 처리하기 위한' 라는 문구가 있었죠!
이 문구가 비동기 처리를 위해 필요하다는 느낌을 받게 되었습니다.

언제 끝나는지 모르지만 비동기 처리가 필요한 곳을 구독하여 시간이 흘러가면서 제공받은 데이터를 효율적으로 처리할 수 있게 만들어냈다고 생각합니다.

워낙 내용이 많아 Publisher 만 소개를 해드렸지만 앞으로 나올 SubscribersOperator 에 대한 글도 많은 관심 부탁드립니다!


참고문헌

🔗 WWDC 19 - Introducing Combine

🔗 Apple Deveploer - Documentation / Combine / subscribe

profile
📱iOS Developer, 🍎 Apple Developer Academy @ POSTECH 1st, 💻 DO SOPT 33th iOS Part

0개의 댓글

관련 채용 정보