[알쓸신잡] 리팩토링의 상처

유인호·2024년 3월 5일
0

알쓸신잡

목록 보기
18/20

상황 설명 : 코인 정보 앱을 만드는데, 코인의 정보를 관리하는 뷰모델을 싱글톤으로 구성하고, 옵저버블 패턴으로 하나의 뷰모델이 여러 뷰를 관리하는 상황.


싱글톤을 사용한 이유는,
1. 뷰마다 데이터가 달라질 것을 우려해서.
2. TabbarView로 인해 떨어져 있는 tableView나 Collection뷰들이 한꺼번에 Reload되면 좋을것 같아서.
3. 비슷한 기능들을 하는 Function들이 많아서.

그 이유로 싱글톤으로 구성하였는데,, 다음과 같은 문제들이 생겼습니다.

  1. didSelectInput, collectionDidSelectInput 처럼 어처피 갯수가 많아진다. -> 이걸 해결하기 위해서 ViewDidLoad가 아닌 ViewWillApear등에 bind를 하는 등의 대처를 할 수 있겠지만, 뭐랄까요... 구멍난 배에 테이프로 막는 느낌입니다.. 여기까지 생각이 미쳐 닿지 않았네요.
  2. 결국에는 뷰마다 비슷한 기능들을 하는 Observable들을 중복 선언하게 된다.
  3. viewModel을 하나의 뷰에 여러번 사용하려다보니 서로간의 소통이 필요한 지점에서 애 먹게 된다. -> ViewModel안에 RealmViewModel을 선언하는 방법도 있겠지만, 여전히 맘에 들진 않습니다. 책임을 나누려고 한거였는데, 그렇지 못하게 된거니까요.
  4. private var closures: [(className: AnyClass, action: (()->Void))] = [] 이부분도 문제가 생겼습니다. 같은 뷰를 여러 탭에서 띄울수가 있는데, Binding이 무시되어버리는 문제가 생깁니다.

대안을 생각해보았을때.
1. 데이터 자체 부분은 싱글톤으로 구성한다. +) 주기적으로 데이터를 Fetching하는 부분도 같이 제공
2. ViewModel은 싱글톤이 아닌 인스턴스화 한다.
3. ViewModel은 Data Singleton을 소유한다.
4. NotificationToken을 누가 갖고 있어야 하는가가 제일 고민입니다. 싱글톤이 갖고 있고 데이터가 변경 되었을떄 여러 뷰모델에 이벤트를 전달하는 방식으로 구현할지, 아에 뷰모델이 갖고 있어서 데이터를 직접적으로 관찰하는 형태로 할지 고민이였습니다.
-> 싱글톤이 NotificationToken을 갖고 있으면 여러 뷰를 왔다갔다 했을때, 그리고 위의 문제인 같은 뷰를 여러 탭에서 띄웠을때의 문제를 대비할수가 없다는 결론, 뷰모델이 직접 싱글톤의 데이터를 관찰하는 형태로 구현해보겠습니다.

profile
🍎Apple Developer Academy @ POSTECH 2nd, 🌱SeSAC iOS 4th

0개의 댓글