Coordinator 모듈을 통해 UI 모듈간 순환참조 해결하기
모듈을 분리하면서 화면 이동에 대한 처리가 필요해짐.
기존 구조에서`UI` 모듈끼리 서로의 UI 및 기능이 필요한 경우 모듈간 순환참조가 발생할 수도 있음.
글의 순서
- 완성한 동작 영상
- 문제 상황
- 아이디어 스케치
- Coordinator 모듈 설계하기
- UI 모듈 영역 적용 및 사용
- App 모듈 영역 적용 및 사용
- PresentationView 자세히보기
- NavigationDestinationView 자세히보기
완성한 동작 영상
영상 재현경로 설명
- HomeUI (모듈)
- [present] MultiProfileUI (모듈)
- [navigation] > ProfileEditUI (모듈)
3개의 모듈이 화면전환이 정상적으로 동작함.
문제 상황
예를 들어
- 홈 > 통합검색 > 프로필
- 홈 > 프로필 > 통합검색
이런 경로가 존재한다면 통합검색 UI와 프로필 UI는 서로를 의존해야 함.
즉, 순함참조 문제가 발생할 수 있음.
따라서 모듈화 과정에서 화면을 이동할 수 있는 방법으로 Coordinator 모듈을 만들어서 관리하고자 함.
아이디어 스케치
Coordinator 모듈을 UI 모듈과 앱 모듈에서 의존하게 만들고 App에서 Coordinator를 구현하도록 설계
Coordinator 모듈 설계하기
화면 전환에는 기본적으로 push 방식과 present 2개의 방식이 존재.
Coordinator 인터페이스를 프로토콜로 선언하고, 각 화면 전환 방식에 따라 이동할 수 있는 방법을 enum으로 지정
UI 모듈 영역 적용 및 사용
사용하는 UI 모듈에서 Coordinator모듈의 의존성을 추가한 후, 해당 UI모듈의 Builder 부분인 DependencyInject를 통해서 UI 모듈 주입하기.
사용하는 부분에서는 아래 코드처럼 사용할 수 있음.
App 모듈 영역 적용 및 사용
App모듈에서는 Coordinator를 구현할 것이기 때문에 해당 인터페이스(프로토콜)들을 채택함.
이후 화면전환과 관련한 struct를 만든 후 presentation 및 detination에 따라 경로를 처리할 수 있도록 아래 코드처럼 세팅
이후 프로토콜에 의해 반드시 구현해야 하는 화면전환 메소드를 작성.
실제 적용은 아래 사진의 코드처럼 적용할 수 있음.
PresentationView 자세히보기
present 방식으로 화면전환하는 코드를 구현하고 있음.
home만 예시로 들자면 아래 사진처럼 구현되어 있음.
여기서 주목할 점은 MultiProfileBuilder에서도 체인 형식으로 presnet와 navigation을 처리할 수 있다는 것임.
주의할 점.
- present: binding을 하나의 값으로 관리하여 B > C로 이동해야 할 경우
- 문제 상황: A > B > C로 진행되어야 하지만 B가 닫히고 C가 열리는 문제 발생
- navigation: present된 View보다 뒤에 navgiation이 동작할 수 있음.
- 문제 상황: navigation의 다른 뷰에서 나타남.
NavigationDestintationView 자세히보기
구조는 present와 동일하게 되어있음.
다만, destination을 받아야 하기 때문에 함수로 구현되어 있음.
'iOS프로젝트 > Funch(넥스터즈)' 카테고리의 다른 글
Dependency Container 만들기 (0) | 2024.09.29 |
---|---|
SwiftUI 하위뷰에서 상위뷰로 DelegatePattern을 활용해 이벤트 전달하기 (0) | 2024.09.29 |
모듈화 리팩토링 과정에서 고민했던 것들 (2) | 2024.09.24 |
SwiftUI 화면 dismiss 상황에서 흰 화면 나타나는 문제 (1) | 2024.09.22 |
Swift Concurrency를 적용하면서 발생한 동시성 문제 (0) | 2024.09.20 |