Bibi's DevLog ๐ค๐
[iOS] Coordinator (1) - ์ฝ๋๋ค์ดํฐ๋ ๋ฌด์์ธ๊ฐ? ๊ฐ๋ ์ดํดํ๊ธฐ ๋ณธ๋ฌธ
[iOS] Coordinator (1) - ์ฝ๋๋ค์ดํฐ๋ ๋ฌด์์ธ๊ฐ? ๊ฐ๋ ์ดํดํ๊ธฐ
๋น๋น bibi 2022. 11. 25. 01:11โ๏ธ ์ด ๊ธ์ ์๋ฆฌ์ฆ๋ ์๋์ ์ธ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํด ์์ฑ๋์์ต๋๋ค.
โ๏ธ ์๋์ ๋ ๋ฌธ์๋ ์กฐ์ ํ๊ฒ๋๋ง ๋ฒ์ญ์ ํด ๋์์ผ๋ ํน์ ํ์ํ์ ๋ถ ์ฐธ๊ณ ํ์ธ์.
- How to use the coordinator pattern in iOS apps ํด์ ๋ฐ ์ ๋ฆฌ
- Advanced coordinators in iOS ํด์ ๋ฐ ์ ๋ฆฌ
โ๏ธ ๋ค์ ํธ์ธ (2) - ์ฝ๋๋ค์ดํฐ ๊ตฌํํ๊ธฐ ๋ ์ฌ๊ธฐ ์ ์์ต๋๋ค.
โ๏ธ ๋ ธ์ ์ด ๋ ํธํ์๋ค๋ฉด ์ฌ๊ธฐ์ 1,2ํธ ํตํฉ๋ณธ ๋ฅผ ํ์ธํด ์ฃผ์ธ์.
Coordinator (์ฝ๋๋ค์ดํฐ)๋?
Coordinator๋ coordinate(์กฐ์ ํ๋ค)๋ผ๋ ๋์ฌ์ ์๋ฏธ๋ฅผ ๋ด๊ณ ์์ต๋๋ค.
์ฝ๋๋ค์ดํฐ๋ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ค์ ๋ชจ์ผ๊ณ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ ๊ฐ์ฒด์ ๋๋ค.
์ฝ๋๋ค์ดํฐ ํจํด์ ์ฑ์ flow ๊ด๋ฆฌ๋ฅผ ์ฝ๊ฒ ํด ์ฃผ๊ณ , massive view controller๋ฅผ ๊ฐ๋ณ๊ฒ ํด ์ฃผ๋ ํจํด์ ๋๋ค.
Coordinator๋ฅผ ์ ์ฌ์ฉํ๋๊ฐ?
iOS ๊ฐ๋ฐ์๋ผ๋ฉด ์ฌ๋ฌ ๋ฒ ์์ฑํ์ ์ฝ๋๋ฅผ ๋จผ์ ์ดํด๋ด ์๋ค.
// HomeViewController.swift
func loginButtonTapped() {
let vc = LoginViewController()
vc.title = "Login"
navigationController?.pushViewController(vc, animated: true)
}
ํ ํ๋ฉด์์ ๋ก๊ทธ์ธ ๋ฒํผ์ด ๋๋ฆฌ๋ฉด, ๋ก๊ทธ์ธ ํ๋ฉด์ผ๋ก ์ ํํ๋ ๋์์ ์ํํ๋ ๊ฐ๋จํ ์ฝ๋์ ๋๋ค.
- ํ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ๋ก๊ทธ์ธ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ..
- ์์ฑํ๊ณ (
LoginViewController()
), - ๊ตฌ์ฑํ๊ณ (
vc.title = "Login"
), - ํ์ํ๊ณ (
navigationController?.pushViewController(vc, animated: true)
) ์์ต๋๋ค.
- ์์ฑํ๊ณ (
์ ์ฝ๋์ ๋ฌธ์ ์
์์ ๊ฐ์ ์ฝ๋๋ ๋ทฐ ์ปจํธ๋กค๋ฌ ๊ฐ์ ๊ฐํ ๊ฒฐํฉ์ ํ์ฑํ๋ค๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
- ๋ทฐ ์ปจํธ๋กค๋ฌ ๊ฐ์ ์ฐ๊ฒฐ์ ํ๋์ฝ๋ฉํ๋ค.
- ์ด๋ค ๋ทฐ๊ฐ ์ด๋ค ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ๋์์ง ๊ฒ์ธ์ง ์ผ์ผ์ด ์ฐพ์ ๋ณด์์ผ ํฉ๋๋ค.
- ๋ทฐ ์ปจํธ๋กค๋ฌ ์ฌ์ฌ์ฉ์ด ์ด๋ ต๋ค.
- ๊ฐ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ๋ ํ์ํ ๋ ๋ง๋ค ์์ ๊ฐ์ ์์ฑ, ๊ตฌ์ฑ, ํ์ ๊ณผ์ ์ ๋ฐ๋ณตํด์ผ ํฉ๋๋ค.
- ์ฝ๋ ๋ณต์ฌ๋ถ์ฌ๋ฃ๊ธฐ๊ฐ ์ผ์ด๋๊ธฐ ์ฌ์ด ํ๊ฒฝ์ ๋๋ค.
- ํ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์์ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ ๊ทผ ํ ์ง์ํ๊ณ ์๋ค.
- ์ ์์๋ก ์ค๋ช ํ์๋ฉด, HomeViewController๊ฐ ์์ ์ ์์ ๋ทฐ ์ปจํธ๋กค๋ฌ์ธ navigationController์๊ฒ LoginViewController๋ฅผ ํ์ํ๋ผ๊ณ (push)ํ๊ณ ์์ต๋๋ค.
- ์์ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ํ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ด๋ฆฌํด์ผ ํ๋๋ฐ, ์ด์๋ ๋ฐ๋๋ก ํ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์์ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ ๊ทผ ๋ฐ ์ง์ํด์ผ๋ง ํ๋ ์ํฉ์ ๋ฐ๋์งํ์ง ์๋ค๊ณ ํ ์ ์์ต๋๋ค.
Coordinator ํจํด์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ํ์ต๋๋ค.
Coordinator์ ์ฅ์
- ๋ทฐ ์ปจํธ๋กค๋ฌ๋ค์ ์ฐ๊ฒฐ์ ๋๋๋ค.
- ๊ฐ๊ฐ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์์ ์ ์ ํ ํ๋ฆ์ ์์ง ๋ชปํ๊ฒ ํ๋ค.
- ์ฑ์ ํ๋ฆ(flow)์ ์ ์ดํ๋ค.
- flow logic์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ก๋ถํฐ ๋ถ๋ฆฌํ๋ค.
- ์ฝ๋๋ค์ดํฐ๊ฐ flow logic์ ๊ด๋ฆฌํ๋ฉฐ, ๋ทฐ๋ ์ฝ๋๋ค์ดํฐ๋ฅผ ํตํด์๋ง ์ํตํ๋ค.
- ํ๋ฉด ์์๊ฐ ๋ฐ๋๋๋ผ๋ ์ฝ๋๋ค์ดํฐ๋ง ํ์ธํ๋ฉด ๋๋ฏ๋ก ์์ ์ด ์ฉ์ดํ๋ค.
- ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ โ๋ทฐ์ ๋ชจ๋ธ ๋ฐ์ธ๋ฉโ์ด๋ผ๋ ๋ชฉํ์๋ง ์ง์คํ ์ ์๊ฒ ํด ์ค๋ค.
- ๋ทฐ ์ปจํธ๋กค๋ฌ ์ฌ์ฌ์ฉ์ด ์ฉ์ดํ๋ค.
- ์ด๋ค ๋ทฐ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณต์ ์ผ๋ก ํ์ํ๋ฉด ์ฌ๋ฌ ๋ฒ ์์ฑํ๋ ๋์ ์ฝ๋๋ค์ดํฐ์ ๋์ผ ๋ฉ์๋๋ฅผ ๋ฐ๋ณต ํธ์ถํ๋ฉด ๋๋ค.
- ๋ทฐ ์ปจํธ๋กค๋ฌ ์์ฑ ์ฝ๋๊ฐ ํ๋ก์ ํธ ์ฌ๊ธฐ์ ๊ธฐ์ ๋จ๋ฐ๋๋ ๊ฒ์ ๋ง์ ์ ์๋ค.
- ์ฑ์ ๋์์ด ํฌ๋ช
ํด์ง๋ค.
- UIViewController๋
viewDidLoad()
์ ๊ฐ์ด UIKit์ผ๋ก๋ถํฐ ํธ์ถ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ฑฐ๋, ์ ํด์ง ํ๋ฆ์ ๋ฐ๋ผ์ผ ํ๋ค. - ๋ฐ๋ฉด ์ฝ๋๋ค์ดํฐ๋ ๊ฐ๋ฐ์๊ฐ ์์ ํ ์ ์ดํ ์ ์๋ ๊ฐ์ฒด๋ก, ๊ด๋ฆฌ๊ฐ ์๋์ ์ผ๋ก ์ฝ๋ค.
- UIViewController๋
Coordinator ์ ๊ตฌ์กฐ์ ๋์
์ฑ์ ๊ท๋ชจ๊ฐ ์์ ๊ฒฝ์ฐ ์ฝ๋๋ค์ดํฐ 1๊ฐ๋ง์ผ๋ก๋ ๋ทฐ์ปจํธ๋กค๋ฌ๋ค์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
์ฑ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ์ ์์ ์ฝ๋๋ค์ดํฐ๋ก ์ญํ ์ ๋ถ๋ฆฌํ ์ ์์ต๋๋ค.
โ ์ด ๊ธ์์๋ ์ฑ์ ํฌ๊ธฐ๊ฐ ํฌ๋ค๊ณ ๊ฐ์ ํ๊ณ , ๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ(AppCoordinator)์ ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ๋ ํจํด์ ์ค๋ช ํฉ๋๋ค.
AppCoordinator (๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ / ์์ ์ฝ๋๋ค์ดํฐ)
๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ. ์ฝ๋๋ค์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ฝ๋๋ค์ดํฐ.
- ์ฑ์ ์ ์ฒด ํ๋ฆ์ ๊ด๋ฆฌํ๋ ์์ ์์ค์ ์ฝ๋๋ค์ดํฐ์ด๋ค.
- ํ๋ฉด์ ์ ํํ๋ ๋ฉ์๋๋ค์ ๊ฐ์ง๊ณ ์๋ค.
- ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ค.
- ์์ ์ฝ๋๋ค์ดํฐ๋ก๋ถํฐ ํ๋ฆ ์ ํ์ ๋ํ ์์ฒญ์ ๋ฐ์ผ๋ฉด, ๋ค๋ฅธ ๊ณณ์ผ๋ก ํ๋ฆ์ ์ด์ด ์ค๋ค.
AppCoordinator? MainCoordinator?
- ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ MainCoordinator๋ผ๊ณ ํ๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค. ์์ ์ฝ๋๋ค์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด๋ ๊ฒ ์ด๋ฆ์ ๋ถ์ด๋ ๊ฒ ๊ฐ์ต๋๋ค.
- ์ฝ๋๋ค์ดํฐ ํจํด์ ๋ง๋ Khanlow์ ๋ธ๋ก๊ทธ์์, ์์ ์ฝ๋๋ค์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์์ ์ฝ๋๋ค์ดํฐ๋ฅผ AppCoordinator๋ผ๊ณ ์ง์นญํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด ๊ธ์์ ๊ทธ๋ฌํ ๊ฒฝ์ฐ๋ฅผ ๋ค๋ฃจ๊ณ ์์ผ๋ฏ๋ก AppCoordinator๋ผ๊ณ ํํํ๊ฒ ์ต๋๋ค.
Child Cooridnators (์์ ์ฝ๋๋ค์ดํฐ / ํ์ ์ฝ๋๋ค์ดํฐ)
- ์์ ์ฝ๋๋ค์ดํฐ๋ค์ ๊ฐ๊ฐ ๋ค๋ฅธ ๊ธฐ๋ฅ๊ณผ ์ฑ
์์ ๋งก๋๋ค.
- ์ฑ์ ๊ธฐ๋ฅ์ ์๊ฒ ๋๋์ด ์ฌ์ฌ์ฉ์ด ์ฌ์์ง๋ค.
- ์์ ์ด ๋ด๋นํ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ๊ณ ํ๋ฆ์ ๊ด๋ฆฌํ๋ค.
- ๋ณดํต ์์ ์ด ๋ด๋นํ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ด๋ฆ์ ๋ฐ์ ์ฝ๋๋ค์ดํฐ ์ด๋ฆ์ ์ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
- ex.
HomeViewController
โHomeCoordinator
๊ฐ ๊ด๋ฆฌ
- ์์ ์ ํ๋ฆ์ด ๋๋ฌ์ ๋, ๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ์๊ฒ ์ด๋ฅผ ์๋ฆฐ๋ค.
Coordinator ์ฌ์ฉ ์ ํ ๋น๊ต
๋ํ๋ก ๊ฐ๋จํ ๊ทธ๋ ค๋ณด์๋ฉด ์ฝ๋๋ค์ดํฐ ์ฌ์ฉ ์ ๊ณผ ํ๋ ๋ค์๊ณผ ๊ฐ์ด ๋น๊ตํ ์ ์์ต๋๋ค.
ํ ํ๋ฉด, ๋ก๊ทธ์ธ ํ๋ฉด, ๋ง์ดํ์ด์ง ํ๋ฉด์ด ์๋ ๊ฐ๋จํ ์ฑ์ ์๊ฐํด ๋ด ์๋ค.
์ฝ๋๋ค์ดํฐ ์ฌ์ฉ ์
์ฌ๋ฌ ๊ฐ์ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ค ์ฌ์ด์ ์ง์ ์ ์ธ ์ฐ๊ฒฐ์ด ์กด์ฌํ๋ ๋ชจ์ต์ ๋๋ค.
- ๋ก๊ทธ์ธ ํ๋ฉด์์ โํโ๋ฒํผ์ ๋๋ ์ ๋, ํ ํ๋ฉด์ ๋์์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
- LoginViewController์์ ํ ๋ฒํผ์ ๋๋ ์ ๋ ํจ์๊ฐ ํธ์ถ๋๊ณ ,
- ๊ทธ ํจ์์์ HomeViewController๋ฅผ ์์ฑ ํ pushํด์ผ ํ ๊ฒ์ ๋๋ค.
- ์ด๋ฒ์ ๋ง์ดํ์ด์ง ํ๋ฉด์์๋ โํโ๋ฒํผ์ ๋๋ ์ ๋, ํ ํ๋ฉด์ ๋์์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค.
- MyPageViewController์์๋ ํ ๋ฒํผ์ ๋๋ ์ ๋ ํจ์๊ฐ ํธ์ถ๋๊ณ ,
- ๊ทธ ํจ์์์ HomeViewController๋ฅผ ์์ฑ ํ pushํด์ผ ํ ๊ฒ์ ๋๋ค.
์ด์ฒ๋ผ ํ๋ฉด์ด 3๊ฐ๋ฐ์ ์๋ ๊ฐ๋จํ ์ํฉ์ธ๋ฐ๋ HomeViewController๋ฅผ ์์ฑํ๋ ์ฝ๋๊ฐ ๋ ๊ตฐ๋ฐ๋ ์๊ธฐ๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ ๋ค๋ฅธ ํ๋ฉด์ด ๋ ์ถ๊ฐ๋๊ณ , ๊ทธ ํ๋ฉด์์ ํ ํ๋ฉด์ผ๋ก ๋์๊ฐ์ผ ํ ๋๋ ์ค๋ณต ์ฝ๋๊ฐ ๊ณ์ํด์ ์๊ธฐ๊ฒ ๋ฉ๋๋ค.
์ฝ๋๋ค์ดํฐ ์ฌ์ฉ ํ
์ฝ๋๋ค์ดํฐ ํจํด์ ์ ์ฉํ ํ์ ๋ชจ์ต์ ๋๋ค.
- ๋จผ์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ โ๋ทฐ ์ปจํธ๋กค๋ฌ๋ค ๊ฐ์ ์ฐ๊ฒฐโ ์ด ์์ด์ง ๊ฒ์
๋๋ค.
- ์ฝ๋๋ค์ดํฐ๊ฐ ์์ ๋๋ ์๊ธฐ๋ค๋ผ๋ฆฌ ๋ฌด๋ถ๋ณํ๊ฒ ์ํตํ๋ ๋ทฐ์ปจํธ๋กค๋ฌ๋ค์ด ์ด์ ์์ ์ ์ ์ฉ ์ฝ๋๋ค์ดํฐ๋ฅผ ํตํด์๋ง ์ํตํ๊ณ ์์ต๋๋ค.
- ๊ฐ ๊ฐ์ฒด์ ์ํต ๋์๊ณผ ๋ฐฉ์์ด ์ ํด์ ธ ์์ต๋๋ค.
- ์ต์์ ์ฝ๋๋ค์ดํฐ(=๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ)๋ ์์ ์ฝ๋๋ค์ดํฐ๋ค์, ์์ ์ฝ๋๋ค์ดํฐ๋ค์ ๋ทฐ์ปจํธ๋กค๋ฌ๋ค์ ๊ด๋ฆฌํฉ๋๋ค.
- ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ์์ ์ ์ฝ๋๋ค์ดํฐ(์์ ์ฝ๋๋ค์ดํฐ)์ ์ํตํฉ๋๋ค.
- ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ด๋น ์ฝ๋๋ค์ดํฐ๋ฅผ ํตํด ์์ฑํด์ผ๋ง ํ๋ฉฐ, ์ฝ๋๋ค์ดํฐ ์ด์ธ์ ์ง์ ์์ ์์ฑ๋์ด์๋ ์ ๋ฉ๋๋ค.
- ์์ ์ฝ๋๋ค์ดํฐ๋ค์ ๋ถ๋ชจ ์ฝ๋๋ค์ดํฐ์ ์ง์๋ฅผ ๋ฐ์ ๋ด๋น ๋ทฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๋ค์ ํธ์์๋ ์ค์ ์ฝ๋์ ํจ๊ป ์ฝ๋๋ค์ดํฐ ํจํด์ ๊ตฌํํด ๋ด ๋๋ค.