iOS(adv)
Computer Science of iOS(adv)

πŸ’› SwiftUI

VStack πŸ†š LazyVStack

πŸ‘‰ VStack
γ€€γ€€πŸ‘‰ 전체 데이터λ₯Ό λ©”λͺ¨λ¦¬μ— 담아두고 슀크둀 ν•  λ•Œλ§ˆλ‹€ λ³΄μ—¬μ€Œ
πŸ‘‰ LazyVStack
γ€€γ€€πŸ‘‰ 데이터가 화면에 λ Œλ”λ§ λ˜λŠ” μˆœκ°„, 즉, λ³΄μ—¬μ§€λŠ” μˆœκ°„ 그렀짐
πŸ‘‰ 즉, 미리 화면을 λ‹€ 그렀놓고 λ³΄μ—¬μ£ΌλŠλƒ, λ Œλ”λ§ λ˜λŠ” μˆœκ°„μ— κ·Έλ €μ£ΌλŠλƒμ˜ 차이


Property Wrapper in SwiftUI

πŸ‘‰ SwiftUI의 λ·°μ—μ„œ 값을 μˆ˜μ • 및 읽기가 κ°€λŠ₯ν•˜λ„λ‘ λ•λŠ” μ—­ν• 
γ€€γ€€πŸ‘‰ Property Wrapper
γ€€γ€€γ€€γ€€πŸ‘‰ ν”„λ‘œνΌν‹°λ₯Ό κ΅¬ν˜„ν•  λ•Œ 반볡적으둜 μ‚¬μš©λ˜λŠ” νŒ¨ν„΄μ„ 쀄이기 μœ„ν•΄ μ‚¬μš©
γ€€γ€€γ€€γ€€πŸ‘‰ 즉, λ°˜λ³΅λ˜λŠ” λ‘œμ§λ“€μ„ 미리 μ •μ˜ν•˜κ³  ν”„λ‘œνΌν‹° μžμ²΄μ— μ—°κ²°ν•˜λŠ” 방식
γ€€γ€€γ€€γ€€πŸ‘‰ μ •μ˜ μ‹œ, wrappedValueλ₯Ό λ°˜λ“œμ‹œ ν•„μš”λ‘œ ν•˜λ©°, μ—°μ‚° ν”„λ‘œνΌν‹° ν˜•νƒœλ‘œ λ°˜λ³΅λ˜λŠ” λ‘œμ§μ„ μ •μ˜ν•˜λ©΄ 됨
πŸ‘‰ λͺ‡ 가지 κ°œλ…
γ€€γ€€πŸ‘‰ @State
γ€€γ€€γ€€γ€€πŸ‘‰ String, Int와 같은 κ°„λ‹¨ν•œ 값을 μ €μž₯ν•˜κ³  View의 ν˜„μž¬ μƒνƒœλ₯Ό ν‘œμ‹œν•˜κΈ° μœ„ν•΄ μ‚¬μš©
γ€€γ€€πŸ‘‰ @ObservedObject
γ€€γ€€γ€€γ€€πŸ‘‰ View의 외뢀에 μ‘΄μž¬ν•˜λŠ” 데이터λ₯Ό μ΄μš©ν•  λ•Œ μ‚¬μš©
γ€€γ€€γ€€γ€€πŸ‘‰ 주둜, ObservableObject & @Published와 같이 μ‚¬μš©λ¨
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ ObservableObject : λ³€κ²½λœ 값을 방좜(emit)ν•˜λŠ” objectWillChange 퍼블리셔λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” ν”„λ‘œν† μ½œ
γ€€γ€€πŸ‘‰ @Binding
γ€€γ€€γ€€γ€€πŸ‘‰ ChildViewμ—μ„œ ParentView의 값을 닀루고 싢을 λ•Œ μ‚¬μš© (ChildViewμ—μ„œ μ‚¬μš©λ¨)
γ€€γ€€γ€€γ€€πŸ‘‰ 데이터λ₯Ό 직접 μ €μž₯ν•˜μ§€ μ•Šκ³ , Parent의 데이터λ₯Ό ν‘œμ‹œν•˜κ±°λ‚˜ ν•Έλ“€λ§ν•˜κ²Œ 됨 (ParentViewμ—λŠ” @State와 같은 데이터 쑴재)
γ€€γ€€πŸ‘‰ @Published
γ€€γ€€γ€€γ€€πŸ‘‰ 변경이 λ°œμƒν•˜λ©΄ μžλ™μœΌλ‘œ μ•Œλ¦Όμ„ λ°œμƒ (Observable 객체듀을 λ§Œλ“¦μœΌλ‘œμ¨)
πŸ‘‰ @State πŸ†š @ObservedObject
γ€€γ€€πŸ‘‰ @State
γ€€γ€€γ€€γ€€πŸ‘‰ View의 λ‚΄λΆ€, κ°’ νƒ€μž…, ν”„λ ˆμž„μ›Œν¬ 자체적 관리
γ€€γ€€γ€€γ€€πŸ‘‰ ν™”λ©΄ λ‚΄λΆ€μ—μ„œλ§Œ μ‚¬μš©μ΄ 되기 λ•Œλ¬Έμ— private으둜 μ„ μ–Έν•  것
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ ex) @State private var isDisabled = true
γ€€γ€€πŸ‘‰ @ObservedObject
γ€€γ€€γ€€γ€€πŸ‘‰ View의 μ™ΈλΆ€(ex. ObservableObject 클래슀), μ°Έμ‘° νƒ€μž…, κ°œλ°œμžκ°€ 직접 관리


UIHostingController

πŸ‘‰ UIViewController의 ν•˜μœ„ 클래슀둜, UIKit 기반의 ν”„λ‘œμ νŠΈμ— 톡합될 수 μžˆλ„λ‘ SwiftUI λ·°λ₯Ό κ°μ‹ΈλŠ” 역할을 μˆ˜ν–‰ν•¨


UIViewRepresentable

πŸ‘‰ SwiftUIμ—μ„œ UIViewλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ ν”„λ‘œν† μ½œ
πŸ‘‰ UIViewRepresentableλ₯Ό λ”°λ₯΄λŠ” structλ₯Ό λ§Œλ“€μ–΄ SwiftUIμ—μ„œ λ°”λ‘œ μ‚¬μš©ν•˜λ©΄ 되며, ν•΄λ‹Ή structλŠ” λ°˜λ“œμ‹œ 두 가지 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό 함
γ€€γ€€πŸ‘‰ ex) struct RepresentableRedLabel: UIViewRepresentable { ~ }
πŸ‘‰ ν•„μˆ˜ κ΅¬ν˜„ λ©”μ†Œλ“œ 2가지
γ€€γ€€πŸ‘‰ func makeUIView(context: Context) -> UIKitμ—μ„œμ˜ νƒ€μž… // SwiftUIμ—μ„œ λ‚˜νƒ€λ‚Ό λ·°λ₯Ό λ°˜ν™˜
γ€€γ€€πŸ‘‰ func updateUIView(_ uiView: UIKitμ—μ„œμ˜ νƒ€μž…, context: Context) // SwiftUIμ—μ„œ μ—…λ°μ΄νŠΈκ°€ λ°œμƒν•  λ•Œ μ‹€ν–‰


UIViewControllerRepresentable

πŸ‘‰ SwiftUIμ—μ„œ UIViewControllerλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•œ ν”„λ‘œν† μ½œ
πŸ‘‰ UIViewControllerRepresentable λ”°λ₯΄λŠ” structλ₯Ό λ§Œλ“€μ–΄ SwiftUIμ—μ„œ λ°”λ‘œ μ‚¬μš©ν•˜λ©΄ 되며, ν•΄λ‹Ή structλŠ” λ°˜λ“œμ‹œ 두 가지 λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄μ•Ό 함
γ€€γ€€πŸ‘‰ ex) struct RepresentableRedLabel: UIViewRepresentable { ~ }
πŸ‘‰ ν•„μˆ˜ κ΅¬ν˜„ λ©”μ†Œλ“œ 2가지
γ€€γ€€πŸ‘‰ func makeUIViewController(context: Context) -> some UIViewController // SwiftUIμ—μ„œ λ‚˜νƒ€λ‚Ό λ·° 컨트둀러λ₯Ό λ°˜ν™˜
γ€€γ€€πŸ‘‰ func updateUIViewController(_ uiViewController: some UIViewController, context: Context) // SwiftUIμ—μ„œ μ—…λ°μ΄νŠΈκ°€ λ°œμƒν•  λ•Œ μ‹€ν–‰


ViewModifier (ν”„λ‘œν† μ½œ)

πŸ‘‰ 기쑴에 μƒμ„±ν•œ λ·° λ˜λŠ” modifierλ₯Ό λ‹€λ₯Έ λ²„μ „μœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” κ°œλ…
γ€€γ€€πŸ‘‰ modifier : 뷰에 modifierλ₯Ό μ μš©ν•˜μ—¬ μƒˆλ‘œμš΄ λ·°λ₯Ό λ§Œλ“€μ–΄ λ¦¬ν„΄ν•˜λŠ” κ°œλ…


SwiftUI some 의미 πŸ”₯

πŸ‘‰ λ°˜ν™˜ νƒ€μž…μ΄ 뢈투λͺ…ν•œ λ°˜ν™˜ νƒ€μž…(μ—­ μ œλ„€λ¦­ νƒ€μž…)μ΄λΌλŠ” 것을 λ‚˜νƒ€λƒ„
γ€€γ€€πŸ‘‰ μ—­ μ œλ„€λ¦­ : ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ μ–΄λ–€ νƒ€μž…μ„ λ‹€λ£¨λŠ”μ§€ μ •ν™•νžˆ μ•Œ 수 μ—†μ§€λ§Œ, λ‚΄λΆ€μ—μ„œλŠ” μ •ν™•νžˆ μ•Œκ³  있음
πŸ‘‰ λͺ…ν™•ν•˜μ§€ μ•Šμ€ νƒ€μž…μ΄ ν”„λ‘œν† μ½œ 내에 μ •μ˜λ˜μ–΄ 있고, 이 ν”„λ‘œν† μ½œμ„ ν•¨μˆ˜ ν˜Ήμ€ μ—°μ‚° ν”„λ‘œνΌν‹°μ˜ λ°˜ν™˜ νƒ€μž…μœΌλ‘œ κ°€μ§ˆ λ•Œ λ°˜ν™˜ νƒ€μž…μ„ 뢈투λͺ… νƒ€μž…μœΌλ‘œ λ§Œλ“€μ–΄ μ£ΌκΈ° μœ„ν•΄ μ‚¬μš©
πŸ‘‰ λ°˜ν™˜ νƒ€μž…μ΄ μ–΄λ–€ νƒ€μž…μΌμ§€ 컴파일러 및 외뢀에선 λͺ¨λ₯΄κ² μ§€λ§Œ, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ–΄λ–€ νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ”μ§€ λͺ…ν™•ν•˜κ²Œ μ•Œκ³  μžˆμœΌλ‹ˆ, μ»΄νŒŒμΌλŸ¬μ—κ²Œ 정해진 νŠΉμ • νƒ€μž…λ§Œμ„ λ°˜ν™˜ν•΄ 쀄 κ²ƒμž„μ„ μ•Œλ €μ£ΌλŠ” κ°œλ…
πŸ‘‰ λ”°λΌμ„œ, var body: some View { λ‚΄λΆ€ ~ } 의 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ‚΄κ°€ μž‘μ„±ν•˜λŠ” μ½”λ“œμ— 따라 μ‹œμ‹œ 각각 리턴 νƒ€μž…μ΄ λ³€κ²½λ˜μ§€λ§Œ, λ”°λ‘œ 리턴 νƒ€μž…μ„ λ³€κ²½ν•˜μ§€ μ•Šμ•„λ„ 되고 some View둜 μž‘μ„±ν•΄λ„ λ˜λŠ” 이유


Swift μ œλ„€λ¦­

πŸ‘‰ νƒ€μž…μ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ” λ²”μš©μ μΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ μ‚¬μš©ν•˜λŠ” κ°œλ…
πŸ‘‰ 쀑볡을 ν”Όν•˜κ³  μ½”λ“œλ₯Ό μœ μ—°ν•˜κ²Œ μž‘μ„±ν•  수 있음
πŸ‘‰ ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ–΄λ–€ νƒ€μž…μ„ λ‹€λ£¨λŠ”μ§€ μ•Œ 수 μ—†μ§€λ§Œ, μ™ΈλΆ€μ—μ„œλŠ” νŒŒμ•…μ΄ κ°€λŠ₯함
γ€€γ€€πŸ‘‰ ex) func load<T: Decodable>(_ filename: String) -> T { ~ }
γ€€γ€€γ€€γ€€πŸ‘‰ <T>의 μ˜λ―ΈλŠ” λ”°λ‘œ μƒˆλ‘œμš΄ νƒ€μž…μ΄ μ•„λ‹ˆλΌ λ„ˆλ„ 이미 μ•Œκ³  있던, μ›λž˜ μ‘΄μž¬ν•˜λŠ” νƒ€μž…μ΄λΌλŠ” 것을 μ•Œλ €μ£ΌκΈ° μœ„ν•¨
γ€€γ€€γ€€γ€€πŸ‘‰ <T: Decodable>을 톡해 T에 λŒ€ν•œ μ œμ•½μ„ μ„€μ •


μ œλ„€λ¦­ ν”„λ‘œκ·Έλž˜λ°(Generic Programming)

πŸ‘‰ 데이터 νƒ€μž…μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , ν•˜λ‚˜μ˜ 값이 μ—¬λŸ¬ λ‹€λ₯Έ 데이터 νƒ€μž…μ„ κ°€μ§ˆ 수 μžˆλ„λ‘ ν•˜λŠ” κΈ°μˆ μ— 쀑점을 λ‘λŠ” ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„
βœ‹ Generic Programming is a style of computer programming in which algorithms are written in terms of types to be specified-later that are then instantiated when needed for specific types provided as parameters


ForEach

πŸ‘‰ SwiftUIμ—μ„œ ForEachλ₯Ό μ‚¬μš©ν•˜μ—¬ Viewλ₯Ό λ°˜λ³΅ν•  수 있음
πŸ‘‰ Swift의 .forEachμ™€λŠ” μ•½κ°„ λ‹€λ₯Έ κ°œλ…
πŸ‘‰ ForEach id: .self 의미
γ€€γ€€πŸ‘‰ SwiftUIμ—μ„œ λ°°μ—΄μ˜ 각 μš”μ†Œλ₯Ό κ³ μœ ν•˜κ²Œ 식별할 수 μžˆλ„λ‘ ν•˜κΈ° μœ„ν•΄ ν•„μš”ν•¨



πŸ’› ReactiveX

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

πŸ‘‰ λ°μ΄ν„°μ˜ 흐름과 전달에 κ΄€ν•΄ 쀑점을 λ‘λŠ”, 즉, 비동기적인 데이터 μŠ€νŠΈλ¦Όμ„ μ΄μš©ν•œ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„
βœ‹ RxJava, RxSwift, etc


RxSwift κ΄€λ ¨ μš”μ†Œ 및 κ°œλ…

πŸ‘‰ Observable
γ€€γ€€πŸ‘‰ Rx μ½”λ“œμ˜ 기반이 λ˜λŠ” κ°€μž₯ μ€‘μš”ν•œ μš”μ†Œ
γ€€γ€€γ€€γ€€πŸ‘‰ Rxμ—μ„œλŠ” Observable = Observable Sequence = Sequence λͺ¨λ‘ 동일
γ€€γ€€πŸ‘‰ Observable<T> ν˜•μ‹
γ€€γ€€πŸ‘‰ Tν˜•νƒœμ˜ 데이터 snapshot을 전달할 수 μžˆλŠ” 일련의 이벀트λ₯Ό λΉ„λ™κΈ°μ μœΌλ‘œ μƒμ„±ν•˜λŠ” κΈ°λŠ₯을 가짐
γ€€γ€€γ€€γ€€πŸ‘‰ λ§Œμ•½, <T>λ₯Ό 적지 μ•Šμ„ 경우 νƒ€μž…μΆ”λ‘ μ„ ν•˜κ²Œ 됨
γ€€γ€€πŸ‘‰ 총 μ„Έ 가지 μœ ν˜•(next, error, completed)의 이벀트λ₯Ό 생성 및 λ°©μΆœν•˜λ©°, ν•˜λ‚˜ μ΄μƒμ˜ μ˜΅μ €λ²„κ°€ μ‹€μ‹œκ°„μœΌλ‘œ μ–΄λ– ν•œ μ΄λ²€νŠΈμ— λ°˜μ‘ν•˜κ²Œ 됨
γ€€γ€€γ€€γ€€πŸ‘‰ onNext : Observable은 μ–΄λ–€ κ΅¬μ„±μš”μ†Œλ₯Ό κ°€μ§€λŠ” next 이벀트λ₯Ό κ³„μ†ν•΄μ„œ λ°©μΆœν•  수 있음
γ€€γ€€γ€€γ€€πŸ‘‰ onError : Observable은 error 이벀트λ₯Ό λ°©μΆœν•˜μ—¬ μ™„μ „ μ’…λ£Œλ  수 있음
γ€€γ€€γ€€γ€€πŸ‘‰ onCompleted : Observable은 completed 이벀트λ₯Ό λ°©μΆœν•˜μ—¬ μ™„μ „ μ’…λ£Œλ  수 있음
γ€€γ€€πŸ‘‰ ex)

Observable<Int>.of(1, 2, 3, 4, 5) // λ‹¨μˆœ μ •μ˜

Observable<Int>.of(1, 2, 3, 4, 5)
    .subscribe(onNext: {
        print($0)
    }) // 1 2 3 4 5

Observable.of(1, 2, 3)
    .subscribe({
        print($0)
    }) // next(1) next(2) next(3) completed

πŸ‘‰ Traits
γ€€γ€€πŸ‘‰ Observable에 λŒ€ν•œ λΉŒλ” νŒ¨ν„΄ κ΅¬ν˜„μ˜ 일쒅
γ€€γ€€πŸ‘‰ Trait이 λ§Œλ“€μ–΄μ§€λ©΄, asObservable()을 톡해 λ‹€μ‹œ observable둜 λ³€ν™˜ν•  수 있음
γ€€γ€€πŸ‘‰ 3가지 μ’…λ₯˜
γ€€γ€€γ€€γ€€πŸ‘‰ Single
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ 일련의 μš”μ†Œλ₯Ό λ°©μΆœν•˜λŠ” λŒ€μ‹  단일 μš”μ†Œ ν˜Ήμ€ 였λ₯˜λ₯Ό 방좜(onSuccess(onNext + onCompleted), onFailure)
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ Observable을 asSingle() λ©”μ„œλ“œλ₯Ό 톡해 Single둜 λ³€ν™˜ν•  수 있음
γ€€γ€€γ€€γ€€πŸ‘‰ Maybe
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ 일련의 μš”μ†Œλ₯Ό λ°©μΆœν•˜λŠ” λŒ€μ‹  단일 μš”μ†Œ ν˜Ήμ€ 였λ₯˜λ₯Ό λ°©μΆœν•˜κ±°λ‚˜ 아무 것도 λ°©μΆœν•˜μ§€ μ•ŠμŒ(onSuccess, onCompleted, onError)
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ Observable을 asMaybe() λ©”μ„œλ“œλ₯Ό 톡해 Maybe둜 λ³€ν™˜ν•  수 있음
γ€€γ€€γ€€γ€€πŸ‘‰ Completable
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ 일련의 μš”μ†Œλ₯Ό λ°©μΆœν•˜λŠ” λŒ€μ‹  였λ₯˜λ₯Ό λ°©μΆœν•˜κ±°λ‚˜ 아무 것도 λ°©μΆœν•˜μ§€ μ•ŠμŒ(onCompleted, onError)
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ Observable을 Completable둜 λ³€ν™˜ν•  수 μ—†μŒ
πŸ‘‰ Operator
γ€€γ€€πŸ‘‰ Rx μ½”λ“œ 이벀트λ₯Ό λ³€ν™˜ν•˜κ³  μ²˜λ¦¬ν•˜λŠ” λ“± λ‹€μ–‘ν•œ μ—°μ‚° κ΄€λ ¨ μš”μ†Œ
πŸ‘‰ Scheduler
γ€€γ€€πŸ‘‰ Rx의 DispatchQueue
πŸ‘‰ Dispose
γ€€γ€€πŸ‘‰ μˆ˜λ™μ μœΌλ‘œ subscribeλ₯Ό μ’…λ£Œν•˜λŠ” 것
γ€€γ€€γ€€γ€€πŸ‘‰ subscribe() λ©”μ†Œλ“œκ°€ μ—†μœΌλ©΄ λ‹¨μˆœν•œ Observable μ •μ˜μΌ 뿐, μ•„λ¬΄λŸ° 역할을 μˆ˜ν–‰ν•˜μ§€ μ•ŠμœΌλ©°, 이벀트λ₯Ό λ°©μΆœν•˜κΈ° μœ„ν•΄μ„  subscribe() λ©”μ†Œλ“œκ°€ ν•„μš”
γ€€γ€€γ€€γ€€πŸ‘‰ But, Observable은 subscribe 이후 complete λ˜λŠ” error μ΄λ²€νŠΈκ°€ λ°œμƒν•˜κΈ° μ „κΉŒμ§€ 계속 next 이벀트λ₯Ό λ°œμƒμ‹œν‚΄
γ€€γ€€γ€€γ€€πŸ‘‰ μ΄λŠ” λ©”λͺ¨λ¦¬ λˆ„μˆ˜λ‘œ μ΄μ–΄μ§ˆ 수 있기 λ•Œλ¬Έμ— Dispose ν•„μš”
γ€€γ€€γ€€γ€€πŸ‘‰ 즉, Subscribe 이후에 Disposeλ₯Ό ν•˜λŠ” 것이 Observable의 생λͺ…μ£ΌκΈ°
γ€€γ€€πŸ‘‰ dispose() λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•΄ μ›ν•˜λŠ” μ‹œμ μ— ꡬ독을 해지할 수 있음
γ€€γ€€γ€€γ€€πŸ‘‰ But, dispose() λ©”μ†Œλ“œλŠ” κ΅¬λ…ν•˜λŠ” κ²ƒλ§ˆλ‹€ λ³„λ„λ‘œ 관리λ₯Ό ν•΄μ€˜μ•Όν•˜λŠ” λ²ˆκ±°λ‘œμ›€μ΄ 있음
γ€€γ€€γ€€γ€€πŸ‘‰ λ”°λΌμ„œ, disposeBagκ³Ό disposed(by: )λ©”μ†Œλ“œλ₯Ό ν™œμš©ν•œλ‹€λ©΄ μ—¬λŸ¬ 개의 ꡬ독을 ν•œλ²ˆμ— ν•΄μ œν•  수 있음
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ subscribeκ°€ λ°˜ν™˜ν•˜λŠ” disposable이 disposeBag에 λ‹΄κΈ°κ³  disposeBag이 ν•΄μ œλ  λ•Œ disposable이 λͺ¨λ‘ ν•΄μ œλ˜λŠ” 방식
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ subscribe() λ©”μ„œλ“œλŠ” 기본적으둜 disposable을 λ°˜ν™˜
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ disposable은 λ©”λͺ¨λ¦¬ 관리λ₯Ό λ„μ™€μ£ΌλŠ” 객체
πŸ‘‰ Subject
γ€€γ€€πŸ‘‰ Observable이자 Observer인 객체
γ€€γ€€πŸ‘‰ λŒ€ν‘œ μ’…λ₯˜
γ€€γ€€γ€€γ€€πŸ‘‰ PublishSubect
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ 빈 μƒνƒœλ‘œ μ‹œμž‘ν•˜μ—¬ μƒˆλ‘œμš΄ κ°’λ§Œμ„ κ΅¬λ…μžμ—κ²Œ 방좜, κ΅¬λ…μžλŠ” ꡬ독을 μ‹œμž‘ν•œ μ΄ν›„λΆ€ν„°μ˜ 이벀트λ₯Ό λ°›μŒ
γ€€γ€€γ€€γ€€πŸ‘‰ BehaviorSubject
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ ν•˜λ‚˜μ˜ μ΄ˆκΈ°κ°’μ„ 가진 μƒνƒœλ‘œ μ‹œμž‘ν•˜μ—¬, κ΅¬λ…μžλŠ” κ΅¬λ…ν•˜λŠ” μ‹œμ μ—μ„œ 과거에 κ°±μ‹ λ˜μ—ˆλ˜ 값듀쀑 κ°€μž₯ μ΅œμ‹ κ°’μ„ λ°›μŒ
γ€€γ€€γ€€γ€€πŸ‘‰ ReplaySubject
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ 버퍼λ₯Ό 두고 μ΄ˆκΈ°ν™”ν•˜λ©°, 버퍼 μ‚¬μ΄μ¦ˆλ§ŒνΌμ˜ 값듀을 μœ μ§€ν•˜λ©΄μ„œ μƒˆλ‘œμš΄ κ΅¬λ…μžλ“€μ—κ²Œ 방좜
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ But, λ²„νΌλŠ” λ©”λͺ¨λ¦¬κ°€ 가지고 μžˆκΈ°μ—, 큰 μš©λŸ‰(이미지, 큰 λ°°μ—΄)의 데이터λ₯Ό λ²„νΌλ‘œ κ°–κ²Œ ν•œλ‹€λ©΄ λ©”λͺ¨λ¦¬μ— λΆ€ν•˜κ°€ λ°œμƒν•˜κΈ°μ— μ£Όμ˜ν•΄μ•Ό 함


RxCocoa

πŸ‘‰ Cocoa Framework와 Rxλ₯Ό ν•©μΉœ 라이브러리, Cocoa Framework에 Rx의 μž₯점을 더해쀀 라이브러리

πŸ‘‰ Binder
γ€€γ€€πŸ‘‰ λ°œμ‹ μž(Observable)μ—μ„œ μˆ˜μ‹ μž(Binder)둜 단방ν–₯ 데이터 μŠ€νŠΈλ¦Όμ„ 전솑 (bind() λ©”μ†Œλ“œλ₯Ό ν™œμš©)
γ€€γ€€γ€€γ€€πŸ‘‰ BinderλŠ” Observer μ—­ν• λ§Œμ„ μˆ˜ν–‰
γ€€γ€€πŸ‘‰ 메인 μŠ€λ ˆλ“œμ—μ„œ μ‹€ν–‰λ˜λŠ” 것을 보μž₯
γ€€γ€€πŸ‘‰ UI Binding에 μ‚¬μš©
γ€€γ€€πŸ‘‰ Error 이벀트λ₯Ό λ¬΄μ‹œν•¨
γ€€γ€€πŸ‘‰ μ—λŸ¬ 이벀트λ₯Ό λ°›μœΌλ©΄ 싀행이 μ’…λ£Œλ˜μ—ˆλŠ”λ°, UI Binding에 μ‚¬μš©λ˜κΈ°μ— UI μ—…λ°μ΄νŠΈκ°€ λ©ˆμΆ”λŠ” 일이 λ°œμƒν•˜λŠ” 것을 μ›μΉ˜ μ•ŠκΈ° λ•Œλ¬Έμ— λ¬΄μ‹œν•˜λ„λ‘ λ§Œλ“€μ–΄μ§
πŸ‘‰ Traits
γ€€γ€€πŸ‘‰ μ—λŸ¬λ₯Ό λ°©μΆœν•˜μ§€ μ•ŠλŠ” νŠΉλ³„ν•œ Observable
γ€€γ€€πŸ‘‰ λͺ¨λ“  과정은 메인 μŠ€λ ˆλ“œμ—μ„œ 이뀄짐
γ€€γ€€πŸ‘‰ 슀트림 κ³΅μœ κ°€ κ°€λŠ₯
γ€€γ€€πŸ‘‰ λŒ€ν‘œ μ’…λ₯˜
γ€€γ€€γ€€γ€€πŸ‘‰ Signal (PublishSubject와 μœ μ‚¬)
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ κ΅¬λ…ν•œ 이후에 λ°œμƒν•˜λŠ” κ°’ 전달
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ Observable을 asSignal()을 μ΄μš©ν•΄ S둜 λ³€ν™˜ κ°€λŠ₯
γ€€γ€€γ€€γ€€πŸ‘‰ Driver (BehaviorSubject와 μœ μ‚¬)
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ μ΄ˆκΈ°κ°’ or μ΅œμ‹ κ°’ replay
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ Observable을 asDriver()을 μ΄μš©ν•΄ D둜 λ³€ν™˜ κ°€λŠ₯


RxExtension

πŸ‘‰ Reactive에 μ›ν•˜λŠ” κΈ°λŠ₯이 κ΅¬ν˜„λ˜μ–΄ μžˆμ§€ μ•Šμ•„ extensionν•˜μ—¬ ν™œμš©ν•˜λŠ” 것


PublishRelay

πŸ‘‰ UI 이벀트 μ²˜λ¦¬μ— μ’€ 더 νŠΉν™”λœ 것(클래슀), onNext 이벀트만 쑴재 (onError, onCompleted X)
πŸ‘‰ PublishSubject의 wrapper둜, κ΅¬λ…μžλŠ” ꡬ독을 μ‹œμž‘ν•œ μ΄ν›„λΆ€ν„°μ˜ 이벀트λ₯Ό λ°›μŒ



πŸ’› Combine

Combine

πŸ‘‰ Publisher, Subscriber을 μ‚¬μš©ν•΄μ„œ 비동기 이벀트λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ„λ‘ μ• ν”Œμ—μ„œ κ°œλ°œν•œ ν”„λ ˆμž„μ›Œν¬
πŸ‘‰ RxSwiftμ™€μ˜ 차이점
γ€€γ€€πŸ‘‰ #1
γ€€γ€€γ€€γ€€πŸ‘‰ Combine의 Publisher : κ°’ νƒ€μž…, Outputκ³Ό ErrorλΌλŠ” 두 개의 μ—°κ΄€ Type을 가짐
γ€€γ€€γ€€γ€€πŸ‘‰ RxSwift의 Observable : μ°Έμ‘° νƒ€μž…, ElementλΌλŠ” ν•˜λ‚˜μ˜ νƒ€μž…λ§Œμ„ 가짐 (Error X)
γ€€γ€€πŸ‘‰ #2
γ€€γ€€γ€€γ€€πŸ‘‰ μ œκ³΅ν•˜λŠ” Operator의 차이가 있으며, Combineμ—λŠ” 주둜 ν•¨μˆ˜ μ•žμ— tryλΌλŠ” λͺ…칭이 λΆ™μ–΄μžˆμœΌλ©° μ—λŸ¬λ₯Ό 핸듀링 ν•  수 μžˆλŠ” κΈ°λŠ₯이 있음
γ€€γ€€πŸ‘‰ #3
γ€€γ€€γ€€γ€€πŸ‘‰ PublishSubject <-> PassthroughSubject와 λŒ€μ‘
γ€€γ€€γ€€γ€€πŸ‘‰ ReplaySubject <-> X
γ€€γ€€γ€€γ€€πŸ‘‰ BehaviorSubject <-> CurrentValueSubject와 λŒ€μ‘
γ€€γ€€πŸ‘‰ #4
γ€€γ€€γ€€γ€€πŸ‘‰ Combineμ—λŠ” DisposeBagμ΄λΌλŠ” 것이 λ”°λ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ
γ€€γ€€γ€€γ€€πŸ‘‰ λΉ„μŠ·ν•œ κΈ°λŠ₯ λ™μž‘μ„ μœ„ν•΄μ„œλŠ” AnyCancellable을 Set으둜 μ„ μ–Έν•˜κ³  store() λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„μ΄ κ°€λŠ₯함



πŸ’› Design Pattern

λ””μžμΈ νŒ¨ν„΄ πŸ†š μ•„ν‚€ν…μ²˜ νŒ¨ν„΄ βœ”οΈ

πŸ‘‰ λ””μžμΈ νŒ¨ν„΄
γ€€γ€€πŸ‘‰ νŠΉμ • λ¬Έλ§₯μ—μ„œ μ†Œν”„νŠΈμ›¨μ–΄ λ””μžμΈμ˜ 곡톡적인 λ°œμƒ λ¬Έμ œμ— λŒ€ν•΄ μž¬μ‚¬μš© κ°€λŠ₯ν•œ ν•΄κ²°μ±…
γ€€γ€€πŸ‘‰ νŠΉμ • μœ ν˜•μ˜ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법
γ€€γ€€πŸ‘‰ μ•± μ„±λŠ₯ 및 μœ μ§€λ³΄μˆ˜ 등에 λ§Žμ€ 영ν–₯을 λΌμΉ˜κΈ°μ— μ€‘μš”ν•œ κ°œλ…
γ€€γ€€πŸ‘‰ 효율적인 μ½”λ“œ μž‘μ„±, ν•΄κ²° λ°©μ•ˆ λ„μΆœ, μΈμˆ˜μΈκ³„ λŠ₯λ₯ μ¦κ°€ λ“±μ˜ μž₯점이 있음
πŸ‘‰ μ•„ν‚€ν…μ²˜ νŒ¨ν„΄
γ€€γ€€πŸ‘‰ ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ 큰 ꡬ쑰둜 κ΅¬μ„±λ˜μ–΄ λ‹€λ₯Έ κ΅¬μ„±μš”μ†Œλ“€μ„ κ΄€λ¦¬ν•˜λŠ” μ—­ν• 
πŸ‘‹ μ•„ν‚€ν…μ²˜ νŒ¨ν„΄μ΄ 쑰금 더 넓은 λ²”μœ„μ— 속함


MVC νŒ¨ν„΄ βœ”οΈ

πŸ‘‰ ν”„λ‘œκ·Έλž¨μ„ 각각의 역할에 따라 Model, View, Controller둜 λ‚˜λˆ„μ–΄ μ„€κ³„ν•œ λ””μžμΈ νŒ¨ν„΄
πŸ‘‰ Model
γ€€γ€€πŸ‘‰ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 무엇을 할지 μ •μ˜ν•˜λŠ” 파트
γ€€γ€€πŸ‘‰ μ•±μ˜ 데이터 및 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 가짐(DB, λ³€μˆ˜ λ“±)
πŸ‘‰ View
γ€€γ€€πŸ‘‰ μ‚¬μš©μžμ—κ²Œ μ–΄λ–€ 것을 ν™”λ©΄μœΌλ‘œ λ³΄μ—¬μ£ΌλŠ” μ—­ν• 
γ€€γ€€πŸ‘‰ UI μš”μ†Œ
πŸ‘‰ Controller
γ€€γ€€πŸ‘‰ Modelκ³Ό View의 닀리 μ—­ν• 
πŸ‘‰ μ΄ˆκΈ°μ— μ• ν”Œμ€ View와 Model의 μƒν˜Έ μ˜μ‘΄μ„±μ„ μ—†μ• κ³  Controller둜 ν†΅μ œν•˜λ €κ³  μ˜λ„ν•¨
πŸ‘‰ View와 Controllerκ°€ λ„ˆλ¬΄ λ°€μ ‘ν•˜κ²Œ μ—°κ²°λ˜μ–΄ 있음
γ€€γ€€πŸ‘‰ Controllerκ°€ View life cycle을 λ„ˆλ¬΄ 많이 κ΄€μ—¬ν•˜κ²Œ λ˜μ–΄ View와 Controllerλ₯Ό λΆ„λ¦¬ν•˜κΈ° 어렀움
πŸ‘‰ Life Cycle 뿐만이 μ•„λ‹Œ λŒ€λΆ€λΆ„μ˜ μ½”λ“œ(λ„€νŠΈμ›Œν¬ μš”μ²­ λ“±)κ°€ Controller에 λ°€μ§‘λ˜μ–΄ 크기가 컀지고 λ‚΄λΆ€ ꡬ쑰가 λ³΅μž‘ν•΄μ§
πŸ‘‰ 즉, μž¬μ‚¬μš©μ„±μ΄ 떨어지고, μœ λ‹› ν…ŒμŠ€νŠΈκ°€ μ–΄λ €μ›Œμ§
πŸ‘‰ λ”°λΌμ„œ, MVC νŒ¨ν„΄μ€ 개발 μ‹œκ°„λ©΄μ—μ„œλŠ” 빨리 개발이 κ°€λŠ₯ν•˜μ§€λ§Œ, ν”„λ‘œμ νŠΈ 규λͺ¨κ°€ 컀질수둝 μœ μ§€λ³΄μˆ˜μ— 어렀움이 있음
πŸ‘‰ 즉, 개발 μ‹œκ°„μ΄ 없을 λ•Œ, ν”„λ‘œμ νŠΈ 규λͺ¨κ°€ μž‘μ„ λ•Œ μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄


MVP νŒ¨ν„΄

πŸ‘‰ ν”„λ‘œκ·Έλž¨μ„ 각각의 역할에 따라 Model, View, Presenter둜 λ‚˜λˆ„μ–΄ μ„€κ³„ν•œ λ””μžμΈ νŒ¨ν„΄
πŸ‘‰ 기쑴의 MVCμ—μ„œ λ§Žμ€ 역할을 맑고 있던 ViewController의 일을 Presenterμ—κ²Œ λ‚˜λˆ„μ–΄ μ„€κ³„ν•œ λ””μžμΈ νŒ¨ν„΄
πŸ‘‰ 즉, Controller λŒ€μ‹  Presenter κ°œλ…μ΄ λ„μž…λœ λ””μžμΈ νŒ¨ν„΄
πŸ‘‰ Model
γ€€γ€€πŸ‘‰ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 무엇을 할지 μ •μ˜ν•˜λŠ” 파트
γ€€γ€€πŸ‘‰ μ•±μ˜ 데이터 및 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 가짐(DB, λ³€μˆ˜ λ“±)
πŸ‘‰ View
γ€€γ€€πŸ‘‰ μ‚¬μš©μžμ—κ²Œ μ–΄λ–€ 것을 ν™”λ©΄μœΌλ‘œ λ³΄μ—¬μ£ΌλŠ” μ—­ν• 
γ€€γ€€πŸ‘‰ UI μš”μ†Œ
πŸ‘‰ Presenter
γ€€γ€€πŸ‘‰ View(+ViewController)와 Model의 닀리 μ—­ν• 
γ€€γ€€πŸ‘‰ 일반적으둜 Viewμ—μ„œ μˆ˜ν–‰λœ μ‚¬μš©μžμ˜ λ™μž‘μ— λ°˜μ‘ν•˜μ—¬ Model에 변경을 μš”μ²­ν•˜κ³ , Model의 λ³€κ²½ 사항을 기반으둜 View에 μ—…λ°μ΄νŠΈλ₯Ό μš”μ²­ν•˜λŠ” μ—­ν• 
γ€€γ€€γ€€γ€€πŸ‘‰ Viewμ—μ„œ μœ μ € μ•‘μ…˜μ„ Presenterμ—κ²Œ 전솑함
γ€€γ€€γ€€γ€€πŸ‘‰ 전솑받은 데이터λ₯Ό Presenterμ—μ„œ Modelμ—κ²Œ μ—…λ°μ΄νŠΈλ₯Ό μš”μ²­ν•¨
γ€€γ€€γ€€γ€€πŸ‘‰ μ—…λ°μ΄νŠΈ ν›„ Modelμ—μ„œ Presenterμ—κ²Œ 변경사항 μ•Œλ €μ€Œ
γ€€γ€€γ€€γ€€πŸ‘‰ 변경사항을 기반으둜 Presenterμ—μ„œ View둜 UI μ—…λ°μ΄νŠΈλ₯Ό μš”μ²­ν•¨
γ€€γ€€γ€€γ€€πŸ‘‰ Modelκ³Ό ViewλŠ” λ°˜λ“œμ‹œ Presenter을 κ±°μ³μ„œ μ•Œ 수 있으며 μ§μ ‘μ μœΌλ‘œ μ„œλ‘œλ₯Ό μ•Œ 수 μ—†μŒ
πŸ‘‰ MVP νŒ¨ν„΄μ˜ ViewλŠ” life cycleκ³Ό 아무 연관이 μ—†κ³ , μ–΄λ– ν•œ λ ˆμ΄μ•„μ›ƒ μ½”λ“œλ„ Presenter에 μ•ˆ λ‹΄κ²¨μžˆμŒ
γ€€γ€€πŸ‘‰ 즉, MVP νŒ¨ν„΄μ˜ ViewλŠ” μ‰½κ²Œ mocking 될 수 있음
γ€€γ€€γ€€γ€€πŸ‘‰ mocking : Unit Testμ—μ„œ μ“°μ΄λŠ” 기술둜, μ‹€μ œμ™€ λ˜‘κ°™μ€ fake 버전을 λ§Œλ“€μ–΄ λ‚΄λŠ” ν…ŒμŠ€νŠΈ 기술
πŸ‘‰ λŒ€λΆ€λΆ„ μ±…μž„μ„ Presenter와 Model이 가지고 있으며 ViewλŠ” 역할이 많이 μ—†μŒ
πŸ‘‰ View와 Model이 μ™„μ „νžˆ 뢄리가 되기 λ•Œλ¬Έμ— λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈ κ°€λŠ₯
πŸ‘‰ λ”°λΌμ„œ, MVP νŒ¨ν„΄μ€ Testabilityκ°€ μ’‹μœΌλ©° λ§Žμ€ μ–‘μ˜ μ½”λ“œλ₯Ό κ°€μ§„λ‹€λŠ” νŠΉμ§•μ΄ 있음
πŸ‘‰ But, PresenterλŠ” View듀에 λŒ€ν•œ μ°Έμ‘°λ₯Ό 직접 ν”„λ‘œν† μ½œ ν˜•νƒœλ‘œ 가지고 변경사항을 λ°˜μ˜ν•¨
πŸ‘‰ Presenterκ°€ View에 λŒ€ν•œ 변경사항을 κ²°μ •ν•˜κΈ° λ•Œλ¬Έμ— Presenterκ°€ View에 λŒ€ν•΄ μ–΄λŠ 정도 μ•Œκ³  μžˆμ–΄μ•Ό 함
πŸ‘‰ 이에 따라, ν•˜λ‚˜μ˜ Presenterλ₯Ό 톡해 μœ μ—°ν•˜κ²Œ μ—¬λŸ¬ λ‹€λ₯Έ Viewλ₯Ό κ΅¬μ„±ν•˜λŠ” 것이 μ–΄λ €μ›Œ 짐
πŸ‘‰ 즉, Presenter와 Viewκ°€ 보이지 μ•ŠλŠ” 연관성을 가지고 μžˆλŠ” κ²ƒμœΌλ‘œλ„ λ³Ό 수 있음


MVVM νŒ¨ν„΄

πŸ‘‰ ν”„λ‘œκ·Έλž¨μ„ 각각의 역할에 따라 Model, View, ViewModel둜 λ‚˜λˆ„μ–΄ μ„€κ³„ν•œ λ””μžμΈ νŒ¨ν„΄
πŸ‘‰ ViewModel을 μΆ”κ°€ν•΄μ„œ ViewController의 일을 λœμ–΄μ£Όκ³  크기λ₯Ό 쀄여쀀 νŒ¨ν„΄
πŸ‘‰ Model
γ€€γ€€πŸ‘‰ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ 무엇을 할지 μ •μ˜ν•˜λŠ” 파트
γ€€γ€€πŸ‘‰ μ•±μ˜ 데이터 및 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 가짐(DB, λ³€μˆ˜ λ“±)
πŸ‘‰ View
γ€€γ€€πŸ‘‰ μ‚¬μš©μžμ—κ²Œ μ–΄λ–€ 것을 ν™”λ©΄μœΌλ‘œ λ³΄μ—¬μ£ΌλŠ” μ—­ν• 
γ€€γ€€πŸ‘‰ UI μš”μ†Œ
πŸ‘‰ ViewModel
γ€€γ€€πŸ‘‰ View(+ViewController)와 Model의 닀리 μ—­ν• 
γ€€γ€€πŸ‘‰ 일반적으둜 Viewμ—μ„œ μˆ˜ν–‰λœ μ‚¬μš©μžμ˜ λ™μž‘μ— λ°˜μ‘ν•˜μ—¬ Model을 λ³€κ²½ν•˜κ³ , Model의 λ³€κ²½ 사항을 View둜 μ—…λ°μ΄νŠΈν•˜λŠ” μ—­ν• 
πŸ‘‰ View에 ν•΄λ‹Ήν•˜λŠ” UIView, UIViewControllerλŠ” 각자의 ViewModel을 μ†Œμœ ν•¨
γ€€γ€€πŸ‘‰ Viewκ°€ ViewModel을 μ†Œμœ ν•˜κ³  있기 λ•Œλ¬Έμ— ViewModel은 Viewλ₯Ό λͺ°λΌλ„ 됨
γ€€γ€€πŸ‘‰ Viewκ°€ ViewModel을 μ†Œμœ ν•˜κ³ , ViewModel이 Model을 μ†Œμœ ν•  수 μžˆλŠ” 방식
πŸ‘‰ ViewModel은 View와 λ°”μΈλ”©λ˜μ–΄, 데이터와 μ‚¬μš©μž μ•‘μ…˜μ„ μ£Όκ³  λ°›μŒ
γ€€γ€€πŸ‘‰ Viewμ—μ„œ μœ μ € μ•‘μ…˜μ„ ViewModelμ—κ²Œ 전솑함
γ€€γ€€πŸ‘‰ 전솑받은 데이터λ₯Ό ViewModelμ—μ„œ Modelμ—κ²Œ μ—…λ°μ΄νŠΈλ₯Ό μš”μ²­ν•¨
γ€€γ€€πŸ‘‰ μ—…λ°μ΄νŠΈ ν›„ Modelμ—μ„œ ViewModelμ—κ²Œ 변경사항 μ•Œλ €μ€Œ
γ€€γ€€πŸ‘‰ ViewModel은 응닡받은 데이터λ₯Ό κ°€κ³΅ν•˜μ—¬ μ €μž₯함
γ€€γ€€πŸ‘‰ ViewModel에 μ˜ν•΄ 데이터가 μ €μž₯되면 Data Binding에 μ˜ν•΄ Viewκ°€ μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈ
γ€€γ€€γ€€γ€€πŸ‘‰ 바인딩을 ν•˜κ³  μžˆκΈ°μ— ViewModel의 변경사항을 View μͺ½μ—μ„œ λ°˜μ‘μ μœΌλ‘œ ν™•μΈν•΄μ„œ 반영
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ MVP νŒ¨ν„΄μ— μ‘΄μž¬ν•˜λ˜ β€œλ³΄μ΄μ§€ μ•ŠλŠ” μ—°κ΄€μ„±β€κΉŒμ§€ ν•΄μ†Œ
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ View와 ViewModel을 바인딩을 ν•˜λŠ” μ ‘μ°©μ œλ‘œ Rxκ°€ 맀우 κ°•λ ₯함
γ€€γ€€γ€€γ€€πŸ‘‰ Data Binding : ViewModel의 데이터와 UI의 싱크λ₯Ό λ§žμΆ”λŠ” 것
γ€€γ€€γ€€γ€€γ€€γ€€πŸ‘‰ 둜직이 λΆ„λ¦¬λ˜μ–΄ μžˆμ–΄λ„ ν•œμͺ½μ΄ λ°”λ€Œλ©΄ λ‹€λ₯Έ ν•œμͺ½λ„ μ—…λ°μ΄νŠΈλ˜μ–΄ λ°μ΄ν„°μ˜ 일관성을 μœ μ§€ν•  수 있음
πŸ‘‰ MVVM νŒ¨ν„΄μ€ Testabilityκ°€ μ’‹μœΌλ©° λ§Žμ€ μ–‘μ˜ μ½”λ“œλ₯Ό 가짐


Singleton νŒ¨ν„΄

πŸ‘‰ 단 ν•˜λ‚˜μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” λ””μžμΈ νŒ¨ν„΄
πŸ‘‰ 데이터 κ³΅μœ κ°€ μ‰¬μš°λ©°, λ©”λͺ¨λ¦¬ μΈ‘λ©΄μ—μ„œ μ—¬λŸ¬ 이점이 있음
γ€€γ€€πŸ‘‰ 미리 μƒμ„±ν•œ μΈμŠ€ν„΄μŠ€λ₯Ό μ΄μš©ν•˜λŠ” 것이기에, 속도 츑면에 이점이 있고, λ©”λͺ¨λ¦¬ λ‚­λΉ„λ₯Ό 방지할 수 있음
πŸ‘‰ λ©€ν‹° μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ—¬λŸ¬ 개의 객체가 μƒμ„±λ˜λŠ” λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆλ‹€λŠ” 단점이 있음
πŸ‘‹ μ‹±κΈ€ν„΄ μΈμŠ€ν„΄μŠ€λ‘œ λ„ˆλ¬΄ λ§Žμ€ 데이터λ₯Ό κ³΅μœ ν•˜κ²Œ 되면 ν΄λž˜μŠ€λ“€ κ°„μ˜ 결합도가 높아지고 μ½”λ“œ μˆ˜μ •κ³Ό ν…ŒμŠ€νŠΈκ°€ μ–΄λ €μ›Œ μ§„λ‹€λŠ” 단점도 있음
γ€€γ€€πŸ‘‹ 객체 지ν–₯ 섀계 원칙에 μ ν•©ν•˜μ§€ X
γ€€γ€€πŸ‘‹ 결합도 : λ‚΄λΆ€ κ΅¬ν˜„μ„ λ³€κ²½ν–ˆμ„ λ•Œ 이것이 λ‹€λ₯Έ λͺ¨λ“ˆμ— 영ν–₯을 λ―ΈμΉ˜λŠ” 경우 높은 결합도라 함



*****
NOT A TALENT ❎ NOT GIVING UP βœ…
CopyRight β“’ 2022 DCherish All Rights Reserved.