Published on

๐ŸŽ Swift - ์ฝ”๋””๋„ค์ดํ„ฐ ํŒจํ„ด ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ธฐ

Authors
  • avatar
    Name
    ์ด์ฐฝ์ค€
    Twitter

MusicSpot์€ ๊ฐ ํ™”๋ฉด์„ Feature ๋‹จ์œ„์˜ ํŒจํ‚ค์ง€๋กœ ๋ณ„๋„๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ฆ๋ถ„ ๋นŒ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.
  2. ๊ฐ Feature๋งˆ๋‹ค ๋ณ„๋„์˜ ๋ฐ๋ชจ ์•ฑ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์žฅ์ ์˜ ๊ฒฝ์šฐ ์‚ฌ์‹ค์€ ์ €ํฌ๊ฐ€ ์ฒด๊ฐํ•˜์ง€๋Š” ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๊ทœ๋ชจ ์•ฑ์— ์–ด์šธ๋ฆฌ๋Š” ๊ตฌ์กฐ์ธ๋งŒํผ, ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์•„์ฃผ ์ž‘์€ ์ €ํฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋Š๋ผ๊ธฐ ํž˜๋“  ์žฅ์ ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ์žฅ์ ์ด ์ €ํฌ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ํ˜„์žฌ ํ™˜๊ฒฝ์—์„œ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ์ด์ ์ด๋ผ๊ณ  ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์ด๋Ÿฐ ์žฅ์ ๋“ค์— ๋”ฐ๋ผ ๋‹จ์ ๋„ ๋‹น์—ฐํ•˜๊ฒŒ ํ•จ๊ป˜ ๋”ฐ๋ผ์˜ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ตœ์ข…์ ์ธ ์•ฑ ํƒ€๊ฒŸ ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ฐ Feature ํŒจํ‚ค์ง€๋“ค์„ ์˜์กดํ•˜๊ณ  ์ด๋“ค์„ ์—ฐ๊ฒฐ์‹œ์ผœ์ฃผ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ธ๋ฐ์š”..

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ™”๋ฉด๋“ค์„ ๊ด€๋ฆฌํ•˜๊ณ  ๊ทธ ์‚ฌ์ด์—์„œ ํ™”๋ฉด ์ „ํ™˜์„ ๋‹ด๋‹นํ•˜๋Š” ๋กœ์ง์„ ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

Coordinator ํŒจํ„ด

Coordinator ํŒจํ„ด์ด๋ž€?

Coordinator ํŒจํ„ด์„ ์„ ํƒํ•˜๊ฒŒ ๋œ ๊ฒƒ์€ ๋ฐ˜๊ฐ•์ œ์ ์ด์˜€์Šต๋‹ˆ๋‹ค.

๋•Œ๋ฌธ์— ์ด ํŒจํ„ด์ด ์™œ ๋“ฑ์žฅํ–ˆ๊ณ , ์™œ ํ•„์š”ํ–ˆ๋˜ ๊ฑด์ง€ ๊ณ ๋ฏผํ•ด๋ณด์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ์š”.. ์ด๊ฒƒ๋ถ€ํ„ฐ ์•Œ์•„๋ด์•ผ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

// ViewController.swift
let vc = SearchViewController()
self.navigationController?.pushViewController(vc, animated: true)

iOS์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ํ™”๋ฉด ์ „ํ™˜ ๋กœ์ง์ž…๋‹ˆ๋‹ค.

ViewController ์ธ์Šคํ„ด์Šค๋ฅผ "์ƒ์„ฑ" ํ•˜๊ณ  ์žˆ์„์ง€ ์—†์„์ง€ ๋ชจ๋ฅด๋Š” NavigationController์—๊ฒŒ push ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

์ด ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ ๋“ค์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Navigation Stack์— ์ถ”๊ฐ€ํ•  ViewController๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•˜๊ณ , ์‹ฌ์ง€์–ด ์ง์ ‘ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  2. ํ•ด๋‹น ๋กœ์ง์„ ๋ชจ๋“  ํ™”๋ฉด์—์„œ ๊ฐ๊ธฐ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•ด์ค€ ๋’ค ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰, ์žฌ์‚ฌ์šฉ๋˜๊ธฐ ์–ด๋ ต๋‹ค.

์ธ์Šคํ„ด์Šค ์ง์ ‘ ์ƒ์„ฑ ๋ฌธ์ œ

๊ธฐ๋ณธ์ ์ธ ๋ฐฉ์‹๋Œ€๋กœ AViewController์—์„œ BViewController๋กœ ํ™”๋ฉด ์ „ํ™˜์„ ํ•˜๋ ค๋ฉด A๊ฐ€ B๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ๋ง์€, A๊ฐ€ B์— ๊ฐ•ํ•˜๊ฒŒ ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์ €ํฌ ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ ๋ชจ๋“ˆ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด์š”?

ํ˜น์€ MVVM ๊ตฌ์กฐ๋ฅผ ์ ์šฉํ–ˆ๋Š”๋ฐ, BViewController์— ์ฃผ์ž…ํ•ด์•ผ ํ•  ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด์š”?

let serviceA = ServiceA()
let serviceB = ServiceB()
let viewModel = BViewModel(
  serviceA: serviceA,
  serviceB: serviceB
)

let vc = BViewController(
  viewModel: viewModel,
  isCompleted: true
)

View์™€ ๊ด€๋ จ๋œ ๋กœ์ง๋งŒ์„ ๋‹ด๊ณ  ์‹ถ์—ˆ๋˜ ViewController๊ฐ€ ๊ฒฐ๊ตญ์—๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์•Œ์•„์•ผ ํ•˜๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

UseCase์™€ Repository๋ฅผ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ๊ณผ ๊ฐ™์ด ์ด ์ƒ์„ฑ๊ณผ ํ™”๋ฉด ์ „ํ™˜์— ๋Œ€ํ•œ ๋กœ์ง์„ ๋‹ค๋ฅธ ๋ ˆ์ด์–ด์— "์œ„์ž„" ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ •๋ง ์ข‹๊ฒ ์ฃ ?

AViewController๊ฐ€ BViewController์— ๋Œ€ํ•ด ๋ชฐ๋ผ๋„ ๋˜๋‹ˆ ๋…๋ฆฝ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ , UI์™€ ๊ด€๋ จ๋œ ๋กœ์ง๋งŒ์„ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์„ํ…Œ๋‹ˆ๊นŒ์š”.

์žฌ์‚ฌ์šฉ์„ฑ ๋ฌธ์ œ

์—ฌ๊ธฐ AViewController์™€ BViewController๊ฐ€ ์ •ํ™•ํžˆ ๊ฐ™์€ ๋กœ์ง์„ ํ†ตํ•ด CViewController๋ฅผ ์ƒ์„ฑํ•˜๊ณ  pushํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๋‹จ์ˆœํžˆ ๋‘ ๊ฐœ์˜ ๋ทฐ์ปจ๋งŒ ๋‚˜์—ดํ–ˆ์ง€๋งŒ, ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ƒํ™ฉ์—์„œ๋„ ๊ฐ™์€ ํ˜•ํƒœ์˜ ํ™”๋ฉด ์ „ํ™˜ ๋กœ์ง์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ฐธ ๋งŽ์Šต๋‹ˆ๋‹ค.

์ธ์Šคํƒ€๊ทธ๋žจ์˜ ๊ฒฝ์šฐ๋ฅผ ๋ณด๋”๋ผ๋„ ๊ฒŒ์‹œ๋ฌผ, ์Šคํ† ๋ฆฌ, ํŒ”๋กœ์ž‰, ๊ฒ€์ƒ‰ ๋“ฑ ์•„์ฃผ ๋‹ค์–‘ํ•œ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์œ ์ €์˜ ํ”„๋กœํ•„ ํ™”๋ฉด์œผ๋กœ ์ง„์ž…ํ•  ์ˆ˜ ์žˆ์ฃ .

๊ทธ๋Ÿฐ๋ฐ ์ด๋ ‡๊ฒŒ ์ค‘๋ณต๋˜๋Š” ๋™์ž‘์„ ๋‹ด๋‹นํ•˜๋Š” ํ•˜๋‚˜์˜ ๊ณ„์ธต์„ ๋งŒ๋“ ๋‹ค๋ฉด ์žฌ์‚ฌ์šฉ์„ฑ์— ์•„์ฃผ ๋„์›€์ด ๋˜๊ฒ ์ฃ ?

๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ˜„์žฌ A, B ๋“ฑ ๋‹ค์–‘ํ•œ ๋ทฐ์ปจ์—์„œ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ํ™”๋ฉด ์ „ํ™˜ ๋กœ์ง์˜ ์ฑ…์ž„์„ ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ๊ณ„์ธต์— "์œ„์ž„" ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ™”๋ฉด ์ „ํ™˜์˜ ์ฑ…์ž„์„ ๊ฐ๊ฐ์˜ ViewController ๋“ค์—์„œ Navigator (๊ฐ€์นญ) ๊ณ„์ธต์œผ๋กœ ์˜ฎ๊น€์œผ๋กœ์จ ์–ด๋–ค ViewController๊ฐ€ ์š”์ฒญํ–ˆ๋Š”์ง€๋Š” ์ƒ๊ด€์—†์ด ๊ณตํ†ต๋œ ๋กœ์ง์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋˜๋Š” ๊ฒƒ์ด์ฃ .


์ด ๋‘ ๋ฌธ์ œ๋Š” ๋ณ„๋„๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•˜๋‚˜์˜ ๊ณตํ†ต์ ์„ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ "์œ„์ž„" ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  iOS ๊ฐœ๋ฐœ์—์„œ ์ด ์œ„์ž„์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋Š” Delegate ํŒจํ„ด์ด๋ผ๋Š” ์•„์ฃผ ๋ณดํŽธ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ์ด ์ฑ…์ž„์„ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์•„์ฃผ ๋งŽ์€ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ๊ฒ ์ง€๋งŒ, ๊ทธ ์ค‘ ๊ฐ€์žฅ ์ž๋ฃŒ๊ฐ€ ๋งŽ์€ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ Coordinator ํŒจํ„ด์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ Coordinator ํŒจํ„ด์€ ํ™”๋ฉด ์ „ํ™˜์— ํŠนํ™”๋œ Delegate ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.

Coordinator ์‚ฌ์šฉํ•˜๊ธฐ

์ด์ œ Coordinator ํŒจํ„ด์ด Delegate ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋ผ๋Š” ๋Š๋‚Œ์„ ์œ ๋…ํ•ด๊ฐ€๋ฉฐ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Coordinator ํŒจํ„ด์„ ์ฒ˜์Œ ์ดํ•ดํ•  ๋•Œ๋Š” ๊ฐ ViewController๋งˆ๋‹ค ํ•˜๋‚˜์˜ Coordinator๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ํŽธํ•ฉ๋‹ˆ๋‹ค.

๋‹น์—ฐํ•˜๊ฒŒ๋„ ๋งค๋ฒˆ ๊ทธ๋ ‡์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ณต๋˜๋Š” ํ™”๋ฉด ์ „ํ™˜์˜ ํ๋ฆ„์ด ์žˆ๋‹ค๋ฉด, ์ด๋ฅผ Flow๋ผ๋Š” ๋‹จ์œ„๋กœ ์ •์˜ํ•˜๊ณ  Coordinator๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด HomeViewController์—์„œ SearchViewController๋กœ์˜ ์ „ํ™˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. HomeViewController์˜ Coordinator์ธ HomeCoordinator์˜ ํ™”๋ฉด ์ „ํ™˜์„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
  2. HomeCoordinator๋Š” SearchViewController์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ์žˆ๋Š” SearchCoordinator๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. SearchCoordinator์—๊ฒŒ SearchViewController ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ๊ณผ push ๋กœ์ง์˜ ์‹คํ–‰์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  4. SearchCoordinator๊ฐ€ SearchViewController๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Navigation Stack์— pushํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ํ๋ฆ„์€ ์—ฌ๊ธฐ์—์„œ ํฌ๊ฒŒ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ViewController๋Š” ์ž์‹ ์„ ์ƒ์„ฑํ•œ(๊ด€๋ฆฌํ•˜๋Š”) Coordinator์—๊ฒŒ ํ™”๋ฉด ์ „ํ™˜์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ํ•ด๋‹น Coordinator๋Š” ๋‹ค๋ฅธ Coordinator๋ฅผ start() ์‹œํ‚ค๊ฑฐ๋‚˜ Flow ํ๋ฆ„์— ๋”ฐ๋ผ ViewController๋ฅผ Navigation Stack์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

protocol Coordinator: AnyObject {
  var navigationController: UINavigationController { get set }
  var childCoordinators: [Coordinator] { get set }
  var finishDelegate: CoordinatorFinishDelegate? { get set }
  func start()
  func finish()
}

๊ทธ๋ฆฌ๊ณ  ์œ„ ์˜ˆ์‹œ๊ฐ€ ์ด ํ๋ฆ„์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ํ˜•ํƒœ์˜ Protocol์ž…๋‹ˆ๋‹ค.

AppCoordinator

Coordinator ํŒจํ„ด์€ childCoordinators ๋ฐฐ์—ด๋กœ ํ•˜์œ„ Coordinator๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ผ์ข…์˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋ง์€ ๊ณง, ์ตœ์ƒ๋‹จ์˜ ๋ฟŒ๋ฆฌ๊ฐ€ ํ•˜๋‚˜ ์žˆ์–ด์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์ด ๋ฟŒ๋ฆฌ๊ฐ€ ๋ฐ”๋กœ AppCoordinator์ž…๋‹ˆ๋‹ค.

์ด AppCoordinator๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๋ฉฐ ๋Œ€๋žต์ ์ธ Coordinator์˜ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ด…์‹œ๋‹ค.

var window: UIWindow?
var appCoordinator: AppCoordinator?

func scene(_ scene: UIScene,
		   willConnectTo _: UISceneSession,
		   options _: UIScene.ConnectionOptions) {
  guard let windowScene = (scene as? UIWindowScene) else { return }
  let window = UIWindow(windowScene: windowScene)
  defer { self.window = window }

  let navigationController = UINavigationController()
  self.appCoordinator = AppCoordinator(navigationController: navigationController)

  window.rootViewController = navigationController
  window.makeKeyAndVisible()

  self.appCoordinator?.start() // โœ…
}

์ด๋ ‡๊ฒŒ UINavigationController๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด Coordinator์— ์ „๋‹ฌํ•ด์ฃผ๋Š” ์‹์œผ๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Coordinator์˜ start() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ๋‹ด๋‹นํ•˜๋Š” ViewController๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋™ํ•˜๋Š” ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ์™ธ Coordinator

// HomeCoordinator.swift
func startSearch() {
  let searchCoordinator = SearchCoordinator(navigationController: self.navigationController)
  searchCoordinator.finishDelegate = self // 1๏ธโƒฃ
  self.childCoordinators.append(searchCoordinator) // 2๏ธโƒฃ
  searchCoordinator.start() // 3๏ธโƒฃ
}

๋‹ค๋ฅธ Coordinator๋ฅผ ์ƒ์„ฑํ•˜๊ณ  start() ํ•ด์ฃผ๋Š” ๊ณผ์ •์€ ์œ„ ๊ณผ์ •์—์„œ ํฌ๊ฒŒ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1๏ธโƒฃ ์ƒ์„ฑ๋œ Coordinator์˜ ์ƒ์œ„ Coordinator๊ฐ€ ๋ณธ์ธ์ž„์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด Delegate ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„์— finish()๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ƒ์„ฑ๋œ Coordinator๋ฅผ ์ƒ์œ„ Coordinator์—์„œ ์ฐธ์กฐํ•จ์œผ๋กœ์จ ARC๊ฐ€ ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ์‹œํ‚ค์ง€ ์•Š๋„๋ก ์œ ์ง€ํ•ด์ค๋‹ˆ๋‹ค.

3๏ธโƒฃ ์ƒ์„ฑ๋œ Coordinator์˜ start ๋กœ์ง์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ finish() ํ•ด์ฃผ๋Š” ๊ณผ์ •์€ CoordinatorFinishDelegate๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

extension Coordinator {
  func finish() {
    self.childCoordinators.removeAll() // 1๏ธโƒฃ
    self.finishDelegate?.shouldFinish(childCoordinator: self) // 2๏ธโƒฃ
  }
}

1๏ธโƒฃ ํ•˜์œ„ Coordinator๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ์‹œ์ผœ์ฃผ๊ธฐ ์œ„ํ•ด childCoordinators ๋ฐฐ์—ด์„ ๋น„์›Œ์ค๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ƒ์œ„ Coordinator์—๊ฒŒ Delegate ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด ์ข…๋ฃŒ ์š”์ฒญ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์ด๋ ‡๊ฒŒ ๋ฐ˜๊ฐ•์ œ(?)๋กœ Coordinator์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ƒ๊ฐํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ์Šต๋‹ˆ๋‹ค.

๋ฌด์—‡๋ณด๋‹ค ์ค‘์š”ํ•œ ๊ฒƒ์€ "Coordinator ํŒจํ„ด์€ ํ™”๋ฉด ์ „ํ™˜ ๋กœ์ง์˜ ์ฑ…์ž„ ๋ถ„๋ฆฌ๋ฅผ ์œ„ํ•œ Delegate ํŒจํ„ด์˜ ์ผ์ข…์ด๋‹ค." ๋ผ๋Š” ์‚ฌ์‹ค์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ๋ง ๊ทธ๋Œ€๋กœ ํŒจํ„ด์ผ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •๋‹ต ๋˜ํ•œ ์—†๋Š” ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์ด ํฌ์ŠคํŠธ์—์„œ๋Š” Delegate ํŒจํ„ด์„ ์‚ฌ์šฉํ•ด finish์— ๋Œ€ํ•œ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ด์คฌ๋Š”๋ฐ, RxSwift๋‚˜ Combine๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ˜ํ† ๋ง ์‹œ๊ฐ„์— Coordinator ํŒจํ„ด์˜ ๋‹จ์  ๋˜ํ•œ ๋ช…ํ™•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ๋ฏผ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•ด์ฃผ์…จ๋Š”๋ฐ, ์ด ๋‹จ์ ์„ ์•„์ง ์ฒด๊ฐํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง์ ‘ ๋‹ค์‹œ ์„ฌ์„ธํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋ณด๋ฉฐ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ๋„ค์š” ๐Ÿ˜Š

์ฐธ๊ณ  ๋ฌธ์„œ

RxFlow

ZeddiOS - Coordinator Pattern

ํ™”๋ฉด ์ „ํ™˜์„ ํ•ด๊ฒฐํ•ด ์ค€ Coordinator ํŒจํ„ด

๋ฉ”์ดํŠธ๋Ÿฌ๋„ˆ: ์ฝ”๋””๋„ค์ดํ„ฐ ํŒจํ„ด ์ ์šฉ๊ธฐ