-
[iOS] Dependency Injection (์์กด์ฑ ์ฃผ์ ) ์ด๋?iOS/๐ค App 2021. 6. 20. 16:48
1์ฐจ ์์ : 21.08.11
2์ฐจ ์์ : 21.09.27
์๋ ํ์ธ์ ๐ถ
์ด๋ฒ ์๊ฐ์๋ ํํ DI ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์์กด์ฑ ์ฃผ์ ์ ๋ํ์ฌ ์์๋ณด๊ฒ ์ต๋๋ค.
๊ทธ๋ผ ํ๋์ฉ ์์๋ณผ๊ฒ์!!!๐ฅ๐ฅ๐ฅ
Dependency Injection means giving an objects its instance variable.
Really. That's it - James Shore
์ ๋ฌธ์ฅ์ ์์กด์ฑ ์ฃผ์ ์ ๋ํด ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ๋ช ๋ฃํ๊ฒ ์ค๋ช ํ๊ณ ์์ต๋๋ค.
์ด ๊ฐ๋ ์ ์ค๋ช ํ ๋ ์์ฃผ ๋ฑ์ฅํ๋ ์ธ์ฉ๋ฌธ์ธ ๊ฒ ๊ฐ์์!
Dependency Injection ์
A ๋ผ๋ ๊ฐ์ฒด์ ์์ฑ์ A๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์ด๊ธฐํํด์ฃผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ ์ค์ค๋ก ํ์ง ์๊ณ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํตํด์ ์ด๊ธฐํํด์ผ๋ง ํ ๊น์??
๊ฒฐ๋ก ๋ถํฐ ์ดํด๋ณด์๋ฉด:
๊ฐ์ฒด๊ฐ ๊ฒฐํฉ์ ๋์จํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
์์ ๊ฐ์ ์๋ฏธ์ง๋ง, ์ข ๋ ๋ณ๊ฒฝ์ ์ ์ฐํด์ง๊ณ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ์ฝ๋๊ฐ ๋ ์ ์์ต๋๋ค.
์ฃผ์ ๋ฐ๋ ์์ฑ์ ํ์ ์ ํ๋กํ ์ฝ๋ก ๋ง๋ค์ด์ฃผ๋ฉด ํ ์คํธ๊ฐ ์ฉ์ดํด์ง๊ณ , ์๋๊ฐ ๋ช ํํ ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ฐ์ ๋จ์ด๋ค์ ์ ์๋ถํฐ ํ๋ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค!!!
์์กด์ฑ?
DI ์ D ๋ Dependency, ์ฆ ์์กด์ฑ์ ๊ฐ๋ฆฌํต๋๋ค.
์์กด์ฑ์ UML ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ ์์กด๊ด๊ณ๋ฅผ ์๊ฐํ๋ฉด ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.์์กด ๊ด๊ณ๋ ํ ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ ๋ฐ์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด A ๋ผ๋ ํด๋์ค๊ฐ ์ฐ์ฐ์ B๋ผ๋ ํด๋์ค์ ๊ธฐ๋ฅ (๋ฉ์๋) ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด
A๋ B์ ์์กด๊ด๊ณ๊ฐ ์์ผ๋ฉฐ, ์์กด์ฑ์ด ์๊ฒผ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.class A { func hasDependency() -> Int { return B.default.someFunction() // B ํด๋์ค์ ์ฑ๊ธํค์ ์ฌ์ฉํ์๋ค๊ณ ๊ฐ์ ํ์์ต๋๋ค. } // A ํด๋์ค์ ๋ฉ์๋์ ๋ฐํ๊ฐ์ด B ํด๋์ค ๋ฉ์๋์ ๋ฐํ๊ฐ์ ๋ฐ๋ผ ๋ฐ๋๋ฏ๋ก ์์กดํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค. }
์ ๊น, ๊ธ์ด์ด๋ ์์ง ๊ถ๊ธํ ์ ์ด ์์ต๋๋ค ๐ค
>> ์ด ๋ถ๋ถ์ ์์กด์ฑ ์ฃผ์ ์ ์ฒ์ ๊ณต๋ถํ์๋ ๋ถ์ด๋ฉด ๋์ด๊ฐ๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. <<
๋๋ณด๊ธฐ์ ์ฝ๋์๋ ์ํํธ์จ์ด ๊ณตํ์ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์์ ํํ๋๋
'์์กด ๊ด๊ณ (dependency) '๊ฐ ์ ํํ๊ฒ ๋ง์ต๋๋ค.
์ฌ์ฉํ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ์ง์ ์์ ํ๊ณ ์์ง ์๊ณ ,
๋ฉ์๋ ๋ด๋ถ์์์ ๊ฐ์ด ์งง์ ์๊ฐ๋์๋ง ๊ด๊ณ๊ฐ ์ ์ง๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ถ์ฒ : ์ด๋ค ๋์๋ฅผ ๊ณต๋ถํ ๋ ์์ ๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
ํ์ง๋ง ์์กด์ฑ ์ฃผ์ ์์๋ ์์ฑ ์ฃผ์ ์ด๋ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ณ์๋ ์์์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
์ด๋ฐ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์์๋ '์ฐ๊ด ๊ด๊ณ (association)' ๋ก ํํํ๊ฑฐ๋ ์??
๊ทธ๋์ ์ ์ฐ๊ด์ฑ ์ฃผ์ ์ด ์๋๋ผ ์์กด์ฑ ์ฃผ์ ์ธ์ง ํ๋์ ๊ณ ๋ฏผํ์๋๋ฐ,
๊ทธ๋ฅ ์ฐ๊ด์ฑ์ด๋ผ๋ ๋จ์ด๋ฅผ
ํด๋์ค ๋ค์ด์ด๊ทธ๋จ์ด๋ผ๋ ์์ญ์์๋ง ์ฌ์ฉํ๊ธฐ๋กํ ์ฉ์ด๋ก ์๊ฐํ๊ธฐ๋ก ํ์์ต๋๋ค.
(๊ฒฐ๋ก : ๋๋ฆ ํด๊ฒฐํจ)
์ ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ๊ฐ?
์์กด์ฑ์ ํ ํด๋์ค๊ฐ ๋ค๋ฅธ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ค๊ณ ์์์ ๋ง์๋๋ ธ๋๋ฐ์.
๊ทธ๋ฌ๋ฉด ๋ค๋ฅธ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ด ์์๊น์?
์๋์์๋ A ํด๋์ค๊ฐ B ํด๋์ค์ ์์กด์ฑ์ด ์๊ธฐ๋ ๊ฒฝ์ฐ๋ก ๊ฐ์ ํด์ ๊ธ์ ์ฐ๊ฒ ์ต๋๋ค.
๊ฐ์ฅ ๋ํ์ ์ธ ์ธ ๊ฐ์ง๋ฅผ ๋์ดํด๋ณด์๋ฉด
1. B ํด๋์ค์ ์ฑ๊ธํค์ ์ด์ฉํ๋ค
2. ์ธ์คํด์ค ๋ณ์ ํน์ ์์๋ก B ํด๋์ค์ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๋ค
3. ๋ฉ์๋์ ์ ๋ฌ์ธ์๋ก ์ฐธ์กฐ๋ฅผ ์ ๋ฌ๋ฐ๋๋ค
์ ์ธ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ํ๋์ฉ ์ดํด๋ณด๋ ค๊ณ ํฉ๋๋ค๐
์ด ๋, ๋จ์ํ ์์กด์ฑ์ด ์๊ธฐ๋ ๊ฒ๊ณผ ์์กด์ฑ์ ์ฃผ์ ํ๋ ๊ฒ์ ๊ตฌ๋ณํด์ผ ํ๋ค๋์ ์ ๊ธฐ์ตํด์ฃผ์ธ์!
1. B ํด๋์ค์ ์ฑ๊ธํค์ ์ด์ฉํ ๋ ์์กด์ฑ์ด ์๊ธด๋ค.
class A { func hasDependency() -> Int { return B.default.func() // B ํด๋์ค์ ์ฑ๊ธํค์ ์ฌ์ฉํ์๋ค๊ณ ๊ฐ์ ํ์์ต๋๋ค. } }
์ฐ์ ์ฑ๊ธํค์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ์์กด์ฑ ์ฃผ์ ์ ํฌํจ๋์ง ์์ต๋๋ค.
๋ค๋ฅธ ํด๋์ค์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ๊ฐ์ฅ ํธํ ๋ฐฉ๋ฒ์ด์ง๋ง ํฐ ๋จ์ ์ด ์์ต๋๋ค.
๋ฐ๋ก Testable ํ์ง ์๋ค๋ ๊ฒ์ ๋๋ค.
A๋ฅผ ๊ธฐ๋ฅ์ Test ํ๋ ค๋ฉด ์ ๋๋ก ์ด๊ธฐํ๋ B๊ฐ ํ์์ ์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ํํธ์จ์ด ๊ณตํ์์๋ ํญ์ ์ค๊ณํ ๋ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ , ์์ง๋๋ฅผ ๋์ด๋ผ๋ ๋ง์ ์์ฃผ ๋ณด๊ฒ ๋๋๋ฐ์.
์ด๋ ๋ฏ ์ฑ๊ธํค ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ฝ๋์ ๊ฒฐํฉ๋๊ฐ ๋์์ง๊ณ , ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๊ฐ ๋ฉ๋๋ค.
:: ์ด๋ฐ ์ด์ ๋๋ฌธ์ ์ฑ๊ธํค์ ์ํฐํจํด์ด๋ผ๊ณ ํํํ๋ ๋ถ๋ค๋ ์์ต๋๋ค. ํญ์ Controversy ํ Topic ์ธ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ A ํด๋์ค๊ฐ ์์กด์ฑ์ด ์๋์ง ํ์ธํ๋ ค๋ฉด
A์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํ์ด๋ด์ผํ๊ธฐ ๋๋ฌธ์ ์ ์ง ๋ณด์๋ ํ๋ค๊ฒ ๋ค์!!
2. ์ธ์คํด์ค ๋ณ์ ํน์ ์์๋ก B ํด๋์ค์ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๋ค.
2๋ฒ ๋ฐฉ๋ฒ์ ๋ค์ ๋ ๊ฐ์ง๋ก ๋๋ ์ ์์ต๋๋ค.
2-1. A ํด๋์ค๊ฐ B ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ง์ ์์ฑํ๋คclass A { private let b = B() }
A ํด๋์ค ๊ฐ B ํด๋์ค์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ง์ ๊ด๋ฆฌํ๊ฒ ๋๋ ํจํด์ ๋๋ค.
๊ทธ๋ฐ๋ฐ A ๊ฐ B ์ ์ด๊ธฐํ ๋ฐฉ๋ฒ ๊น์ง ์ ํ์๊ฐ ์์๊น์?
๋จ์ผ ์ฑ ์ ์์น๊ณผ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ์ ์ด๊ธ๋๋ ์ค๊ณ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์๋์ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
2-2. B ํด๋์ค๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ , ์ธ๋ถ์์ ์ ๋ฌํด์ค๋ค
๊ทธ๋ฐ๋ฐ 2-2 ๋ฐฉ๋ฒ์๋ ๋ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์กด์ฑ ์ฃผ์ ์ด๋ผ๊ณ ๊ฐ๋ฆฌํต๋๋ค.2-2-1. ์ด๊ธฐํ ์์ ์ ์ ๋ฌํ๋ค
class A { private let b: B init(b: B) { self.b = b } }
์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ด๊ธฐํ ์์ ์ A ํด๋์ค๊ฐ ์ด๋ค ํด๋์ค์ ์์กด์ฑ์ด ์๋์ง ๋ช ํํ๊ฒ ์ ์ ์๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ํ B ํด๋์ค ์ค๋ธ์ ํธ ์์ฑ์ ๊ด์ฌํ์ง ์์ผ๋, ๊ฒฐํฉ๋๊ฐ ์ค์ด๋ค๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก SRP ์ ๋ ๋ถํฉํ๊ฒ ๋ฉ๋๋ค.
๋ถ๊ฐ์ ์ธ ์ฅ์ ์ผ๋ก๋ ์ด๊ธฐํ ์์ ์ ์ ๋ฌํ๋ฏ๋ก ์์ฑ์ด ํญ์ ์กด์ฌํจ์ ๋ณด์ฅํ ์ ์๊ณ ,
( ์ด๊ธฐํ ์คํจ์ ์ธ์คํด์ค๋ ์์ฑ๋์ง ์์ผ๋ฏ๋ก )
๊ทธ ์ด์ ๋๋ฌธ์ Optional ๋ก ๋ํํ์ง ์์๋ ๋๋ค๋ ์ ์ด ์์ต๋๋ค.
ํ๋กํ ์ฝ ๋๋๋ฅ์ฅ :
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์ค์ํํธ์ ํ๋กํ ์ฝ ์งํฅ ๊ฐ๋ ์ ์ถ๊ฐํ๋ฉด, ๋ ๋ฉ์ง๊ฒ ๋์ํ๋ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.protocol Bable { func test() -> Int } class A { private let b: Bable init(b: Bable) { self.b = b } }
์ ์ฝ๋์์์ฒ๋ผ ์ธ์คํด์ค ์์๋ฅผ B ํ์ ์ผ๋ก ์ ์ธํ๋ ๋์ ,
B ์๊ฒ์ ํ์ํ ๊ธฐ๋ฅ๋ค๋ง์ ์๊ตฌ์ฌํญ์ผ๋ก ๊ฐ๋ Babel ํ๋กํ ์ฝ ํ์ ์ผ๋ก ๋ฐ์ผ๋ฉด, ๊ตฌํ์ด ํจ์ฌ ๋ ์์ ๋ก์์ง๋๋ค.
์๊ตฌ์ฌํญ๋ง ์ถฉ์กฑํ๋ ํ์ ์ด๋ผ๋ฉด ์ด๋ค ํด๋์ค๋ ๋ฃ์ ์ ์๊ฒ ๋๋๊น์.
๋ํ B์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋๊ฒ์ด ์๋๋ผ ํ๋กํ ์ฝ์ ํตํด ์ ํ๋ ๊ธฐ๋ฅ๋ง ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก,
๋ถํ์ํ ์ฝ๋ ํ์ฅ์ด ์์ด์ง๋๋ค.
๋ง์ง๋ง์ผ๋ก ํ ์คํธ ์ธก๋ฉด์์
Bable ํ๋กํ ์ฝ์ ์ฑํํ ์์์ Mock ๊ฐ์ฒด๋ก ๋์ฒด๊ฐ ์์ํ๋ฏ๋ก Testable ํด์ง๋๋ค.
:: ํ๋กํ ์ฝ ์๋ช ์์ ๋ณดํต ์์ฑ์ ์ฌ์ฉํ๋ฉด -Type, ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด -able ์ ์ ๋ฏธ์ด๋ก ๋ถ์ด๋ ๊ฒ๊ฐ์์ B-able ๋ก ์๋ช ํ์์ต๋๋ค.
2-2-2 ์ด๊ธฐํ ์ดํ, A ํด๋์ค ์ธ๋ถ์์ ์์ฑ์ ์ ๊ทผํ์ฌ ์ ๋ฌํ๋ค.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard let vc = segue.destination else { return } /* ์ธ์คํด์ค vc ์ ์์ฑ b ์ B ์ธ์คํด์ค๋ฅผ ์ฃผ์ */ vc.b = B() }
iOS ๊ฐ๋ฐ์์๋ 2-2-2 ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ๋ง ์์กด์ฑ ์ฃผ์ ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค
๋ฐ๋ก Storyboard, xib ๋ก ์ฑ UI ๋ฅผ ๊ตฌ์ฑํ ๋์ธ๋ฐ์.
Storyboard ๋ก ์ฑ UI ๋ฅผ ๊ตฌ์ฑํ๋ฉด, ์ปค์คํ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ํ๋ฉด UI ๋ฅผ ๊ตฌ์ฑํ ๋ ํ์ฐ์ ์ผ๋ก UIKit ์ UIView ์๋ธํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ,
์์ฑ์๋ฅผ ํตํ ์์กด์ฑ ์ฃผ์ ( ๋ฐฉ๋ฒ 2-2-1) ์ ์ํด ์ปค์คํ ์ด๋์ ๋ผ์ด์ ๋ฅผ ๋ง๋ค๊ฒฝ์ฐ
required init(coder:) ๋ฅผ ์ง์ ๊ตฌํํด์ผ ํฉ๋๋ค. ( ์ํผ ํด๋์ค์ ์์ฑ์ ์๋ ์์์ด ์ทจ์๋๊ธฐ ๋๋ฌธ์ ๋๋ค.)
:: ์ด ๋ถ๋ถ์ NSCoding, Swift ์ ์์, Protocol ๊ฐ๋ ์ ์ ๋๋ก ์๊ณ ์์ด์ผ ์ดํด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
init(coder:) ๋ Xcode ๊ฐ Storyboard ๋ xib ํ์ผ์ ์ธ์์นด์ด๋นํ ๋ ์ฌ์ฉํ๊ฒ ๋๋ ์์ฑ์์ ๋๋ค.
์ง์ ๊ตฌํํ ์๋ ์์ง๋ง, ํธ์ถํ์ฌ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ด๊ธฐํ ์์ ์ดํ์ ์์ฑ์ ๋ฃ์ด์ฃผ์ด์ผํ๊ธฐ ๋๋ฌธ์, ์์ฑ ํ์ ์ ์ต์ ๋๋ก ์ ์ธํฉ๋๋ค.
๋ํ ๊ฐ์ ์ด์ ๋ก ์์๊ฐ ์๋ ๋ณ์๋ก ์ง์ ํด์ฃผ์ด์ผ ํ๋ค๋ ๋ฒ๊ฑฐ๋ก์์ด ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ด ๋ฐฉ๋ฒ์ Storyboard ๋ฐฉ์์ผ๋ก UI๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ, ์์กด์ฑ ์ฃผ์ ํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.
init(coder:) ์ ๋ํด ๊ถ๊ธํ๋ค๋ฉด? ๐๐ป [iOS] init(coder:) ๋?
์์นด์ด๋น, ์ธ์์นด์ด๋น์ ๋ํด ๊ถ๊ธํ๋ค๋ฉด? ๐๐ป[iOS] NSCoding ์ด๋? (feat. ์ธ์ฝ๋ฉ, ๋์ฝ๋ฉ, ์์นด์ด๋น)
3. ๋ฉ์๋์ ์ ๋ฌ์ธ์๋ก ์ฐธ์กฐ๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
class A { var someValue: Int func useB(b: B) { self.someValue = b.getValue() } } let a = A() let b = B() a.useB(b: b)
์ด ๋ฐฉ๋ฒ์ ๊ฒฝ์ฐ
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์์ ๋ง ์ผ์์ ์ผ๋ก ์์กด๊ด๊ณ๊ฐ ์๊ธฐ๋ ํน์ง์ด ์์ต๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ๋ฌด์์ ์ป์ ์ ์๋๊ฐ
์ด ๊ฒฐ๋ก ์ ๋๋ฌํ๋ ค๊ณ ์ ๋ง ๊ธธ๊ฒ๋ ๊ธ์ ์ผ๋ค์...ใ ใ ใ ใ
์์กด์ฑ ์ฃผ์ ์ผ๋ก ์ฐ๋ฆฌ๋:
์ฑ ์์ด ์ข ๋ ๋ช ํํด์ง ํด๋์ค๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ด๋ค ์์กด ๊ด๊ณ์ ์๊ตฌ์ฌํญ์ด ์๋์ง ์์ํ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
Testable ํ ํด๋์ค๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
Protocol type์ผ๋ก ๋ฐ์ ์ ์ฝ๊ฒ Mock ์ค๋ธ์ ํธ๋ก ๋์ฒดํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ ์์น์ ์ ์งํฌ์ ์๊ฒ ๋ฉ๋๋ค.
๋ ์ด์ ์์กด ๊ด๊ณ์ ๊ฐ์ฒด์ ์ด๊ธฐํ์ ์ง์ ๊ด์ฌํ ํ์๊ฐ ์์ต๋๋ค.
๋ํ ํ๋กํ ์ฝ์ ์ฌ์ฉํ ์์กด์ฑ ์ฃผ์ ์ ๊ฒฐํฉ๋๋ฅผ ์ค์ด๊ณ , ์ฃผ์ ๋ ๊ฐ์ฒด์ ์ฑ ์์ ๋ช ํํ ํ ์ ์์ต๋๋ค.
๋์ผ๋ก ์ด๋์ ์ฃผ์๋ค์ ๋ฉ์ง ๋ฌธ์ฅ ๋งํ๊ณ ์ ๋ ๊ฐ๊ฒ ์ต๋๋ค!๐๐ปโโ๏ธ
Do not depend on Concretion.
Depend on Abstraction.
์ค๋๋ ๋๋ ์ฑ์ฅํ๋ค!!!!โ๐ป
๐ค๐ข[์ฐ์งฑ์ iOS ๋ธ๋ก๊ทธ]๐ต๐ป
iOS๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋ฐฐ์ด ๋ด์ฉ์ ๊ธฐ๋กํ๊ณ ์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
https://www.youtube.com/watch?v=-n8allUvhw8
https://www.youtube.com/watch?v=sHLd1BuW0aU&t=2s
https://daniel-sumara.medium.com/removing-singletons-4340c6f6398a'iOS > ๐ค App' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Core Animation ์ด๋? (1) (0) 2021.07.05 [iOS] CALayer ๋? (0) 2021.07.05 [iOS] About App Development with UIKit (UIKit ์ผ๋ก ์ฑ ๊ฐ๋ฐํ๊ธฐ) (0) 2021.06.16 [iOS] DispatchQueue.main.sync { } ๋ ์ด๋ป๊ฒ ์๋ํ ๊น? (0) 2021.06.07 [iOS] GCD (Grand Central Dispatch) ๋? (feat. main & global dispatch queue) (0) 2021.06.07