[MVVM] showAlert 변수를 어디에 둘 것인가? @Work

SteadySlower·2022년 7월 16일
0

@Work는 제가 실무에서 겪었던 이슈들을 요약한 포스팅입니다.

VM에는 비지니스 로직만 있어야 하지 않을까?

오늘 View와 ViewModel을 리팩토링을 하고 ViewModel에 대한 Unit Test를 작성하는 일을 맡았습니다. 순조롭게 리팩토링을 진행하고 있던 중 ViewModel 안에서 아래와 같은 변수를 발견했습니다.

// VM
@Published var showAlert: Bool = false

해당 변수는 .alert에 연결되어서 사용자에게 올바른 입력이 아닐 때 alert를 보여주도록 하는 역할을 하고 있었습니다. 저는 해당 변수가 비지니스 로직이 아니라고 생각을 했습니다. 해당 변수는 단지 어떤 View를 보여주거나 dismiss하는 역할을 할 뿐이라고 생각해서 아래처럼 수정해서 View로 옮겼습니다.

// View
@State private var showAlert: Bool = false

그리고 VM에 대한 Unit Test를 작성할 때 위 변수에 대한 테스트를 작성하지 않았습니다.

피드백

그렇게 PR을 하고 코드 리뷰를 받던 중에 이런 의견이 나왔습니다

“MVVM 모델에서 VM은 사용자의 Action을 받아서 State를 변경한다. 그리고 이 State와 변 Binding된 View가 변경된다. 그런데 이 State들을 VM 외부로 밀어내면 사용자의 Action에 대한 테스트가 불가능하다.”

그래서 최종적으로는 위 변수를 VM 안에 두기로 했습니다.

의문

Action → State → View는 분명히 납득할 만한 말씀이었습니다. 하지만 저는 아직 작은 의문점을 가지고 있습니다.

먼저 MVVM은 MVC의 단점을 보완하기 위해서 나온 것으로 알고 있습니다. MVC에서 Controller는 비지니스 로직과 어떤 View를 보여줄지 선택을 합니다. 즉 비지니스 로직과 View에 대해서 모두 관여하기 때문에 필연적으로 Controller가 무거워질 수 밖에 없습니다.

반면에 MVVM의 ViewModel를 View와 독립적으로 설계합니다. 따라서 View와 ViewModel을 각각 모듈화해서 개발할 수 있습니다. View는 화면에 대해서만 그리고 ViewModel은 비지니스 로직을 전담합니다.

showAlert의 경우 제 생각에는 비지니스 로직과는 관련이 없습니다. 해당 변수는 Alert, 즉 View를 보여줄지 말지에 대한 변수에 불과합니다. 따라서 ViewModel 보다는 View에 있는 것이 적절하다는게 제 생각입니다.

profile
백과사전 보다 항해일지(혹은 표류일지)를 지향합니다.

0개의 댓글