화면 전환 방식에 관하여 논의합니다. (Router, Coordinator) #514
Replies: 4 comments 3 replies
-
논의 1: 라우터를 제거하자.저도 라우터의 필요성을 크게 못느껴서 직관적으로 NavigationController로 사용하는 것이 좋을 것 같아요. func replaceRootWindow() { }
func presentAlertVC() { }
func presentNetworkAlertVC() { }
func showBottomSheet() { } 논의 2:VC의 생명주기에 맞춰서 Coordinator가 메모리에서 해제될 수 있도록 하자문제 상황 너무 공감해요. finishFlow에서 removeDependency를 하는 것을 저도 까먹을 때가 종종 있어서 휴먼에러 발생 위험이 높더라구요 |
Beta Was this translation helpful? Give feedback.
-
추가로 이번주 목요일까지 발생 가능한 화면 전환 경우의 수를 조금 정리해서 올게요! |
Beta Was this translation helpful? Give feedback.
-
답변이 늦어서 죄송합니다 ㅎ.ㅎ 논의 1: Router를 제거하자저도 라우터를 제거하는 것에 동의합니다. 앞서 두 분이 Router 내부 함수들의 필요성을 논의해보자고 하셔서 우선 존재하는 함수들에 대한 역할과 필요 여부를 간단히 정리해보았어요. 개인적인 의견도 살짝 적어두었습니다!_!
저도 이 의견에 동의합니다. 성격이 비슷한 추가) OPNavigation![]() ![]() 현재 사용되고 있는 커스텀 Navigation 중 솝탬프에서 사용되는 OPNavgation만 init 시 VC를 주입받아 NavigationBar에서 pop해주고 있는데, 이 부분도 코디네이터에서 처리하는건 어떠신가요 ? |
Beta Was this translation helpful? Give feedback.
-
논의 2: VC의 생명주기에 맞춰서 Coordinator가 메모리에서 해제될 수 있도록 하자논의 1을 함께 리팩토링 한 후 논의 2를 진행하자는 의견에도 동의합니다! 다만 저희 프로젝트에서는 한 VC당 하나의 코디네이터를 소유하고 있는 것이 아닌 부분도 있는 것 같아서 그대로 적용하긴 어려워보여요. 논의 1에 대한 리팩토링 후 이 부분 다시 한 번 살펴보겠습니다. 아티클 내용에 대한 이해를 바탕으로 수도코드를 작성해보았는데 참고해주세요! /// 코디네이터
class ACoordinator {
private weak var navigationController: UINavigationController? // 순환참조 방지
...
let viewModel = AViewModel()
let VC = AViewController(viewModel: viewModel)
// ViewModel이 Coordinator 강한 참조
viewModel.coordinator = self
} /// 뷰모델
class AViewModel {
var coordinator: ACoordinator? // ViewModel이 Coordinator 강한 참조
} /// 뷰컨트롤러
class AViewController {
var viewModel: AViewModel
init(viewModel: any ViewModel) {
self.viewModel = viewModel
}
}
|
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
화면 전환 방식을 리팩토링하기 위해, 구체적인 방안 논의를 위한 Discussion을 열었습니다. 🙇🏼
논의할 주제는 크게 두 가지인데요.
💡 논의 1: Router를 제거하자
문제 상황
Router의 실효성
Router의 초기 구현 목적은 화면 전환 처리에 대한 완전한 책임 분리였습니다. Coordinator는 화면 전환 흐름을 관리할 뿐, 직접적인 라우팅에 대한 책임을 지어선 안된다는 목적에 의해 분리되었는데요. 참고 자료
그러나 이를 위해 내장 함수를 단순 래핑하는 것이 실질적으로 필요한가? 에 대한 의문점이 들었습니다. (아래 사진 참고)

또한, Coordinator는 본래 네비게이션 흐름을 담당하는 객체인데, 화면 전환 로직을 꼭 몰라야 하는지에 관해서도 생각해 볼 부분입니다.
프로젝트에 미치는 영향
예시 코드
UINavigationController
를 주입받아 더 이상 Router가 아닌 네비컨에게 직접 화면 전환을 요청하는 방식으로 전면 수정하면 될 것 같습니다.💡 논의 2: VC의 생명주기에 맞춰서 Coordinator가 메모리에서 해제될 수 있도록 하자
문제 상황
finishFlow()
를 수동으로 불러 이를 받은 부모 Coordinator가 의존성을 삭제해주는 방식입니다.finishFlow()
를 부르지 않을 경우, 의존성이 제거되지 못해 메모리에서 해제되지 못하고 Coordinator가 잔존한다는 문제가 있습니다.해결 방안
SplashViewControllable
에서 VC가 해제될 때 호출될onDeinit
클로저를 만듭니다.stop
클로저와, 메모리에서 해제될 때onDeinit
을 부를 VC를 지정하도록 합니다.생각해볼 것
finishFlow
를 호출하지 않아도 되지만, 이 방법 또한 deallocallable 변수에 지정될 VC를 직접 등록해줘야 하는 불편함이 존재합니다. (이 또한 등록해주지 않으면 메모리에서 해제되지 않습니다.)🚀 참고 자료
Beta Was this translation helpful? Give feedback.
All reactions