책을 추가하기 위한 View이다. 위의 View를 구성하기 위해서는 많은 UI Component가 필요한데, ViewController에서 모든 UI Component를 Code로 작성하면 코드가 길어져 가독성이 떨어질 뿐만 아니라 유지보수에도 어려움이 있다.
그래서 나는 View를 모듈화 하여 상위 ViewController에서 View Component를 생성해서 사용하도록 구현했다.
문제점
문제는 하위 View의 UI Component는 private로 선언되어있기 때문에 상위 ViewController에서 직접적으로 하위 View의 UI Component에 접근할 수 없고, ViewModel의 Output 값을 하위 View에 Bind 할 수 없다는 것이다.
생각하기
✅ 하위 View의 UI Component를 public으로 선언하면 되잖아?
➡️ public으로 선언하면 캡슐화를 할 수 없고 이는 응집성을 떨어뜨리므로 좋은 방법이 아니라고 생각한다.
✅ 하위 View마다 ViewModel을 생성하면 되잖아?
➡️ 하위 View마다 ViewModel을 생성하면 코드가 복잡해지고, 데이터의 일관성을 유지하기 어렵기 때문에 좋은 방법이 아니라고 생각한다.
✅ 하위 View에 대한 데이터를 서브셋으로 전달하면 되잖아?
➡️ 좋은 방법이라고 생각한다.
하위 View에서 데이터를 처리하는 메소드를 구현한다.
상위 ViewController에서는 ViewModel의 Output 값을 하위 View의 configuration 메소드를 통해 데이터를 하위 View에 전달한다.
✅ Delegate 패턴을 사용하여 바인딩하면 되잖아?
➡️ 좋은 방법이라고 생각한다.
상위 ViewController에서 프로토콜을 구현하고 해당 프로토콜을 extension하여 메소드를 구현한다.
그리고 하위 View의 Delegate를 상위 ViewController가 되도록 하고, 하위 View에서는 전달 받은 데이터를 UI Component에 바인드 한다.
✅ 하위 View에 상위 ViewController의 ViewModel을 주입하면 되잖아?
➡️ 좋은 방법이라고 생각한다.
하위 View의 초기화 메소드에 상위 ViewModel을 초기화 한다.
상위 ViewController에서 하위 View를 생성할 때 상위 ViewController의 viewModel을 전달한다.
하위 View에서는 주입 받은 ViewModel에 접근하여 직접적으로 바인드 한다.
선택하기
개발자는 자신의 프로젝트에 맞는 방법을 잘 선택해야 좋은 코드를 짤 수 있다고 생각한다. 위의 세 방법 다 좋은 방법이라고 생각하지만, 내 프로젝트에 맞는 방법은 하위 View에 상위 ViewController의 ViewModel 주입하는 방법이라고 생각한다.
✅ SearchRecordViewController(상위 ViewController)의 모든 하위 View는 동일한 ViewModel을 사용하기 때문에
✅ 모든 하위 View마다 프로토콜을 구현하고 채택하면 코드의 복잡성이 증가할 것이라고 생각하기 때문에
✅ 하위 View의 로직이 변경 되어도 ViewModel만 수정하면 되므로 후에 유지보수에 유리하다고 생각하기 때문에
위와 같은 이유로 나는 하위 View에 상위 ViewController의 ViewModel 주입하는 방법을 선택하여 프로젝트에 적용하였다.
'ToyProject - Book2OnNon (모바일 서재)' 카테고리의 다른 글
[Book2OnNon/회고] Book2OnNon 개발을 마무리 하며 (0) | 2024.05.16 |
---|---|
[Book2onNon] 무한 스크롤을 구현하고 스크롤링 이벤트 발생 시 새로운 데이터를 요청해보는 것을 구현해보자. (1) | 2024.03.16 |