---
# System prepended metadata

title: 아키텍처 고민

---


**문제점**

- 다양한 앱 플로우 

    - Case 1: 회원가입 후 메인화면으로 넘어가는 Navigation 플로우
    ```
    ex): SplashVC -> LoginVC 
    -> OnboardingFlow(성별입력 -> 나이입력..등등, 가입완료) 
    -> TabBarController로 시작하는 MainFlow(HomeTab, SearchTab, MyPageTab)
    ```
    ---
    - Case 2: 비회원 활동 중 로그인이 필요한 Navigation 플로우
    ```
    ex): SplashVC -> LoginVC -> (비회원) 
    -> MainFlow(뮤지션 검색 -> 뮤지션 상세화면 -> 뮤지션 북마크 상호작용 -> 로그인 필요 팝업) 
    -> LoginVC -> OnboardingFlow -> MainFlow(뮤지션 검색 -> 뮤지션 상세화면[2단계 네비게이션])
    ```
    ---
    - Case 3: 자동 로그인을 통한 메인화면으로 이동하는 Navigation 플로우
    ```
    ex): SplashVC -> (자동로그인) -> MainFlow
    ```
    ---
    - Case 4: 메인화면에서 토큰만료 또는 로그아웃 버튼에 의해 다시 로그인 화면으로 이동하는 Navigation 플로우
    ```
    ex): MainFlow -> Logout -> LoginVC-> MainFlow
    ```
    - 그외:
        - DeepLink로 네비게이션이 여러 뎁스를 쌓아서 화면 전환이 이루어 지는 경우
        - 여러 뎁스가 쌓인 후(3~4개), 두 단계 이전으로 돌아가야 하는 경우

**대안**

1. Clean Swift가 아닌 MVVM-C를 적용하여 Coordinator가 네비게이션을 관리한다. 
2. OnBoardingFlow, MainFlow, 각각 별도 관리. 전환시 UIWindow에 접근하여 rootViewController를 상황에 따라 갈아끼워주는 방식
    - UIApplication.shared.keyWindow?.rootViewController
3. PopToViewController로 Router에서 특정 VC까지만 pop 되도록 한다. 

**질문**

1. 이런 다양한 플로우를 가지게 될 경우, Clean Swift에서는 네비게이션을 어떻게 관리하실까요? 

2. 아래의 Before 버전에서는 어떻게 navigation을 관리하셨는지 여쭤봐도 될까요? After 버전은 Builder가 아래 참고 프로젝트의 Configurator 역할이지 않을까 생각해봤습니다. 이런 경우는 보통 navigation을 관리를 어떻게 하실까요? 

![스크린샷 2024-05-02 22.31.52](https://hackmd.io/_uploads/B1_CHfZfA.png)

3. 위의 After Version을 제가 생각하는 방식으로 상상해보자면, Builder가 Coordinator처럼 navigationController를 주입받고 Coordinator처럼 스택을 관리하는 걸 생각해봤는데 이런 접근은 Clean Swift가 아닐까요? 

4. 이런 상황에서 어울리는 아키텍처는 무엇이 있을까요? 

5. 대안 2번을 진행하게 될 경우, 특정 case별로 Navigation을 계속 바꿔주는데 이런 방식은 Resource가 너무 크지 않을까 예상했습니다. 그리고 화면 전환을 관리하는 측면에서 어지러운 코드가 만들어질 것 같은데요. 콘은 어떻게 생각하세요?

**NOTE**

> 저희 팀이 진행하는 프로젝트에 적용할 아키텍처를 고려하는 주된 이유 중 하나는 필요한 테스트 시나리오를 보다 심층적으로 고민하고자 하는 욕구 때문입니다.

**참고 자료**

- [Clean Swift](https://clean-swift.com/)
- [당근 테크 블로그 - 실험과 현지화에 흔들리지 않는 모바일 엔지니어링](https://medium.com/daangn/%EC%8B%A4%ED%97%98%EA%B3%BC-%ED%98%84%EC%A7%80%ED%99%94%EC%97%90-%ED%9D%94%EB%93%A4%EB%A6%AC%EC%A7%80-%EC%95%8A%EB%8A%94-%EB%AA%A8%EB%B0%94%EC%9D%BC-%EC%97%94%EC%A7%80%EB%8B%88%EC%96%B4%EB%A7%81-3c648f2ac74)
- [Clean Login](https://github.com/strzempa/CleanLogin-CleanSwiftExample)