λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
iOS 🍎/iOS

RxSwift : 듀어가기에 μ•žμ„œ

by yongmin.Lee 2021. 5. 16.

 

λͺ…λ Ήν˜• ν”„λ‘œκ·Έλž˜λ°((Imperative programming)

  •  λ¬΄μ—‡(What)을 ν•  것인지 λ‚˜νƒ€λ‚΄κΈ°λ³΄λ‹€ μ–΄λ–»κ²Œ(How) ν•  건지λ₯Ό μ„€λͺ…ν•˜λŠ” 방식
  • μ ˆμ°¨μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°: μˆ˜ν–‰λ˜μ–΄μ•Ό ν•  순차적인 처리 과정을 ν¬ν•¨ν•˜λŠ” 방식 (C, C++)
  • 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°: κ°μ²΄λ“€μ˜ μ§‘ν•©μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ˜ μƒν˜Έμž‘μš©μ„ ν‘œν˜„ (C++, Java, C#)

 

μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°(declarative programming)

  • μ–΄λ–»κ²Œ 할건지(How)λ₯Ό λ‚˜νƒ€λ‚΄κΈ°λ³΄λ‹€ 무엇(What)을 ν•  건지λ₯Ό μ„€λͺ…ν•˜λŠ” 방식
  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°: 순수 ν•¨μˆ˜λ₯Ό μ‘°ν•©ν•˜κ³  μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“œλŠ” 방식 (ν΄λ‘œμ €, ν•˜μŠ€μΌˆ, λ¦¬μŠ€ν”„)

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°

  • ν•¨μˆ˜(function)λ₯Ό μ΄μš©ν•΄μ„œ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈ 없도둝 μ„ μ–Έν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ΄μš©ν•˜λŠ” 것
  • ν”„λ‘œκ·Έλž¨μ΄ μƒνƒœμ˜ λ³€ν™” 없이 데이터 처리λ₯Ό μˆ˜ν•™μ  ν•¨μˆ˜ κ³„μ‚°μœΌλ‘œ μ·¨κΈ‰
  • μˆœμˆ˜ν•˜κ²Œ ν•¨μˆ˜μ— μ „λ‹¬λœ μΈμžκ°’λ§Œ 결과에 영ν–₯을 μ£Όλ―€λ‘œ μƒνƒœκ°’μ„ 갖지 μ•Šκ³  μˆœμˆ˜ν•˜κ²Œ ν•¨μˆ˜λ‘œλ§Œ λ™μž‘
  • μ–΄λ–€ μƒν™©μ—μ„œ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ”λΌλ„ μΌμ •ν•˜κ²Œ 같은 κ²°κ³Ό κ°’ λ„μΆœ κ°€λŠ₯
  • ν•¨μˆ˜ 호좜이 각각 μƒν˜Έ 간섭없이 λ°°νƒ€μ μœΌλ‘œ μ‹€ν–‰λ˜λ―€λ‘œ λ³‘λ ¬μ²˜λ¦¬ν•  λ•Œ μ‚¬μ΄λ“œ μ΄νŽ™νŠΈκ°€ 거의 μ—†λ‹€
  • ν•„μš”ν•œ 만큼 ν•¨μˆ˜λ₯Ό λ‚˜λˆ„μ–΄ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μŠ€μΌ€μΌμ—… ν•  수 μžˆκΈ°λ•Œλ¬Έμ— λŒ€κ·œλͺ¨ λ³‘λ ¬μ²˜λ¦¬μ— 강점이 μžˆλ‹€
  • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° μž₯점
    • μ—¬λŸ¬κ°€μ§€ μ—°μ‚°μ²˜λ¦¬ μž‘μ—…μ΄ λ™μ‹œμ— μΌμ–΄λ‚˜λŠ” ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€κΈ° 쉽닀
    • λ©€ν‹° μ½”μ–΄ ν˜Ήμ€ μ—¬λŸ¬ 개 μ—°μ‚° ν”„λ‘œμ„Έμ„œλ₯Ό μ‚¬μš©ν•˜λŠ” μ‹œμŠ€ν…œμ—μ„œ 효율적인 ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“€κΈ° 쉽닀
    • μƒνƒœλ³€ν™”μ— λ”°λ₯Έ λΆ€μž‘μš©μ—μ„œ μžμœ λ‘œμ›Œμ§€λ―€λ‘œ μˆœμˆ˜ν•˜κ²Œ κΈ°λŠ₯κ΅¬ν˜„μ— μ΄ˆμ μ„ 맞좰 섀계가λŠ₯

 

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŠΉμ§•

  • ν•¨μˆ˜λ₯Ό 일급 객체(First-class object)둜 닀룬닀
    • μΌκΈ‰κ°μ²΄λŠ” μ „λ‹¬μΈμžλ‘œ 전달될 수 μžˆλ‹€
    • μΌκΈ‰κ°μ²΄λŠ” 동적 ν”„λ‘œνΌν‹° 할당이 κ°€λŠ₯
    • μΌκΈ‰κ°μ²΄λŠ” λ³€μˆ˜λ‚˜ 데이터 ꡬ쑰 μ•ˆμ— 담을 수 μžˆλ‹€
    • μΌκΈ‰κ°μ²΄λŠ” λ°˜ν™˜ κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€
    • μΌκΈ‰κ°μ²΄λŠ” ν• λ‹Ήν• λ•Œ μ‚¬μš©λœ 이름과 관계없이 κ³ μœ ν•œ 객체둜 ꡬ별 κ°€λŠ₯
  • κ³ μ°¨ν•¨μˆ˜ (High-orde Function)
    • ν•¨μˆ˜μ˜ 인자둜둜 ν•¨μˆ˜λ₯Ό λ°›κ±°λ‚˜ λ°˜ν™˜κ°’μœΌλ‘œ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
    • μŠ€μœ„ν”„νŠΈμ—μ„œ ν•¨μˆ˜λŠ” μΌκΈ‰κ°μ²΄λ‘œ μ·¨κΈ‰λ˜κΈ°μ— λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자둜 μ‚¬μš©λ μˆ˜ μžˆλ‹€
    • 이λ₯Ό 톡해 ν•¨μˆ˜μ˜ λ‚΄λΆ€μ½”λ“œλ₯Ό κ±΄λ“œλ¦¬μ§€ μ•Šκ³  μ™ΈλΆ€μ—μ„œ μ‹€ν–‰ 흐름을 μΆ”κ°€ν• μˆ˜ 있게되며 ν•¨μˆ˜μ˜ μž¬ν™œμš©μ„±, μž¬μ‚¬μš©μ„±μ΄ 증가
  • λΆˆλ³€μ„± (Immutablility)
    • ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œλŠ” 데이터가 λ³€ν•  수 μ—†λŠ”λ°, 이λ₯Ό λΆˆλ³€μ„± 데이터라고 ν•œλ‹€. 
    • 데이터 변경이 ν•„μš”ν•œ 경우, 원본 데이터 ꡬ쑰λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  κ·Έ 데이터λ₯Ό 볡사본을 λ§Œλ“€μ–΄ κ·Έ 일뢀λ₯Ό λ³€κ²½ν•˜κ³ , λ³€κ²½ν•œ 볡사본을 μ‚¬μš©ν•΄ μž‘μ—…μ„ μ§„ν–‰ν•œλ‹€.
    • 데이터 λ³€ν™˜ : ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 데이터 변경이 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— κΈ°μ‘΄ λ°μ΄ν„°μ˜ 볡사본을 λ§Œλ“€μ–΄ μ£ΌλŠ” 도ꡬ듀이 ν•„μš”ν•˜λ‹€.
    • κ°€λ³€ λ³€μˆ˜μ— μ˜ν•΄ λ°œμƒν•˜λŠ” κ²½ν•©(race)쑰건, κ΅μ°©μƒνƒœ(deadlock), λ™μ‹œ μ—…λ°μ΄νŠΈ(concurrent update)λ¬Έμ œλ‘œλΆ€ν„° μžμœ λ‘­λ‹€.
  • 순수 ν•¨μˆ˜ (Pure function)
    • 순수 ν•¨μˆ˜λž€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— ν•„μš”ν•œ κ°œλ…μœΌλ‘œ μ•„λž˜ 쑰건을 λ§Œμ‘±ν•˜λŠ” ν•¨μˆ˜λ₯Ό λœ»ν•œλ‹€.
    • λ™μΌν•œ μž…λ ₯μ—λŠ” 항상 같은 값을 λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.
    • ν•¨μˆ˜μ˜ 싀행은 ν”„λ‘œκ·Έλž¨μ˜ 싀행에 영ν–₯을 λ―ΈμΉ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€. (Side effect κ°€ μ—†μ–΄μ•Ό ν•œλ‹€)

 

Reactive Programming, λ°˜μ‘ν˜• ν”„λ‘œκ·Έλž˜λ°

  • Reactive Programming은 비동기 데이터 μŠ€νŠΈλ¦Όμ— κΈ°λ°˜μ„ 두고 그것에 λ°˜μ‘ν•΄μ„œ 무언가λ₯Ό ν• μˆ˜ μžˆλŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„
  • 비동기적인 데이터 흐름과 κ·Έ λ³€ν™”λŠ” 마치 κ°•κ³Ό κ°™μ•„μ„œ 이λ₯Ό κ΄€μ°°ν•˜κ±°λ‚˜ ν•„ν„°λ§ν•˜κ±°λ‚˜ λ‹€λ£° 수 있으며 μƒˆλ‘œμš΄ μ‚¬μš©μžλ₯Ό μœ„ν•œ μƒˆλ‘œμš΄ 흐름을 λ§Œλ“€κΈ° μœ„ν•΄ λ‹€λ₯Έ 흐름과 병합할 μˆ˜λ„ μžˆλ‹€
  • λ°˜μ‘ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ Functional Programming을 ν™œμš©
    => λ³€ν™”ν•  수 μžˆλŠ” μƒνƒœμ— μ‰½κ²Œ λŒ€μ²˜ν•  수 있고 μ΄λ²€νŠΈλ“€μ˜ μˆœμ„œ,μž¬μ‚¬μš©μ„±μ„ ν–₯상 μ‹œν‚¬ 수 μžˆλ‹€ 
    => λΉ„동기식(μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— 진행) ν™œλ™μ„ 쉽고 μ•ˆμ „ν•˜κ²Œ λ‹€λ£° 수 μžˆλ„λ‘ ν•œλ‹€
  • μŠ€μœ„ν”„νŠΈλŠ” Reactive Programming을 μœ„ν•΄ λ‹€μŒκ³Ό 같은 κΈ°λŠ₯ 제곡
    • @escaping  : handler to catch the end point of asynchoronous task
    • Dispatchqueue : For making task asynchoronously
    • willSet, didSet  :  makes observing specific variable reactively

 

RxSwift

    • RxSwift = Reactive eXtensions + Swift
    • RxλŠ” Reactive Programming λ°˜μ‘ν˜• ν”„λ‘œκ·Έλž˜λ°μœΌλ‘œ λ˜μ–΄μžˆλŠ” API 
    • RxSwiftλ₯Ό μ΄μš©ν•˜λ©΄ Reactive Programming 을 μ‰½κ²Œ κ΅¬ν˜„ν•  수 있으며, RxSwift μ΄μš©μ‹œ λ‹€μŒκ³Ό 같은 μž₯점이 μžˆλ‹€
      • RxSwift makes reactive code readable and short
        -> You don’t need to use those Dispatchqueue, willSet, and DidSet
      • RxSwift operators make stream extensive

'iOS 🍎 > iOS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

iOS Code Signing  (0) 2021.06.25
RxSwift  (0) 2021.05.18
viewcontrollerκ°„ 데이터 μ „λ‹¬ν•˜λŠ” 6가지 방법  (0) 2021.03.02
Managing iOS App's Life Cycle  (0) 2021.02.24
Responding to the Launch of Your App  (0) 2021.02.24