오늘은 MVVM 패턴에 대해서 배웠는데, 사실 아직 잘 모르겠습니다...

일단 이해한 대로 MVVM 패턴에 대해 한 번 써보려 합니다..!

1. What is MVVM?

MVVM 패턴이란 디자인을 Model, ViewModel, View로 나누는 것을 말합니다.

이렇게 나누는 이유는, UI와 실제 코드를 분리하여 로직과 디자인 간의 상호 영향을 줄여 개발을 편하게 만들기 위함입니다.

View는 UI를 맡고, Model엔 로직이 들어있고, ViewModel이 이 사이에서 중개자가 됩니다. 상사맨을 보는 것 같습니다..

  1. View는 user intent를 받아 ViewModel에게 명령하고,
  2. ViewModel은 필요한 데이터를 Model에게 요청,
  3. Model은 로직을 거치거나 등등 해서 요청받은 데이터를 응답,
  4. ViewModel은 Model로부터 받은 데이터를 저장한다.
  5. View는 ViewModel과 바인딩 되어있어 ViewModel에 저장된 데이터가 변함에 따라 갱신된다.

이렇게 돌아가는 것 같습니다..

왜이렇게 배우는 게 힘들까? 했더니 원래 혼자서 간단한 걸 만들때는 적용을 안하는게 더 쉬울 수 있다고 합니다.

2. 내가 적용해본 MVVM

Apus 동아리에서 진행하는 팀 프로젝트의 제가 맡은 부분입니다! 아직 완성된 건 아니지만요..

.padding(someValue)등 디자인을 위한 함수는 대체로 생략하고 올렸습니다.

<Model>

import Foundation

struct ProcessLocation {
    private let availableDistance = 50.0
    private let gaepoLatitude = 37.48815449911871
    private let gaepoLongitude = 127.06476621423361
    
    static func haversineDistance(la1: Double, lo1: Double, la2: Double, lo2: Double, radius: Double = 6367444.7) -> Double {
        <...중략...>
    }
/* 위도 경도를 두 세트 받아서 거리를 구해주는 공식입니다. 출처는 요기 <https://github.com/raywenderlich/swift-algorithm-club/tree/master/HaversineDistance>
	무한한 감사를 올립니다.. */
    
		func getDistanceFromCluster(lat userLatitude: Double, lon userLongitude: Double) -> Double {
        return ProcessLocation.haversineDistance(la1: gaepoLatitude, lo1: gaepoLongitude,
                                                 la2: userLatitude, lo2: userLongitude)
    }
    
    func isNear(lat userLatitude: Double, lon userLongitude: Double) -> Bool {
        if ProcessLocation.haversineDistance(la1: gaepoLatitude, lo1: gaepoLongitude,
                             la2: userLatitude, lo2: userLongitude) > availableDistance {
            return false
        } else {
            return true
        }
    }
}