Book_Kitty - Coordinator(01)
โ Introduce
๊ธฐ์กด MVVM ํจํด์์๋ ViewController๊ฐ ํ๋ฉด ์ ํ(Navigatoin) ๋ก์ง์ ๋ด๋นํ๊ฒ ๋๋ฉด์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์์์ต๋๋ค.
- ๋จ์ผ ์ฑ ์ ์์น(SRP) ์๋ฐ โ ํ๋ฉด ์ ํ ๋ก์ง์ด ViewController์ ํฌํจ๋๋ฉฐ, UI์ฒ๋ฆฌ์ ํ๋ฉด ์ ํ์ด๋ผ๋ ๋ ๊ฐ์ง ์ฑ ์์ ๊ฐ์ง๊ฒ ๋จ.
- ๋์ ๊ฒฐํฉ๋ โ ViewController๊ฐ ์ง์ ์ ์ผ๋ก ํ๋ฉด ์ ํ์ ์ฒ๋ฆฌํ๋ฉด, ์์กด์ฑ์ด ๊ฐํด์ ธ ํ ์คํธ๊ฐ ์ด๋ ต๊ณ ์ฌ์ฌ์ฉ์ฑ์ด ๋ฎ์์ง.
์๋ ์ฝ๋๋ ViewController์์ ๋ณดํธ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํ๋ฉด ์ ํ ๋ก์ง์ ๋๋ค.
class HomeViewController: UIViewController {
// ...
func navigateToDetail() {
let detailVC = DetailViewController()
navigationController?.pushViewController(detailVC, animated: true)
}
}
ํด๋น ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด HomeViewController๊ฐ DetailViewController๋ฅผ ์ง์ ์์ฑํ๊ณ ๋ค๋น๊ฒ์ด์ ๋ก์ง์ ์ํํ๊ณ ์์ต๋๋ค. ์ด๋ HomeViewController์ DetailViewController ๊ฐ ๊ฐํ ๊ฒฐํฉ์ด ๋ฐ์ํฉ๋๋ค.
๋ํ DeatilViewController๊ฐ ๋ณ๊ฒฝ๋๋ฉด HomeViewController์ ์ฝ๋๋ ์์ ํด์ผ ํ๋ฏ๋ก ์ ์ง ๋ณด์์ฑ์ด ๋จ์ด์ง๊ณ , ๋ค๋ฅธ ํ๋ฉด์ผ๋ก ์ด๋ํด์ผ ํ ๊ฒฝ์ฐ, navigateToDetail() ๋ฉ์๋๋ฅผ ๊ณ์ํด์ ์์ ํด์ผ ํฉ๋๋ค.
๐ค Why?
๋จ์ํ ํ๋ฉด ์ ํ ๋ก์ง์ ์ํด Coordinator๋ฅผ ์ถ๊ฐ๋ก ๊ตฌํํด์ผ ํ๋ ๋ถ๋ด, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ฒ์ ์ ํ๋ ํ์๋ค์ ๋ฌ๋ ์ปค๋ธ ๋ฑ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
ํ์ง๋ง, MVVM๋ง์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ์ ๋ ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ViewController์ ์ญํ ์ด ๋น๋ํด์ง๊ณ , ํ๋ฉด ์ด๋ ํ๋ฆ์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ฌ๋ ค์์ง ๊ฐ๋ฅ์ฑ์ด ๋์์ต๋๋ค.
๋น์ฅ์ ์์ ๋ถํธํจ ๋๋ฌธ์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ํฌ๊ธฐํ ์ ์์๊ธฐ ๋๋ฌธ์, ํ๋ฉด ์ ํ์ ๋ณด๋ค ์ผ๊ด๋๊ณ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ViewController๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ฉด์๋ ์ ์ฐํ ์ค๊ณ๋ฅผ ์ง์ํ๋ Coordinator ํจํด์ ๋์ ํ๊ฒ ๋์์ต๋๋ค.
๐์ค๊ณ

์ ๊ทธ๋ฆผ์ Book_Kitty ํ๋ก์ ํธ์ MVVM ๊ตฌ์กฐ์์ Coordinator๋ฅผ ์ ์ฉํ MVVM-C ์ํคํ ์ฒ ๋ชจ์๋์ ๋๋ค.
View๋ ViewModel์ ์์กดํ๋ฉฐ, View์์ ๋ฐ์ํ ์ฌ์ฉ์ ์ก์ ์ ViewModel์ Input ์คํธ๋ฆผ์ ํตํด ViewModel ๋ด์์ ๋ฐฉ์ถ๋ฉ๋๋ค.
Coordinator๋ ํ๋ฉด ์ด๋์ ๊ด๋ฆฌํ๊ธฐ ์ํด ViewModel์ ์์กดํ์ฌ View๋ก๋ถํฐ ์ ๋ฌ๋์ ViewModel์์ ๋ฐฉ์ถ๋ ์ฌ์ฉ์ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ธ๋ฉ ํฉ๋๋ค.
- BookKitty ํ๋ก์ ํธ์์๋ โRxSwift ๊ธฐ๋ฐ์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ํ์ฉํ์ฌ, ViewModel์ด Coordinator์ ์ง์ ์์กดํ์ง ์๋๋ก ์ค๊ณํ์ต๋๋คโ.
- ๋์ , ViewModel์์ ํ๋ฉด ์ ํ ์ด๋ฒคํธ๋ฅผ ๋ฐฉ์ถํ๋ Relay๋ฅผ ์ ์ธํ๊ณ Coordinator๊ฐ ์ด Relay๋ฅผ ๊ตฌ๋ ํ์ฌ ํ๋ฉด ์ ํ์ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ์ค๊ณํ์ต๋๋ค.
- ์์๊ฐ์ ์ค๊ณ๋ฅผ ํตํด ViewModel๊ณผ Coordinator์ ๊ฒฐํฉ๋๋ ๊ฐ์์ํค๊ณ RxSwift ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์์ฐ์ค๋ฌ์ด ์ฐ๊ฒฐ์ ๊ตฌํํ์ต๋๋ค.
๐ท ํ๋กํ ์ฝ
Coordinator ํ๋กํ ์ฝ์ ์ ์ํ ์ด์ ๋ ์ผ๊ด๋ ์ํคํ ์ฒ๋ฅผ ์ ์งํ๋ฉด์ ํ๋ฉด ์ ํ ๋ก์ง์ ๋ถ๋ฆฌํ๊ณ , ์ ์ฐํ ํ์ฅ์ฑ์ ์ ๊ณตํ๊ธฐ ์ํจ์ ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ Coordinator๊ฐ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์ํ๋๋ก ๋ณด์ฅํ๊ณ , ์๋ก์ด ํ๋ฉด ํ๋ฆ์ด ํ์ํ ๋ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.
protocol Coordinator: AnyObject {
// ...
var finishDelegate: CoordinatorFinishDelegate? { get set }
var childCoordinators: [Coordinator] { get set }
func start()
func finish()
}
childCoordinators
Coordinator ํจํด์ ํ์ฉํ๋ค ๋ณด๋ฉด, ํ๋์ ํ๋ฉด ํ๋ฆ๋ง ๊ด๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ ์ฌ๋ฌ ๊ฐ์ ํ๋ฉด ํ๋ฆ์ ๊ด๋ฆฌํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์ด๋, ๋ถ๋ชจ Coordinator๊ฐ ์์ Coordinator๋ฅผ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๊ฐ ํ์ํ๋ฐ, ์ด๋ฅผ ์ํด childCoordinators๋ฅผ ํ์ฉํ์ต๋๋ค.
์ฑ์ด ์ปค์ง์๋ก ๋จ์ผ Coordinator๋ก ๋ชจ๋ ํ๋ฉด ์ ํ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋นํจ์จ์ ์ ๋๋ค. ๋ฐ๋ผ์ ๊ฐ ํ๋ฆ์ ๋ด๋นํ๋ Coordinator๋ฅผ ๋ณ๋๋ก ๋ง๋ค๊ณ ๋ถ๋ชจ Coordinator๊ฐ ์ด๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด ๋ ์ ์ฐํ๋ค ํ๋จํ์ต๋๋ค.
์ด๋ฅผ ์ํด ๋ถ๋ชจ Coordinator๋ ์์ Coordinator๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ childCoordintors ๋ฐฐ์ด์ ์ ์ฅํ์ฌ ๊ด๋ฆฌํฉ๋๋ค. ๋ํ, ์์ Coordinator๊ฐ ์ข ๋ฃ๋๋ฉด ๋ฐฐ์ด์์ ์ ๊ฑฐํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
func start()
start() ๋ฉ์๋๋ Coordinator์ ์คํ์ ์์ํ๋ ๋ฉ์๋ ์ ๋๋ค. ํน์ ํ๋ฉด์ ์์ฑํ๊ณ , navigationController์ pushํ์ฌ ํ๋ฉด์ ํ์ํ๋ ์ญํ ์ ํฉ๋๋ค.
func finish()
extension Coordinator {
func finish() {
childCoordinators.removeAll()
finishDelegate?.coordinatorDidFinish(childCoordinator: self)
}
}
finish() ๋ฉ์๋๋ ํ์ฌ Coordinator๊ฐ ์ข ๋ฃ๋ ๋, ์์ Coordinator๋ฅผ ๋ชจ๋ ์ ๋ฆฌํ๊ณ ๋ถ๋ชจ์๊ฒ ์ข ๋ฃ๋ฅผ ์๋ฆฌ๋ ์ญํ ์ ํฉ๋๋ค.
finishDelegate
protocol CoordinatorFinishDelegate: AnyObject {
func coordinatorDidFinish(childCoordinator: Coordinator)
}
finishDelegate๋ Coordinator๊ฐ ์์ ์ ์ญํ ์ ๋ง์น ํ, ๋ถ๋ชจ Coordinator์๊ฒ ์ด๋ฅผ ์๋ฆฌ๋ ์ญํ ์ ์ํํ๋ Delegate์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ถ๋ชจ Coordinator๋ ํน์ Coordinator์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋๋ฌ์์ ๊ฐ์งํ๊ณ ์ ์ ํ ์ ๋ฆฌ ์์ ์ ์ํํฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
Book_Kitty ํ๋ก์ ํธ์์๋ MVVM-C ์ํคํ ์ฒ์ RxSwift ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๊ฒฐํฉํ์ฌ ๋ณด๋ค ์ ์ฐํ๊ณ ํ์ฅ์ฑ ๋์ ํ๋ฉด ์ ํ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ์ต๋๋ค.
์ด๋ฌํ ์ค๊ณ๋ฅผ ํตํด ๋๊ท๋ชจ ํ๋ก์ ํธ์์๋ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ด ๋ฐ์ด๋ ํ๋ฉด ์ ํ ํ๋ฆ์ ๊ตฌ์ถํ ์ ์๊ฒ ๋์์ต๋๋ค.