๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŽ iOS

[Swift] ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฒ• init, property, method

by ํ‹ด๋”” 2022. 5. 5.
728x90
๋ฐ˜์‘ํ˜•

์ด์ „ ํฌ์ŠคํŒ…์—์„œ ์˜์กด์„ฑ(Dependency)์ด ๋ฌด์—‡์ธ์ง€, ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„ ๋ดค์Šต๋‹ˆ๋‹ค! 

์˜ค๋Š˜์€ ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ํฌ์ŠคํŒ…ํ•˜๋ ค๊ณ  ํ•ด์š”.

 

๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ๊ฐ์ฒด๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ ์ฃผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋“ค ๊ฒฝํ—˜ํ•˜์…จ์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฝ์–ด ๋ณด์‹œ๋ฉด ๊ฐ์ด ์žกํž ํ…Œ์ง€๋งŒ ๊ทธ๋ž˜๋„ DI๋ฅผ ๋ณด๊ณ  ์˜ค์‹œ๋ฉด ์ดํ•ด๊ฐ€ ๋” ์‰ฝ๊ฒŒ ์ž˜ ๋  ๊ฑฐ์—์š”! DI์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๋ฉด ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”! 

 

iOS ์•ฑ์„ ๋งŒ๋“ค๋•Œ ์šฐ์„  ๊ฐœ๋ฐœ ์ผ์ •์— ๋งž์ถ”์–ด ์ž‘๋™์ด ๋˜๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜๊ฒ ์ง€๋งŒ, ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ๊ทธ์— ๋”ฐ๋ผ ํ™”๋ฉด์ด ๋งŽ์•„์ง€๋ฉด์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๋ฐ์ดํ„ฐ์™€ ์˜์กด๊ด€๊ณ„๋„ ๋งŽ์•„์ง‘๋‹ˆ๋‹ค. ์ด๋•Œ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข€๋” ํšจ๊ณผ์ ์œผ๋กœ ์˜์กด๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ธด๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ํ™”๋ฉด์ด๋‚˜ ๊ฐ์ฒด๋Š” ์ด์ ์ผ๊นŒ์š”? ๋‹จ์ ์ผ๊นŒ์š”?

 

์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ๋ณด๋ฉด์„œ ์–ด๋–ค ํŠน์ง•์ด ์žˆ๊ณ  ์–ด๋–ค ์ผ์ด ์ผ์–ด ๋‚  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค!


1. Constructor Injection

์šฐ์„  ์ฒซ ๋ฒˆ์งธ "Constructor Injection" ์ž…๋‹ˆ๋‹ค! ์šฉ์–ด๊ฐ€ ์–ด๋ ค์›Œ ๋ณด์ด์ง€๋งŒ ๋ง๊ทธ๋Œ€๋กœ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ์ฃผ์ž…์ด์—์š”

ํ•ญ์ƒ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์€ ์•„๋‹ˆ์ง€๋งŒ, ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ด๋ฉด์„œ๋„ ์ƒ์„ฑ์‹œ ๊ผญ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค!

struct AViewModel { }
struct BViewModel { }

class BViewController: UIViewController {
    let viewModel: BViewModel
    
    init(viewModel: BViewModel) {
        self.viewModel = viewModel
        super.init(nibName: nil, bundle: nil)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
}

์˜ˆ์‹œ ์ฝ”๋“œ์—์„œ BViewController๋Š” BViewModel์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฐ์ฒด๋ฅผ init์—์„œ ์ฃผ์ž…๋ฐ›์•„ ์„ค์ •ํ•ด ์ฃผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์™ธ๋ถ€๋กœ ๋ถ€ํ„ฐ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ด Constructor Injection์ž…๋‹ˆ๋‹ค. 

iOS ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋Š” view Life cycle๊ณผ ๊ด€๋ จ๋œ ๋ฉ”์†Œ๋“œ ์ด์ „์— ์‹คํ–‰๋˜์–ด ๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ด์ „์— ๋ฏธ๋ฆฌ ํ•„์š”ํ•œ ์„ค์ •์„ ํ•ด์ค„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ์— ๊ผญ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    init(viewModel: BViewModel, content: String?) {
        self.viewModel = viewModel
        self.content = content ?? ""
        super.init(nibName: nil, bundle: nil)
    }

๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์•ฝ default๊ฐ€ ์žˆ๋Š” ๊ฐ’์ด๋‚˜ nil ๋“ฑ์˜ ์„ ํƒ ์‚ฌํ•ญ์˜ ๊ฒฝ์šฐ๋Š” ์ด ์˜ˆ์‹œ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” Property Injection์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ์‹œ ๊ตณ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์˜์กด์„ฑ์„ init์—๊ฒŒ ๋ถ€์—ฌํ•  ํ•„์š”๋Š” ์—†๋Š” ๊ฒƒ์ด์ฃ ! 

๋˜ํ•œ ์ˆœํ™˜์ฐธ์กฐ์˜ ๊ฒฝ์šฐ Constructor Injection์„ ์‚ฌ์šฉํ•˜๊ธฐ ํž˜๋“ญ๋‹ˆ๋‹ค 

class A {
    let b: B
    init(b: B) {
        self.b = b
    }
}

class B {
    let a: A
    init(a: A) {
        self.a = a
    }
}

์ด๋Ÿฐ ๊ฒฝ์šฐ B๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด A๊ฐ€ ํ•„์š”ํ•˜๊ณ  A๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด B๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” init ์ •์˜์— ์˜ํ•ด ์ƒ์„ฑ ์ž์ฒด๊ฐ€ ์–ด๋ ค์šฐ๋‹ˆ ์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  iOS ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์ˆœํ™˜์ฐธ์กฐ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ์ฃผ์˜ํ•ด์•ผ ํ•˜๊ณ , ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•๋“ค์ด ๊ณต์œ  ๋˜์–ด ์žˆ์ฃ !


2. Property Injection

Property Injection์€ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. 

struct Lecture { }

class TimeTableViewController: UIViewController {
    var lecture: Lecture?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

class MainViewController: UIViewController {
    func moveToTiemTable() {
    	let timeTableViewController = TimeTableViewController()
        timeTableViewController.lecture = Lecture()
        // ์ƒ๋žต
    }
}

์˜ˆ์‹œ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋ณด์‹œ๋ฉด init์ด ์•„๋‹Œ property๋ฅผ ํ†ตํ•ด์„œ ์˜์กด์„ฑ์„ ์ฃผ์ž…๋ฐ›๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์–ด์š”! ์™œ property Injection์„ ์‚ฌ์šฉํ•  ๊นŒ์š”? ์šฐ์„  ๊ฐ์ฒด์™€ ์˜์กด์„ฑ ์ƒ์„ฑ ์‹œ์ ์„ ์ƒ๊ฐํ•ด ๋ณด๋ฉด ์‰ฌ์›Œ์š”!

 

๊ฐ์ฒด๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•˜๊ณ  ๋‚˜์ค‘์— ์˜์กด์„ฑ์ด ์ƒ์„ฑ๋˜๋Š” ์ƒํ™ฉ์—์„œ Constructor Injection ์„ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ฐ์ฒด๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•  ์ˆ˜๊ฐ€ ์—†๊ฒŒ ๋˜์ฃ ! ์˜์กด์„ฑ ๊นŒ์ง€ ํ•จ๊ป˜ ๋„˜๊ฒจ ์ฃผ์–ด์•ผ ํ•˜๋‹ˆ ์˜์กด์„ฑ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ์ „๊นŒ์ง€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค ๐Ÿฅฒ

๋˜ํ•œ ์„ ํƒ์‚ฌํ•ญ์˜ ์˜์กด์„ฑ์ธ ๊ฒฝ์šฐ init์—์„œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค ์ด๋ ‡๊ฒŒ ์™ธ๋ถ€์—์„œ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

    @objc func fetchLecture() {
        tiemTableViewController.lecture = Lecture()
    }

ํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ ๊ฐ์ฒด์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋‚˜ ์„ค์ •์„ public ์œผ๋กœ ๊ณต์œ ๋˜๋Š” property๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์บก์Šํ™”๊ฐ€ ๊นจ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ์™ธ๋ถ€์—์„œ ์–ผ๋งˆ๋“ ์ง€ ๊ทธ ๊ฐ’์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๊ณ  ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ•จ๊ป˜ ์ผํ•˜๋Š” ๋™๋ฃŒ๊ฐ€ ์›์น˜ ์•Š๊ฒŒ ์ฐธ์กฐํ•˜์—ฌ ๊ทธ ๊ฐ’์„ ์ˆ˜์ •ํ•ด์„œ ๊ผฌ์—ฌ๋ฒ„๋ฆฌ๋Š” ์ผ์ด ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.


3. Method Injection

์ œ๊ฐ€ UITableViewCell์˜ ์†์„ฑ๋“ค์„ ๋„˜๊ฒจ์„œ ํ•œ๋ฒˆ์— UI๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ ๋งŽ์ด ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด์—์š”. public method ์ฆ‰, ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง€๊ณ  dependency ๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. 

class TableViewCell: UITableViewCell {

    @IBOutlet weak var titleLabel: UILabel!

    // MARK: -
    override func awakeFromNib() {
        super.awakeFromNib()
        selectionStyle = .none
    }

    func configuration(title: String) {
        self.titleLabel.text = title
    }

}

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ UITableViewCell์„ ์ƒ์†๋ฐ›๋Š” TableViewCell์„ ์ƒ์„ฑํ•ด ์ฃผ๊ณ  method๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•„์š”ํ•œ ์˜์กด์„ฑ์„ ์„ค์ •ํ•ด ์ค๋‹ˆ๋‹ค.

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        guard let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as? TableViewCell else {
            return UITableViewCell()
        }
        cell.configuration(title: "\(Cell(rawValue: indexPath.row) ?? .total)")
        return cell
    }

cell์„ dequeueํ• ๋•Œ configuration ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด ์ค๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ์œ„์—์„œ ์‚ดํŽด ๋ดค๋˜ property injection๊ณผ ๋™์ผํ•œ ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ ์–ผ๋งˆ๋“ ์ง€ ์ ‘๊ทผํ•˜์—ฌ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


4. Interface Injection

๊ทธ ๋‹ค์Œ์œผ๋กœ๋Š” interface๋ฅผ ์ด์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ถ”ํ›„ ํฌ์ŠคํŒ…์—์„œ ์†Œ๊ฐœํ•ด ๋“œ๋ฆด ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์•ฑ ์•„ํ‚คํ…์ฒ˜์—์„œ๋„ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ˆ ๋ˆˆ์—ฌ๊ฒจ ๋ด์ฃผ์„ธ์š”!!

๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ถ”์ƒํ™”๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ์Šต๋‹ˆ๋‹ค. Swift ์—์„œ๋Š” ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ์ถ”์ƒํ™” ๋ฐฉ๋ฒ•์— Protocol์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

Interface๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๊ธด๋ฐ€ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์˜์กด์„ฑ์ด ์•ฝํ•ด์ ธ ๋ชจ๋“ˆ๊ณผ ๋ชจ๋“ˆ ์‚ฌ์ด์˜ ๊ฒฐํ•ฉ์ด ์ค„์–ด ๋“ญ๋‹ˆ๋‹ค. 

์šฐ์„  ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค~

protocol Networking {
    func fetchData()
}
class UserNetworkManager: Networking {
    func fetchData() {
        print("user data fetched")
    }
}

class PostNetworkManager: Networking {
    func fetchData() {
        print("post data fetched")
    }
}

Networking ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅด๋Š” ๊ฐ์ฒด๋Š” fetchData์™€ ๊ฐ™์€ ํ•„์š”ํ•œ ํ•จ์ˆ˜์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํด๋ž˜์Šค๋Š” ์ž์‹ ์˜ ์šฉ๋„์— ๋งž๊ฒŒ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์–ด์š”! ์—ฌ๊ธฐ ์ฝ”๋“œ๋ฅผ ๋” ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

class MainViewController {
    let networkManager: Networking
    
    init(networkManaer: Networking) {
        self.networkManager = networkManaer
    }
}

MainViewController๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋„คํŠธ์›Œํ‚น์ด ํ•„์š”ํ•œ ํด๋ž˜์Šค ์ž…๋‹ˆ๋‹ค. (์œ„ ์ฝ”๋“œ์—์„œ๋Š” UIViewController ์ƒ์†์€ ์ƒ๋žตํ–ˆ์Šต๋‹ˆ๋‹ค) 

์ด๋•Œ NetworkManager๋ฅผ ์ง์ ‘์ ์œผ๋กœ ๋ฐ›์ง€ ์•Š๊ณ  Networking ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•œ ๋’ค Constructor Injection ์„ ์ด์šฉํ•˜์—ฌ ์ฃผ์ž… ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ ํ•œ๋ฒˆ ๋” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์ •ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

protocol Service {
    func setNetworkManager(networkManager: Networking)
}

class MainViewController: Service {
    var networkManager: Networking?
    
    func setNetworkManager(networkManager: Networking) {
        self.networkManager = networkManager
    }
}

Service ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅด๋Š” ํด๋ž˜์Šค๋Š” ๋„คํŠธ์›Œํ‚น์„ ํ•„์š”๋กœํ•˜๋Š” ํด๋ž˜์Šค์ด๊ณ  Service์—์„œ ์ •์˜ํ•œ ํ•จ์ˆ˜์ธ setNetworkManager๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€์—์„œ Service๋ฅผ ๋”ฐ๋ฅด๋Š” MainViewController๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์ด ๊ฐ์ฒด์˜ networkManager๋ฅผ ์„ค์ •ํ•ด ์ฃผ๊ธฐ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์ •์˜๋œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ์„ค์ •ํ•ด ์ค๋‹ˆ๋‹ค. ์ด๋•Œ networkManager ๋˜ํ•œ ํ”„๋กœํ† ์ฝœ์ธ Networking์œผ๋กœ ์„ค์ •ํ•˜์—ฌ 

ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ช…์‹œํ•˜๊ณ  ์™ธ๋ถ€๋กœ ๋ถ€ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด๋ฅผ ์ฃผ์ž… ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค

 

์ง€๊ธˆ์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋งŽ์€ ํ”„๋กœํ† ์ฝœ์ด ์ƒ์„ฑ๋˜์–ด์•ผ ํ•˜๊ณ  ์ด๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ ์ž‘์„ฑ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜ํ•ด ๊ฐ ์˜์กด๊ด€๊ณ„๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ๊ฒฐํ•ฉ๋„ ์ค„์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์žฌ์‚ฌ์šฉ๊ณผ ํ…Œ์ŠคํŠธ ์ธก๋ฉด์—๋„ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค.

 


์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋‹ค ๋ณด๋ฉด ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์˜์กด์„ฑ์„ ์ •์˜ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ๊ฐ ์ƒํ™ฉ์— ๋งž๋Š” ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ์•Œ์•„๋ณธ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์„ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์„œ ์˜์กด์„ฑ ์„ค์ •ํ•ด ์ฃผ์‹œ๋ฉด ๋ ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค~

 

๋งˆ์ง€๋ง‰์— Interface Injection์— ๋Œ€ํ•ด ์•Œ์•„ ๋ณด์•˜๋Š”๋ฐ์š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด๋ผ๋ฉด ์ž‘์„ฑํ•ด ์ฃผ์ง€ ์•Š์•˜์–ด๋„ ๋ฌ์„ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๊ณ  ์ด๋ฅผ ์ฃผ์ž…ํ•ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ท€์ฐฎ์€ ์ผ์ด ๋  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค ๋”ฐ๋ผ์„œ!

 

๐Ÿ–  ๋‹ค์Œ ๊ธ€์—์„œ๋Š” IoC์™€ ์ด์™€ ๊ด€๋ จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค! 

 

์ฐธ๊ณ  ์‚ฌ์ดํŠธ ๋ฐ ๋„์„œ

https://medium.com/thedevproject/whats-is-dependency-injection-di-how-can-i-use-swinject-framework-to-help-me-on-this-f1ab34ae00a9

https://www.tutorialspoint.com/how-to-implement-dependency-injection-using-interface-based-injection-in-chash

 

๋ฌธ์ œ์‹œ ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€