π VStack
γγπ μ 체 λ°μ΄ν°λ₯Ό λ©λͺ¨λ¦¬μ λ΄μλκ³ μ€ν¬λ‘€ ν λλ§λ€ 보μ¬μ€
π LazyVStack
γγπ λ°μ΄ν°κ° νλ©΄μ λ λλ§ λλ μκ°, μ¦, 보μ¬μ§λ μκ° κ·Έλ €μ§
π μ¦, 미리 νλ©΄μ λ€ κ·Έλ €λκ³ λ³΄μ¬μ£Όλλ, λ λλ§ λλ μκ°μ κ·Έλ €μ£Όλλμ μ°¨μ΄
π 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 ν΄λμ€), μ°Έμ‘° νμ
, κ°λ°μκ° μ§μ κ΄λ¦¬
π UIViewControllerμ νμ ν΄λμ€λ‘, UIKit κΈ°λ°μ νλ‘μ νΈμ ν΅ν©λ μ μλλ‘ SwiftUI λ·°λ₯Ό κ°μΈλ μν μ μνν¨
π SwiftUIμμ UIViewλ₯Ό μ¬μ©νκΈ° μν΄ νμν νλ‘ν μ½
π UIViewRepresentableλ₯Ό λ°λ₯΄λ structλ₯Ό λ§λ€μ΄ SwiftUIμμ λ°λ‘ μ¬μ©νλ©΄ λλ©°, ν΄λΉ structλ λ°λμ λ κ°μ§ λ©μλλ₯Ό ꡬνν΄μΌ ν¨
γγπ ex) struct RepresentableRedLabel: UIViewRepresentable { ~ }
π νμ ꡬν λ©μλ 2κ°μ§
γγπ func makeUIView(context: Context) -> UIKitμμμ νμ
// SwiftUIμμ λνλΌ λ·°λ₯Ό λ°ν
γγπ func updateUIView(_ uiView: UIKitμμμ νμ
, context: Context) // SwiftUIμμ μ
λ°μ΄νΈκ° λ°μν λ μ€ν
π 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μμ μ
λ°μ΄νΈκ° λ°μν λ μ€ν
π κΈ°μ‘΄μ μμ±ν λ·° λλ modifierλ₯Ό λ€λ₯Έ λ²μ μΌλ‘ λ§λ€κΈ° μν΄ μ¬μ©νλ κ°λ
γγπ modifier : λ·°μ modifierλ₯Ό μ μ©νμ¬ μλ‘μ΄ λ·°λ₯Ό λ§λ€μ΄ 리ν΄νλ κ°λ
π λ°ν νμ
μ΄ λΆν¬λͺ
ν λ°ν νμ
(μ μ λ€λ¦ νμ
)μ΄λΌλ κ²μ λνλ
γγπ μ μ λ€λ¦ : ν¨μ μΈλΆμμ μ΄λ€ νμ
μ λ€λ£¨λμ§ μ νν μ μ μμ§λ§, λ΄λΆμμλ μ νν μκ³ μμ
π λͺ
ννμ§ μμ νμ
μ΄ νλ‘ν μ½ λ΄μ μ μλμ΄ μκ³ , μ΄ νλ‘ν μ½μ ν¨μ νΉμ μ°μ° νλ‘νΌν°μ λ°ν νμ
μΌλ‘ κ°μ§ λ λ°ν νμ
μ λΆν¬λͺ
νμ
μΌλ‘ λ§λ€μ΄ μ£ΌκΈ° μν΄ μ¬μ©
π λ°ν νμ
μ΄ μ΄λ€ νμ
μΌμ§ μ»΄νμΌλ¬ λ° μΈλΆμμ λͺ¨λ₯΄κ² μ§λ§, ν¨μ λ΄λΆμμ μ΄λ€ νμ
μ λ°ννλμ§ λͺ
ννκ² μκ³ μμΌλ, μ»΄νμΌλ¬μκ² μ ν΄μ§ νΉμ νμ
λ§μ λ°νν΄ μ€ κ²μμ μλ €μ£Όλ κ°λ
π λ°λΌμ, var body: some View { λ΄λΆ ~ } μ ν¨μ λ΄λΆμμ λ΄κ° μμ±νλ μ½λμ λ°λΌ μμ κ°κ° λ¦¬ν΄ νμ
μ΄ λ³κ²½λμ§λ§, λ°λ‘ λ¦¬ν΄ νμ
μ λ³κ²½νμ§ μμλ λκ³ some Viewλ‘ μμ±ν΄λ λλ μ΄μ
π νμ
μ μμ‘΄νμ§ μλ λ²μ©μ μΈ μ½λλ₯Ό μμ±ν λ μ¬μ©νλ κ°λ
π μ€λ³΅μ νΌνκ³ μ½λλ₯Ό μ μ°νκ² μμ±ν μ μμ
π ν¨μ λ΄λΆμμ μ΄λ€ νμ
μ λ€λ£¨λμ§ μ μ μμ§λ§, μΈλΆμμλ νμ
μ΄ κ°λ₯ν¨
γγπ ex) func load<T: Decodable>(_ filename: String) -> T { ~ }
γγγγπ <T>μ μλ―Έλ λ°λ‘ μλ‘μ΄ νμ
μ΄ μλλΌ λλ μ΄λ―Έ μκ³ μλ, μλ μ‘΄μ¬νλ νμ
μ΄λΌλ κ²μ μλ €μ£ΌκΈ° μν¨
γγγγπ <T: Decodable>μ ν΅ν΄ Tμ λν μ μ½μ μ€μ
π λ°μ΄ν° νμ
μ μμ‘΄νμ§ μκ³ , νλμ κ°μ΄ μ¬λ¬ λ€λ₯Έ λ°μ΄ν° νμ
μ κ°μ§ μ μλλ‘ νλ κΈ°μ μ μ€μ μ λλ νλ‘κ·Έλλ° ν¨λ¬λ€μ
β 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
π SwiftUIμμ ForEachλ₯Ό μ¬μ©νμ¬ Viewλ₯Ό λ°λ³΅ν μ μμ
π Swiftμ .forEachμλ μ½κ° λ€λ₯Έ κ°λ
π ForEach id: .self μλ―Έ
γγπ SwiftUIμμ λ°°μ΄μ κ° μμλ₯Ό κ³ μ νκ² μλ³ν μ μλλ‘ νκΈ° μν΄ νμν¨
π λ°μ΄ν°μ νλ¦κ³Ό μ λ¬μ κ΄ν΄ μ€μ μ λλ, μ¦, λΉλκΈ°μ μΈ λ°μ΄ν° μ€νΈλ¦Όμ μ΄μ©ν νλ‘κ·Έλλ° ν¨λ¬λ€μ
β RxJava, RxSwift, etc
π 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, λ²νΌλ λ©λͺ¨λ¦¬κ° κ°μ§κ³ μκΈ°μ, ν° μ©λ(μ΄λ―Έμ§, ν° λ°°μ΄)μ λ°μ΄ν°λ₯Ό λ²νΌλ‘ κ°κ² νλ€λ©΄ λ©λͺ¨λ¦¬μ λΆνκ° λ°μνκΈ°μ μ£Όμν΄μΌ ν¨
π 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λ‘ λ³ν κ°λ₯
π Reactiveμ μνλ κΈ°λ₯μ΄ κ΅¬νλμ΄ μμ§ μμ extensionνμ¬ νμ©νλ κ²
π UI μ΄λ²€νΈ μ²λ¦¬μ μ’ λ νΉνλ κ²(ν΄λμ€), onNext μ΄λ²€νΈλ§ μ‘΄μ¬ (onError, onCompleted X)
π PublishSubjectμ wrapperλ‘, ꡬλ
μλ ꡬλ
μ μμν μ΄νλΆν°μ μ΄λ²€νΈλ₯Ό λ°μ
π 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() λ©μλλ₯Ό μ¬μ©νλ λ°©μμΌλ‘ ꡬνμ΄ κ°λ₯ν¨
π λμμΈ ν¨ν΄
γγπ νΉμ λ¬Έλ§₯μμ μννΈμ¨μ΄ λμμΈμ 곡ν΅μ μΈ λ°μ λ¬Έμ μ λν΄ μ¬μ¬μ© κ°λ₯ν ν΄κ²°μ±
γγπ νΉμ μ νμ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²
γγπ μ± μ±λ₯ λ° μ μ§λ³΄μ λ±μ λ§μ μν₯μ λΌμΉκΈ°μ μ€μν κ°λ
γγπ ν¨μ¨μ μΈ μ½λ μμ±, ν΄κ²° λ°©μ λμΆ, μΈμμΈκ³ λ₯λ₯ μ¦κ° λ±μ μ₯μ μ΄ μμ
π μν€ν
μ² ν¨ν΄
γγπ νλ‘κ·Έλ¨ λ΄μμ ν° κ΅¬μ‘°λ‘ κ΅¬μ±λμ΄ λ€λ₯Έ ꡬμ±μμλ€μ κ΄λ¦¬νλ μν
π μν€ν
μ² ν¨ν΄μ΄ μ‘°κΈ λ λμ λ²μμ μν¨
π νλ‘κ·Έλ¨μ κ°κ°μ μν μ λ°λΌ 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 ν¨ν΄μ κ°λ° μκ°λ©΄μμλ 빨리 κ°λ°μ΄ κ°λ₯νμ§λ§, νλ‘μ νΈ κ·λͺ¨κ° 컀μ§μλ‘ μ μ§λ³΄μμ μ΄λ €μμ΄ μμ
π μ¦, κ°λ° μκ°μ΄ μμ λ, νλ‘μ νΈ κ·λͺ¨κ° μμ λ μ¬μ©νλ ν¨ν΄
π νλ‘κ·Έλ¨μ κ°κ°μ μν μ λ°λΌ 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κ° λ³΄μ΄μ§ μλ μ°κ΄μ±μ κ°μ§κ³ μλ κ²μΌλ‘λ λ³Ό μ μμ
π νλ‘κ·Έλ¨μ κ°κ°μ μν μ λ°λΌ 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κ° μ’μΌλ©° λ§μ μμ μ½λλ₯Ό κ°μ§
π λ¨ νλμ μΈμ€ν΄μ€λ₯Ό μμ±νμ¬ μ¬μ©νλ λμμΈ ν¨ν΄
π λ°μ΄ν° 곡μ κ° μ¬μ°λ©°, λ©λͺ¨λ¦¬ μΈ‘λ©΄μμ μ¬λ¬ μ΄μ μ΄ μμ
γγπ 미리 μμ±ν μΈμ€ν΄μ€λ₯Ό μ΄μ©νλ κ²μ΄κΈ°μ, μλ μΈ‘λ©΄μ μ΄μ μ΄ μκ³ , λ©λͺ¨λ¦¬ λλΉλ₯Ό λ°©μ§ν μ μμ
π λ©ν° μ€λ λ νκ²½μμ μ¬λ¬ κ°μ κ°μ²΄κ° μμ±λλ λ¬Έμ κ° λ°μν μ μλ€λ λ¨μ μ΄ μμ
π μ±κΈν΄ μΈμ€ν΄μ€λ‘ λ무 λ§μ λ°μ΄ν°λ₯Ό 곡μ νκ² λλ©΄ ν΄λμ€λ€ κ°μ κ²°ν©λκ° λμμ§κ³ μ½λ μμ κ³Ό ν
μ€νΈκ° μ΄λ €μ μ§λ€λ λ¨μ λ μμ
γγπ κ°μ²΄ μ§ν₯ μ€κ³ μμΉμ μ ν©νμ§ X
γγπ κ²°ν©λ : λ΄λΆ ꡬνμ λ³κ²½νμ λ μ΄κ²μ΄ λ€λ₯Έ λͺ¨λμ μν₯μ λ―ΈμΉλ κ²½μ° λμ κ²°ν©λλΌ ν¨