RxSwift 면접질문 모음

Jehyeon Lee·2024년 5월 9일
1

Reactive Programming

  • 데이터 스트림과 변화에 반응하는 앱을 만들기 위한 프로그래밍의 패러다임입니다.
  • 데이터의 흐름을 비동기적으로 처리하면서 앱내 이벤트를 실시간으로 데이터 변화에 맞게 반응할 수 있도록 하는 프로그래밍 패러다임입니다.

RxSwift의 장/단점을 설명하시오.

장점

  • 반응형 패러다임이 제공하는 명확함과 비동기처리를 동기화 코드처럼 작성이 가능하다는점입니다.
  • RxSwift를 사용하지 않을 경우, 콜백 지옥, 즉 escaping closure를 통한 completion 핸들러를 사용하여 비동기 작업을 수행해야 했으며, 이로 인해 쓰레드 관리가 복잡해졌습니다.

단점

  • 클로저의 캡쳐리스트를 신경을 써야합니다.
  • RxSwift는 클로저의 사용이 많습니다 그렇기에 메모리 누수를 일으키는 부분과 순환참조를 피할 수 있게 신경을 써야합니다. 그렇지 않으면 Race Condition 같은 것이 발생할 수 있습니다.

Subject의 종류와 차이점에 대해 설명하시오.

Subject에는 PublishSubject, BehaviorSubject, ReplaySubject, AsyncSubject가 있습니다.

이 4개의 서브젝트의 가장 큰 차이점은 구독한 시점에서 데이터를 어떤것을 받냐에 따라서 갈린다고 생각합니다.

  • PublishSubject는 구독을 하면 그시점의 데이터를 바로 보내준는 기능이입니다.
  • BehaviorSubject은 PublishSubject와 기능은같지만 초기값을 가집니다. 그렇기에 초반에 값이 없을 때 값을 내려보내지 못하는 PublishSubject와는 다르게 BehaviorSubject은 초기값을 설정하기에 구독자가 값을 가진상태로 시작합니다.
  • 초기값은 항상 갱신이 됩니다. 예를 들어 초기값이 1이지만 Subject특성상 값을 받는 것도 가능하기에 그 받은 값이 초기값이 됩니다.
  • ReplaySubject의 처음 기능은 PublishedSubject와 기능이 비슷하나 누군가가 구독을 하면 구독시점 전의 데이터도 내려보내줍니다.
  • AsyncSubject은 누군가가 구독을해도 마지막 OnComplete가 되기전까지는 보내지 않고 OnComplete가 되면 그때 마지막 데이터를 보내줍니다.

bind, subscribe, driver 차이

  • subscribe와 bind + driver의 차이는 subscribe와 다르게 나머지 두개는 UI작업에 특화되어있습니다.
  • bind는 UI 작업에 특화되어있고, .observe(on: MainScheduler.instance)를 통하여 항상 UI쓰레드인 메인에서 작동이 되어야합니다. 그리고 순환참조를 막기위한 작업을 하지 않아도 됩니다.
  • bind와는 다르게 observe(on: MainScheduler.instance)을 통하여 메인쓰레드에서 돌아가도록 안해줘도 되는 슈거입니다. 드라이버의 에러처리는 .asDriver(onErrorJustReturn: "")이것을 통하여 합니다.

throttle, debounce 차이

  • 이 두개는 프로그래밍에서 요청이나 처리의 빈도를 제한하거나 지연시키고자 사용하는 오퍼레이터입니다.
  • 두개의 차이점은 debounce는 일정 시간을 기다리고 요청을 수행하고, 일정 시간 안에 같은 요청이 들어오면 이전 요청은 취소됩니다.
  • throttle은 시간을 정해두고 요청이 한 번만 수행되도록 합니다.

Hot Observable VS Cold Observable

  • 일반적인 Cold Observable은 일반적인 Observable입니다.
  • 구독한 시점부터 생성된 비동기적인 이벤트를 준다는 특징이있습니다.
  • Hot은 구독하기 전부터 생성된 비동기적인 이벤트 즉 Emit을 전달해주는 특징이 있습니다.
  • Hot은 하나의 API를 가져온다 생각하면 공유를 하여 메모리적으로 여유를 가지게 하는 특성이고, Cold는 Observer마다 별도의 인스턴스를 가지게 됩니다.

Disposable, DisposeBag은 무엇이며 사용하는이유?

  • Disposable은 Observer가 Observable에 대한 구독을 취소할 수 있게 하는것입니다.
  • Disposable을 하는 시점이후는 Observable이 내려주는 데이터를 받을 수 없게 됩니다.
  • 이것을 사용하는 이유는 메모리 관리를 위해서 사용합니다.
  • Observable은 기본적으로 .complete 또는 .error가 발생하기 전까지 이벤트를 계속 방출시켜줘서 직접 deinit을 해줘야합니다. 소멸자를 하지 않으면 필요할 때마다 이벤트를 방출시키는 메모리 릭으로 이어집니다. dispose가 Observable에 대한 리소스를 deinit을 해준다는것입니다.
  • DisposeBag은 여러개의 구독을 관리 Disposable를 할 수 있는 담는 배열입니다.
  • disposed(by:)로 DisposeBag에 등록가능합니다.
  • 메모리에서 해제될 경우 모든 Disposable들을 dispose 시킵니다.

Observable / Subject / Relay 차이

  • Observable 은 비동기 프로그래밍을 관찰 가능한 순서로 비동기 이벤트의 시퀀스를 생성할 수 있는 대상입니다.
  • Subject는 Observable 처럼 새로운 아이템들을 emit할 수 있고 Observer처럼 하나의 Observable을 구독할 수 있습니다.
  • Relay는 Subject와 다르게 next이벤트만 받습니다. 그렇기에 주로 종료없이 지속되는 UI 이벤트를 처리하는데 사용합니다.

Relay / Driver / Signal의 예시

Relay?

  • RxCocoa를 import해야 사용이 가능합니다.
  • relay는 Subject와 달리 Next 이벤트만 받고 completed와 error는 주고 받지 않는다.
  • Subject는 completed와 error는 주고 받지 않습니다. 그렇기에 주로 UI이벤트를 처리하는데 사용합니다.
  • Relay 이벤트를 전달하기 위해서는 .accept를 사용해야한다.

Driver?

  • RxCocoa를 import해야 사용이 가능합니다.
  • rxCocoa에서 Observable을 바인딩을 하려면 .bind를 사용해야하고, 추가로 어느 쓰레드에서 돌아갈지 정하는 observeOn를 같이 작성해줘야합니다. 그리고 error 가 발생하면 Stream이 끊어져버리고 한번 끊어지면 재사용이 불가능하기에 Error가 발생하면 그대로 종료되는것을 방지하기 위한 catchErrorJustReturn을 사용해야합니다. 이렇게 많은 메서드들을 사용하기 귀찮아서 나온 슈거가 Driver입니다. 사용방법은 .asDriver를 사용하고 bind대신 .driver를 사용하면 됩니다.

Signal?

  • signal은 driver처럼 새로운 구독자에게 replay를 해주지 않습니다.
  • driver처럼 구독하는 순간 초기값이나 최신값을 주지 않습니다. 구독한 이후에 발행되는 값을 받습니다.
  • signal은 emit함수로 이벤트를 처리하고 driver은 drive함수로 이벤트를 처리합니다.
  • 시그널이란 rx코코아에서 ui작업 을 위해 사용되고 기본적으로 ui작업이기에 메인 스레드
  • 드라이버와 달리 초기값이나 최신값을 주지않음서브젝트에서 퍼블리쉬 서브젝트마냥

.rx는 무엇일까요 ?

  • 뷰에 상태를 Observable로 래핑하는데 사용하는 표기입니다.

2회차


Observable의 생명주기에 대해 설명해주세요.

observable은 생성되면 Next 이벤트를 방출하고 .completed 또는 .error를 방출하여 처리하고 나서 dispose로 메모리에서 해제시킵니다.

RxSwift에서의 Error Handling 방법은 어떻게 되나요?

  • Catch: 기본값 defaultValue로 error 복구할 수 있습니다
    • catchAndReturn를 토앟여 어떤 에러가 있을 경우 리턴값을 정해서 리턴 가능합니다.
  • retry: 작업이 성공할 때 까지 계속 재시도를 합니다.
  • retry(_ maxAttemptCount: Int) maxCount를 지정하여 최대 재시도 횟수를 지정할 수 있습니다.
    • RetryWhen: 에러가 나타나면 error를 가공하여 observerbleType을 반환합니다.
    • .retryWhen { err → obserevable in return 이런식으로 사용

RxCocoa의 UI요소와의 상호작용 방법에 대해 설명해주세요.

  • ?

RxSwift에서의 Testing 방법에 대해 설명해주세요.

  • RxSwift는 TestScheduler 정확한 시간 간격으로 이벤트를 추가할 수 있는 메서드 기능을 제공합니다.
  • RxTset를 사용해야하고, RxSwift 저장소의 한 부분을 담당합니다.
  • RxTest는 테스팅 목적으로 두가지 타입의 Observables를 드러낼 수 있습니다.
    • Cold와 Hot이 있습니다.
    • Cold는 일반적인 Observable와 같이 동작하며 구독 시 ㅅ개로운 구독자들에게 그들의 요소를 재생해줍니다.
    • Hot은 어떤 가입자가 있는지 여부에 상관없이 테스트 스케쥴러를 사용하여 지정된 시간에 이벤트를 재생합니다.
  • RxBlocking이 비동기적 작업을 테스트할 수 있는 또 다른 하나의 방법이고, 비동기 작업의 테스팅 간 해당 라이브러리를 사용하는 방법입니다.

observeOn 과 subscribeOn의 차이는 무엇인가요

  • observeOn은 이벤트를 받을 때 처리하는 스케줄러를 변경하고 subscribeOn은 Observable이 생성 또는 처음 이벤트가 발생되었을 때 스케줄러를 변경합니다.

flatMap, flatMapFirst, flatMapLast의 차이점은 무엇인가요

  • flatMap: map과 비슷한 기능을 하지만 한번에 여러 스트림을 사용할 수 있고, 여러 스트림에서 방출된 아이템에 대해 누락 없이 구독이 가능합니다.
  • flatMapFirst: 첫 번째 observable의 이벤트만 받고, 다음 생성된것은 처리하지 않습니다.
  • flatMapLast: 가장 마지막의 이벤트만 처리하고, 전에 생성된 이벤트들은 처리하지 않습니다.

merge / concat / zip , withLastestFrom / CombineLastest 차이점

  • merge: 같은 타입의 이벤트를 발생하는 Observable을 합성하는 함수이며, 각각의 이벤트르 모두 수신할 수 있습니다. 이벤트가 같지 않으면 merge를 할 수 없다.
  • concat: 순차적으로 여러 Observable을 합칠 때 사용합니다.
  • zip: 두 Observable의 발생 순서가 같은 이벤트를 조합해서 이벤트를 발생합니다. 그리고 이벤트가 조합되지 않으면 이벤트가 발생하지 않습니다.
  • CombineLastest: 두 Observable의 각각의 이벤트가 발생할 때 두 개의 Observable의 마지막 이벤트들을 묶어서 전달합니다.
  • withLastestFrom: 두 개의 Observable을 합성하지만 한쪽 Observable의 이벤트가 발생할 때에 합성해주는 메서드입니다. 다른쪽 이벤트가 없으면 합성하지 않습니다.

구독 연산자 share의 간단한 설명

  • 여러 subscribe에서 Observable의 구독이 일어나면 구독할 때 마다 새로운 시퀸스가 생성되어 리소스 낭비가 일어나는것을 방지하기 위한 연산자입니다.

RxSwift에서의 Back Pressure는 무엇이며 어떻게 처리할 수 있나요?

  • Back Pressure: Observable은 이벤트의 방출 속도와 구독자의 처리 속도가 맞지 않을 때 입니다. buffer throttle debouncing 연산자를 사용하여 분기를 맞춰 처리합니다.

Signal의 기능을 말해주시고 예시가 있다면 예시도 함께 말해주세욘

  • signal은 driver처럼 새로운 구독자에게 replay를 해주지 않습니다.
  • driver처럼 구독하는 순간 초기값이나 최신값을 주지 않습니다. 구독한 이후에 발행되는 값을 받습니다.
  • signal은 emit함수로 이벤트를 처리하고 driver은 drive함수로 이벤트를 처리합니다.

Observe(on: Scheduler)에서 api를 받아올 때 어느 Scheduler를 실행시켜야 할까요?

  • ConcurrentDispatchQueueScheduler에서 처리합니다.

Single, Completable, Maybe

  • single: Observable의 변형으로 일련의 요소를 방출하는 대신 항상 단일 요소 또는 오류를 방출하도록 보장하는것입니다.
    • 정확히 하나의 요소 또는 error를 방출합니다.
    • single의 사용 예는 응답, 오류만 반환할 수 있는 HTTP 요청을 수행하는데 사용됩니다.
  • Completetable: complete 하거나 error를 방출할 수 있고 아무 요소도 방출하지 않는것을 보장합니다.
    • complete 또는 error만 방출합니다.
    • completable은 완료에 따른 요소에 신경쓰지 않은 경우 사용합니다.
  • Maybe: Single과 Completable의 중간인 Observable의 변형입니다.
    • 완료된 이벤트, 싱글 이벤트 또는 오류를 방출합니다.
    • Maybe는 Single과 비슷하지만 아무런 값을 방출하지 않고 coimplete가 되어도 오류가 발생하지 않습니다.

operator just, of, from의 용도

  • just: 단 하나의 요소만 방출
  • of: 여러 요소를 방출합니다.
  • from: 배열의 형태로 오는 요소들을 한 개씩 순차적으로 내놓습니다.

flatmap, compactmap, map의 용도

  • map: 옵저버블의 가진 요소들에 특정 연산을 수행해서 값을 방출합니다
  • flatmap: map과 비슷한 기능을 하지만 한번에 여러 스트림을 사용할 수 있고, 여러 스트림에서 방출된 아이템에 대해 누락 없이 구독이 가능합니다.
  • compactmap: Observable에서 방출되는 이벤트를 꺼낸 다음 옵셔널 형태로 바꾸고 원하는 변환을 실행합니다. 그리고 최종 변환된 값이 nil이면 방출하지 않습니다.
profile
공부한거 느낌대로 써내려갑니당

0개의 댓글

관련 채용 정보