[Home] 정렬 버튼 누를 때마다 모드 변경 및 접근성 추가, HomeViewModel 추상화 #41
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Screenshots 📸
고민, 과정, 근거 💬
아키텍처 흐름 고민
각 하위 뷰마다 ViewModel을 참조하면서 동시에 하위뷰만의
@State
변수를 갖는 것은 데이터를 관리하기 어렵다고 판단하였고,ViewModel
이Single source of truth
가 되도록 구현했습니다.하위뷰가 이벤트를 받으면 ViewModel에게 업데이트를 요청하고, 받아온 데이터를 다시 자신의
@State
변수에 업데이트해주는 방식을 사용했었지만,지금은 ViewModel에게 이벤트 전달 -> ViewModel에서 State 수정 -> 변경된 State에 의해 View 재생성 -> ViewModel에게 이벤트 전달 -> ...
과 같이 단방향 흐름으로 구성했습니다.
추상화
ViewModel
과View
간 DIP원칙을 지키고 싶었습니다. 테스트를 할 때 MockViewModel을 주입하여 View의 특정 반응을 검증할 때 수월해지기 때문입니다.그래서
View
가 Concrete Type을 바라보지 않고 추상화된 타입을 바라보도록 구성하려 했으나 ViewModel은ObservableObject
를 채택해야하고,ObservableObject
에는associatedtype
이 존재합니다.결국 컴파일 시점에서 viewModel의 실제 타입 정보가 무엇으로 들어오는지 알 수 없게 됩니다.
그래서 Generic을 두어
ViewModelRepresentable
을 채택한 구현체를 타입으로 두어 해결했습니다.References 📋