iOS/Swift

[Swift] ์ž˜๋ชป๋œ Coordinator ์‚ฌ์šฉ ๊ทธ๋ฆฌ๊ณ  ๋ฆฌํŒฉํ† ๋ง

๊ฒฝํ‘ธ 2024. 1. 16. 10:00
๋ฐ˜์‘ํ˜•

์•ž์„œ ํฌ์ŠคํŒ…ํ•œ ๊ธ€ ์ค‘์— Coordinator๋ฅผ ์‚ฌ์šฉํ•œ ํ›„๊ธฐ๊ฐ€ ์žˆ๋‹ค.

๋๋งบ์Œ์—

์•„๋ฌด๋ž˜๋„ ์ง€๊ธˆ๊นŒ์ง€ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ ์—ˆ์—ˆ๋Š”๋ฐ 

ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฑฐ์˜ ๋๋‚˜๊ฐ€๋ฉด์„œ ๋ฆฌํŒฉํ† ๋ง์„ ์‹œ์ž‘ํ–ˆ๋‹ค.

 

[๋””์ž์ธ ํŒจํ„ด] Coordinator๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ(feat.MVVM-C)

์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ Coordinator ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์†Œ๊ฐœํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ ์ค‘์ธ๋ฐ Coordinator ์‚ฌ์šฉ์— ์žˆ์–ด ๋ญ”๊ฐ€ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜์–ด

pooh-footprints.tistory.com

์œ„์˜ ํฌ์ŠคํŒ…์ฒ˜๋Ÿผ MVVM + CleanArchitecture๋ฅผ ์ ์šฉํ•˜๋ฉด์„œ ํ•จ๊ป˜ Coordinator๋ฅผ ์ ์šฉํ–ˆ์—ˆ๋‹ค.

๋‹น์‹œ์—๋Š” ViewModel์˜ ์ƒ์„ฑ์ž์— Coordinator๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ 

ํ•ด๋‹น ViewModel์—์„œ Coordinator์— ์ง์ ‘ ์ ‘๊ทผํ•ด ํ™”๋ฉด์ „ํ™˜์„ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

1. ์ƒ์„ฑ์ž๋กœ ์ž…๋ ฅ๋ฐ›์„ ์‹œ์— Coordinator ํ”„๋กœํ† ์ฝœ์„ ๋ฐ›์•„์•ผ๋งŒ ํ•˜๊ณ , ์ดํ›„ ํƒ€์ž…(์—ด๊ฑฐํ˜•)์— ์ ‘๊ทผํ•ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Coordinator์— ๋Œ€์ž…ํ•ด์•ผ ํ•œ๋‹ค.

2. ์œ„์˜ ๋ฌธ์ œ๋กœ ์ธํ•ด ํŠน์ •ํ•œ ๋ทฐ์™€ ๋ทฐ๋ชจ๋ธ์ด ๋‹ค๋ฅธ Coordinator์—์„œ ๋™์ž‘ํ•  ๋•Œ, Coordinator๊ฐ€ ์–ด๋–ค Coordinator์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ™”๋ฉด์ „ํ™˜์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

3. ๋„ˆ๋ฌด๋‚˜ ๋ฐฉ๋Œ€ํ•œ ํ™”๋ฉด์ „ํ™˜ ์ฝ”๋“œ๊ฐ€ ๊ตฌ๋ถ„์ด ๋˜์ง€ ์•Š๊ณ  ๋™์ž‘ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ฝ”๋“œ ์ˆ˜์ •์— ์–ด๋ ค์›€์ด ์ƒ๊ธด๋‹ค.

์˜ˆ์‹œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

func showNotificationController() {
    if coordinator?.type == .home {
        (coordinator as? HomeCoordinator)?.showNotificationController()
    } else {
        (coordinator as? CommunityCoordinator)?.showNotificationController()
    }
}

ํŠน์ •ํ•œ ๋ทฐ๋ชจ๋ธ์—์„œ NotificationController๋กœ ํ‘ธ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ ์˜ˆ์‹œ์ด๋‹ค.

๋งํ•œ ๊ฒƒ์ฒ˜๋Ÿผ

์ƒ์„ฑ์ž๋กœ Coordinator๋ฅผ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ „์— ์ •์˜ํ•ด ๋‘” ์—ด๊ฑฐํ˜•์„ ํ†ตํ•ด ์–ด๋–ค Coordinator์ธ์ง€ ํ™•์ธํ•˜๊ณ  ํ™”๋ฉด์ „ํ™˜์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

์ด์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ Delegate ํŒจํ„ด์„ ๋„์ž…ํ•ด ํ•ด๊ฒฐํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

1. ์ƒ์„ฑ์ž์—๋Š” Coordinator๊ฐ€ ์•„๋‹ˆ๋ผ delegate ํ”„๋กœํ† ์ฝœ ๋ฐ›๊ธฐ

2. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ™”๋ฉด์ „ํ™˜ ์‹œ ํƒ€์ž…์„ ํ™•์ธํ•  ํ•„์š” ์—†๋‹ค.

3. ๋ฐฉ๋Œ€ํ•œ ์ฝ”๋“œ ๋ฌธ์ œ๋Š” ์—ฌ์ „ํ•˜์ง€๋งŒ ๊ตฌ๋ถ„์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. extension์„ ํ†ตํ•ด Coordinator ๋‚ด๋ถ€์—์„œ ํŠน์ •ํ•œ ViewModel์˜ ์ƒ์„ฑ์ž์ธ delegate๋ฅผ ์ฑ„ํƒํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ตœ์†Œํ•œ์˜ ๊ตฌ๋ถ„์€ ๊ฐ€๋Šฅํ•ด์ง€๋ฉฐ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ์ฝ”๋“œ ์ˆ˜์ •์— ๋„์›€์ด ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์ˆ˜์ •ํ•œ ์ฝ”๋“œ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// Protocol

protocol NotificationViewDelegate {
    func showNotificationViewController()
}

// Coordinator

extension HomeCoordinator: NotificationViewDelegate {
    func showNotificationViewController() {
    	...
    }
}

// ViewModel

init(..., delegate: NotificationViewDelegate) {
    self.delegate = delegate
}

func showNotificationViewController() {
    delegate?.showNotificationViewController()
}

์ด๋ ‡๊ฒŒ ๋ฆฌํŒฉํ† ๋ง์„ ์šฐ์„ ์ ์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๋”๋ผ๋„ ๋ฌธ์ œ๊ฐ€ ๋‚จ์•„์žˆ๋‹ค.

์—ฌ๋Ÿฌ Coordinator์—์„œ ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜๋Š” ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

๋˜, ์ด์™€ ๋ณ„๊ฐœ๋กœ Coordinator์—์„œ ์ƒ์„ฑ๋˜๋Š” ์ธ์Šคํ„ด์Šค๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š๊ณ  ๋ˆ„์ ๋˜๋Š” ์ด์Šˆ๋„ ์žˆ๋‹ค.

์•„๋ฌด๋ž˜๋„ ์˜์กด์„ฑ ์ฃผ์ž…๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ๊ฐ€ ์—†๊ธฐ๋„ ํ•˜๊ณ , repository, usecase ๋“ฑ์„ ์ง์ ‘ Coordinator์—์„œ ์ƒ์„ฑํ•ด ์ฃผ์ž…ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

์ด ๋‘ ๋ฌธ์ œ๋ฅผ ๊ฐ™์ด ํ•ด๊ฒฐํ•  ์•„์ด๋””์–ด๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋ฆฌํŒฉํ† ๋งํ•˜๊ณ , ํฌ์ŠคํŒ…ํ•ด์•ผ๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•