Skip to content

Latest commit

Β 

History

History
163 lines (112 loc) Β· 4.65 KB

7_Flux_Pattern.md

File metadata and controls

163 lines (112 loc) Β· 4.65 KB

1. Flux νŒ¨ν„΄μ΄ λ­”κ°€μš”?

FaceBook 이 React λ₯Ό κ΅¬μΆ•ν• λ•Œ μ†Œκ°œν•œ μ•„ν‚€ν…μ²˜λ‘œ λ°μ΄ν„°μ˜ 흐름을 예츑 κ°€λŠ₯ν•˜κ³  μ΄ν•΄ν•˜κΈ° μ‰½κ²Œ λ§Œλ“€μ–΄μ£ΌλŠ” λ””μžμΈ νŒ¨ν„΄


2. μ™œ λ“±μž₯ν–ˆμ„κΉŒμš”?

λŒ€κ·œλͺ¨ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 데이터 흐름을 νŒŒμ•…ν•˜κΈ°κ°€ μ–΄λ ΅λ‹€! 데이터 흐름을 일관성 있게 κ΄€λ¦¬ν•˜μ—¬ 예츑 κ°€λŠ₯성을 높이기 μœ„ν•¨!


2-1-1. κΈ°μ‘΄ 방식 MVC

original
  • Model 의 데이터가 λ³€κ²½λ˜λ©΄ View 둜 μ „λ‹¬ν•˜μ—¬ 화면에 좜λ ₯
  • View μ—μ„œ 데이터λ₯Ό μž…λ ₯λ°›μ•„ Model 을 μ—…λ°μ΄νŠΈ

original
  • iOS 의 UIKit 은 ViewController λ₯Ό μ€‘μ‹¬μœΌλ‘œ ν•œ νŒ¨ν„΄ ( MVC )
  • ViewController κ°€ View lifeCycle 을 직접 관리
  • ViewController κ°€ λ„ˆλ¬΄ 할일이 λ§Žμ•„μ§„λ‹€β€¦ ( λ„€νŠΈμ›Œν¬ μš”μ²­, DB 데이터 μš”μ²­, delegate, datasource )

πŸ’‘ 즉, 데이터가 μ–‘λ°©ν–₯으둜 흐λ₯΄κ²Œ λœλ‹€!


original
  • ν•˜λ‚˜μ˜ ViewController 이 λ§Žμ€ Model κ³Ό View λ₯Ό 관리

  • λ³΅μž‘ν•œ μ˜ˆμ‹œ κ°€μ •

    • Model 데이터 λ³€κ²½ β†’ View μ—…λ°μ΄νŠΈ β†’ 또 λ‹€λ₯Έ Model 을 μ—…λ°μ΄νŠΈ
    • μ„œλ‘œ λ³΅μž‘ν•˜κ³  κ°•ν•œ μ˜μ‘΄μ„±μ„ κ°€μ§€κ²Œ 될 κ°€λŠ₯μ„± 높아짐
    • μ΄λŸ¬ν•œ μ˜μ‘΄μ„±μ΄ λ§Žμ•„μ§ˆμˆ˜λ‘ μ–΄λ– ν•œ μ΄λ²€νŠΈκ°€ λ°œμƒν–ˆμ„ λ•Œ μ–΄λ– ν•œ 상황이 λ²Œμ–΄μ§ˆμ§€ 예츑 λΆˆκ°€

2-1-2. κΈ°μ‘΄ 방식 MVVM

original
  • MVC 의 λ‹¨μ μ΄μ˜€λ˜ ViewController 의 역할을 ViewModel 둜 뢄리 ( λ„€νŠΈμ›Œν¬ μš”μ²­ λ“± )
  • ViewModel 은 View 의 이벀트λ₯Ό κ°μ§€ν•˜μ—¬ μ•Œλ§žλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰
  • Model 의 데이터λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ μ—…λ°μ΄νŠΈ ν•˜κ³  View 에 데이터λ₯Ό μ—…λ°μ΄νŠΈ ν•˜μ—¬ ν™”λ©΄ 좜λ ₯

πŸ’‘ MVVM 도 μ—¬μ „νžˆ View 와 ViewModel 이 μ„œλ‘œ 데이터 바인딩이 λ˜μ–΄μžˆμ–΄ μ–‘λ°©ν–₯ 흐름을 κ°–κ³  μžˆλ‹€!


3. 단방ν–₯ 데이터 흐름, Flux

original original
  • μ‚¬μš©μžμ˜ μž…λ ₯을 기반으둜 Action 을 κ΅¬ν˜„
  • Action 을 Dispatcher 에 μ „λ‹¬ν•˜μ—¬ Store (Model) 을 λ³€κ²½
  • View 에 λ³€κ²½λœ 데이터λ₯Ό 반영

  • Dispatcher

    • Store κ°€ 등둝해 놓은 Action νƒ€μž…λ§ˆλ‹€ ν˜ΈμΆœν•  콜백 ν•¨μˆ˜λ“€μ΄ 쑴재
    • Action 을 μ „λ‹¬λ°›μœΌλ©΄ ν•΄λ‹Ήν•˜λŠ” Store κ°€ Action νƒ€μž…μ— λ§žλŠ” 콜백 ν•¨μˆ˜λ₯Ό μ‹€ν–‰
    • Store 의 데이터λ₯Ό λ³€κ²½ν•˜λŠ” μž‘μ—…μ€ 였직 Dispatcher λ₯Ό 톡해 κ°€λŠ₯
  • Store (Model)

    • μƒνƒœ μ €μž₯μ†Œλ‘œ μƒνƒœλ₯Ό λ³€κ²½ν•  수 μžˆλŠ” λ©”μ„œλ“œλ₯Ό κ°–κ³  있음
    • μ–΄λ–€ Action 이 λ°œμƒν–ˆλŠ”μ§€μ— 따라 ν•΄λ‹Ήν•˜λŠ” 데이터 변경을 μˆ˜ν–‰ν•˜λŠ” μ½œλ°±ν•¨μˆ˜λ₯Ό Dispatcher 에 등둝
    • λ§Œμ•½ 데이터가 λ³€κ²½λ˜λ©΄ View 에 데이터가 λ³€κ²½λ˜μ—ˆμŒμ„ μ•Œλ¦Ό

4. Swift μ—μ„œλŠ” TCA!

Ex. 증감 λ²„νŠΌμ΄ μžˆλŠ” Counter App

  • TCA: Reducer , Flux: Dispatcher
import ComposableArchitecture

@Reducer
struct CounterFeature {
  //...
  
  enum Action {
    case decrementButtonTapped
    case incrementButtonTapped
  }
  
  var body: some ReducerOf<Self> {
    Reduce { state, action in
      switch action {
      case .decrementButtonTapped:
        state.count -= 1
        return .none
        
      case .incrementButtonTapped:
        state.count += 1
        return .none
			}
		}
  }
}

  • TCA, Flux: Store
import ComposableArchitecture

@Reducer
struct CounterFeature {

  @ObservableState
  struct State {
    var count = 0
  }
  
  // ...
  
  var body: some ReducerOf<Self> {
  // ...
  }
}

  • TCA, Flux: View
struct CounterView: View {
  let store: StoreOf<CounterFeature>
  
  var body: some View {
    VStack {
      Text("\(store.count)")
			
      HStack {
        Button("-") {
          store.send(.decrementButtonTapped)
        }
        
        Button("+") {
          store.send(.incrementButtonTapped)
        }
      }
    }
  }
}