๐ŸŽ iOS

[DI] Swinject - ์˜์กด์„ฑ ์ฃผ์ž… ํˆด

gom1n 2024. 11. 17. 19:49

์˜์กด์„ฑ ์ฃผ์ž…์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ •์˜ํ•ด์ฃผ๋Š” Swinject๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ ๋ฐฉ์‹๊ณผ๋Š” ์‚ด์ง ๋‹ค๋ฅด์ฃ . ํ•œ๋ฒˆ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

Why Swinject?

๊ธฐ์กด: ์ˆ˜๋™ ์˜์กด์„ฑ ์ฃผ์ž…

๊ธฐ์กด์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด, ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ์‹œ ์˜์กด์„ฑ์„ ์ฃผ์ž…์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

 

init() {
    self.itemService = ItemServiceImpl()
    self.viewModel = ItemViewModel(itemService: itemService)
    super.init(nibName: nil, bundle: nil)
}

 

Swinject: ์ž๋™ ์˜์กด์„ฑ ์ฃผ์ž…

๊ทธ๋Ÿฌ๋‚˜ Swinject๋ฅผ ์“ฐ๋ฉด, ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import Swinject
let container = Container()
container.register(NetworkService.self) { _ in APIService() }
container.register(DataManager.self) { r in
     DataManager(networkService: r.resolve(NetworkService.self)!)
}
 

 

 

์ค€๋น„๊ณผ์ •

์ฝ”์ฝ”์•„ํŒŸ ๋˜๋Š” SPM ๋“ฑ์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

// Cocoapods
pod 'Swinject'
// SPM
.package(url: "https://github.com/Swinject/Swinject.git", from: "2.8.0")

 

 

Swinject ๊ตฌ์กฐ

์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ด…์‹œ๋‹ค.

 

์ปจํ…Œ์ด๋„ˆ ๊ฐœ์„ค

let container = Container()

 

register: ์˜์กด์„ฑ ๋“ฑ๋ก

container.register(UserService.self) { _ in
    UserServiceImpl()
}

 

์˜์กด์„ฑ ์ฃผ์ž…

container.register(UserViewModel.self) { r in
    let userService = r.resolve(UserService.self)!
    return UserViewModel(userService: userService)
}

 

resolve: ์˜์กด์„ฑ ํ•ด๊ฒฐ

let viewController = UserViewController()
viewController.viewModel = container.resolve(UserViewModel.self)

 

ํ”„๋กœ์ ํŠธ ์ ์šฉ

์œ„์˜ ์ฝ”๋“œ๋“ค์„ ๋‹ค ํ•ฉ์ณ, ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ด…์‹œ๋‹ค.

์šฐ์„  ์•ฑ์˜ ์˜์กด์„ฑ์„ ํ•œ๋ฒˆ์— ๊ด€๋ฆฌํ•˜๋Š” DIContainer๋ผ๋Š” ๋ณ„๋„์˜ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

 

DIContainer

 

์•ฑ์ด ์‹œ์ž‘๋  ๋•Œ, ์ฆ‰ AppDelegate ๋˜๋Š” SceneDelegate์—์„œ ํ˜ธ์ถœํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ํ™”๋ฉด ์ด๋™ ์‹œ์— ํ˜ธ์ถœํ•ด์ค˜๋„ ๋ฉ๋‹ˆ๋‹ค.

 

 

๋ฒˆ์™ธ)

ํด๋ฆฐ ์•„ํ‚คํ…์ณ๋ฅผ ์ง€ํ–ฅํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜์กด์„ฑ์„ ์ฃผ์ž…์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 
 

๊ธฐ๋Œ€ํšจ๊ณผ

  • ์˜์กด์„ฑ ์ฃผ์ž…์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ค‘์•™์—์„œ ๊ด€๋ฆฌ
  • ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ์ดˆ๊ธฐํ™”์˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ
  • ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์œ ์—ฐ์„ฑ ๊ฐœ์„ 
  • ํ…Œ์ŠคํŠธ์™€ ํ™•์žฅ์„ฑ์—๋„ ์œ ๋ฆฌํ•œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณต

 

๊ธฐ์กด์˜ ์˜์กด์„ฑ ์ฃผ์ž… ๋ฐฉ์‹์„ ๋”ฐ๋ผ๋„ ํฐ ๋ฌธ์ œ๋Š” ์—†๋Š”๋ฐ, ๊ทธ๋ƒฅ ์ด๋Ÿฐ ๊ฐœ๋…๋„ ์žˆ๊ตฌ๋‚˜~ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์†”์งํžˆ ์•„์ง๊นŒ์ง€๋Š” ์ด Swinject๋ฅผ ์‚ฌ์šฉํ•จ์— ์žˆ์–ด์„œ ๊ธฐ๋Šฅ๊ฐœ๋ฐœ ์‹œ์—๋Š” ํฌ๊ฒŒ ์ฒด๊ฐ์ด ์•ˆ๋๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ์—๋Š” ํ™•์‹คํžˆ ์ข‹๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.