[DI] Swinject - ์์กด์ฑ ์ฃผ์ ํด
์์กด์ฑ ์ฃผ์ ์ ๊ฐํธํ๊ฒ ์ ์ํด์ฃผ๋ 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๋ฅผ ์ฌ์ฉํจ์ ์์ด์ ๊ธฐ๋ฅ๊ฐ๋ฐ ์์๋ ํฌ๊ฒ ์ฒด๊ฐ์ด ์๋๊ณ , ํ ์คํธ ์ฝ๋ ์์ฑ ์์๋ ํ์คํ ์ข๋ค๊ณ ๋๊ผ์ต๋๋ค.