시나리오 : MVVM 아키텍처 예제를 찾아보던 중 특정 예제에서 struct로 뷰모델을 만드는 걸 보게 되었고, 왜 뷰모델을 struct로 만들었을까? 하는 의문에서 시작!
https://ko.wikipedia.org/wiki/모델-뷰-뷰모델
위키백과를 통해 뷰모델 설명에서 "공용!" 이라는 표현을 볼 수있다.
그렇다 뷰모델은 View - ViewModel의 관계에서 상황에따라 (1:N) (N:1) (N:N)를 가질 수 있어 데이터가 공유될 수 있다는 점을 짚고 넘어가자 (View-ViewModel 관계에 대해서는 더 스터디하고 정리해보겠습니다.)
ViewModel의 사용목적부터 정의를 해보면,
View로부터 독립적이고 , View가 필요로 하는 데이터만을 소유
이로 인한 기대효과는 유지보수, 재사용성, 테스트 등의 용이성 이 되겠다.
그.렇.다.면
class로 사용해야하는 이유
어떤 데이터가 공유되려면 힙영역에 존재해야한다.
-> 뷰모델은 관찰대상임으로 스택영역에 있으면 관찰이 되지 않는다.
struct를 뷰모델로 사용하지 못하는 이유
멀티쓰레딩 환경에서 스택과 스택간의 공유가 되지않는다 (멀티쓰레딩 환경을 고려하지 않아도 된다면?)
멀티쓰레드를 사용하게 되면 힙영역을 이용하여 데이터를 주고 받을 수 있다.
(멀티쓰레드에서는 스택영역만 공유되지 않는다.)
애플 공식사이트를 통해서도 정보를 얻을 수 있다.
간단하게 정리를 해보자면
struct의 경우 복사의 개념으로 참조하는 값이 바뀌어도 기존 값에는 영향이 없고
class의 경우 공유의 개념으로 참조하는 값이 바뀌면 기존값도 영향을 받기 때문에 이 부분을 염두에 두고 사용해야 한다는 것!
마무리
- ViewModel의 사용목적을 다시 꼼꼼히 찾아보면서 + 나의 경험을 비추어 보니 Class로 사용하는게 좀 더 사용목적에 맞을거 같다는 생각이다.
- 관련해서 다른 의견이 있다면 언제든 환영입니다. 미리 감사의 말씀드립니다.
참조사이트:
https://developer.apple.com/documentation/swift/choosing-between-structures-and-classes
관련글 추천!
https://artieee.tistory.com/15
[Swift+Design Patterns] The Singleton 패턴 (0) | 2022.05.09 |
---|---|
[SwiftUI] Life Cycle(생명주기) 알아보기 (0) | 2022.04.20 |
[Swift] MVVM 패턴 (아키텍처 디자인)이 무엇인지 한번 캐보자! (0) | 2022.03.01 |
[Swift] MVVM 패턴 (아키텍처 디자인) 왜? 해야하나요? MVVM 안써도 코딩은 할 수는 있지만, 쓰는데는 다 이유가 있는법! (0) | 2022.03.01 |
[Swift] SwiftUI에서는 왜 뷰에 struct를 사용할까? (1) | 2022.02.19 |
댓글 영역