์ฒ์ Swift๋ก iOS ์ฑ์ ๊ฐ๋ฐํ ๋๋ง ํด๋ ๊ตฌํ์ ์ด์ ์ ๋์์ง ์ด๋ป๊ฒ ๊ตฌํํ ๊ฒ์ธ๊ฐ์ ๋ํ ๊ณ ๋ฏผ์ ํ์ง ๋ชปํ๋๊ฑฐ ๊ฐ์์! ์ด์ ์ด๋๋ง ์ธ์ด๊ฐ ์ต์ํด ์ง๊ณ ์ฌ์ฉ์ ์ธก๋ฉด์ ๊ณ ๋ คํ๋ฉด์ ์ ์ง๋ณด์ ์ฉ์ด์ฑ, ์ฑ ์ํคํ ์ฒ์ ๋ํด ์์ฐ์ค๋ฝ๊ฒ ๊ณ ๋ฏผํ๊ฒ ๋๋๋ผ๊ตฌ์!
์ด๋ฒ ํฌ์คํ ์์๋ Swift ์ธ์ด๋ณด๋ค๋ Spring ํ๋ ์์ํฌ์์ ์ฃผ๋ก ๋ค๋ฃจ๋ ๋ด์ฉ์ธ DI์ ๋ํด ์ด์ผ๊ธฐ ํด๋ณด๋ ค ํฉ๋๋ค~ DI๋ loC๊ฐ ์์กด์ฑ์ ์ด๋ป๊ฒ ์ฃผ์ ํ ๊ฒ์ด๋์ ๋ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฑ ์ด๋ ํ๋ ์์ํฌ์์๋ง ์ฌ์ฉ๋๋ค๊ฐ ์๋๋ผ์ Swift๋ก ์ด๋ป๊ฒ ์์กด์ฑ์ ์ฃผ์ ํ ์ ์์์ง, ์์กด์ฑ์ ๋ฌด์์ธ์ง ์์๋ด ์๋ค.
์์กด์ฑ์ด๋?
์์กด์ฑ์ ๋ํด ์ดํดํ๊ธฐ ์ํด ์์ ์ฝ๋ ํ๋๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค~
class Zoo {
let animal: Bear
init() {
self.bear = Bear()
}
}
class Bear {
func startCliming() {
print("bear :: Climing!!!")
}
}
Zoo๋ผ๊ณ ํ๋ ํด๋์ค๋ animal์ด๋ผ๋ ๋ณ์๊ฐ ํ์ํฉ๋๋ค. ์ด๋ animal์ ํ์ ์ Bear ์ ๋๋ค. Zoo์ ์์ฑ์๋ฅผ ๋ณด์๋ฉด Zoo์ ์ธ์คํด์ค๊ฐ ์์ฑ๋ ๋ Bear ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. Zoo ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฌ์ฉํ๊ธฐ ์ํด์ animal ๊ฐ์ฒด๊ฐ ํ์ํฉ๋๋ค.
์ด๋ Zoo๋ Bear ์ ์์กดํ๋ค ๋ผ๊ณ ํด์. ์ฌ๊ธฐ์ Bear ๋ด๋ถ์ ๊ฐ์ด ๋ณํ๊ฑฐ๋ ์ฌ๋ผ์ง๊ฑฐ๋ ๋ณ๊ฒฝ์ด ๋๋ฉด Bear ์ธ์คํด์ค๋ฅผ ํ์๋ก ํ๊ณ ์ฌ์ฉํ๋ Zoo์๋ ์ํฅ์ด ๊ฐ๊ธฐ ๋๋ฌธ์ด์ฃ !
๊ทธ๋ ๋ค๋ฉด '์์กด์ฑ์ ์ฃผ์ ํ๋ค'๋ ๋ฌด์จ ์๋ฏธ์ผ๊น์?
์์กด์ฑ ์ฃผ์ ์ด๋?
class Zoo {
let animal: Bear
init() {
self.bear = Bear()
}
}
์์กด์ฑ ์ฃผ์ ์ ์ดํดํ๊ธฐ ์ํด ์ ์์ ์์ Zoo ํด๋์ค ์ ์๋ฅผ ๋ค์ ๋ด ์๋ค. Zoo๋ผ๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ์์ฑ์์ ์ํด ๋ด๋ถ ํ๋กํผํฐ์ธ animal ์ Bear ์ธ์คํด์ค๋ฅผ ํ ๋นํ๊ฒ ๋ ๊ฑฐ์์. Zoo ํด๋์ค๊ฐ ๋ด๋ถ ์์ฑ์์์ Bearํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ง์ ๋ง๋ค์ด์ ํ ๋นํด ์ฃผ๊ณ ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํด๋์ค์ ํด๋์ค๊ฐ ์์ฃผ ๊ธด๋ฐํ๊ฒ ์ฐ๊ด๋๊ฒ ๋ฉ๋๋ค. ๊ฐ์ฒด์งํฅ์ด ์๋ ํด๋์ค ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ง๊ณ ์๋ ์ํ์ ๋๋ค.
์ด๋๋ ๊ฐ์๊ธฐ animal์ด duck์ผ๋ก ๋ฐ๋๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ํด๋์ค ์ ์ฒด์์ Bear์ ๊ธด๋ฐํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๋ ์ฝ๋๋ค์ ์์ ํด์ผ ํ์ฃ . Bear์ ์ข ๋ฅ๋ ํ๊ณฐ, ๋ถ๊ทน๊ณฐ๊ณผ ๊ฐ์ด ์ฌ๋ฌ ์ข ๋ฅ๊ฐ ์๋ค๊ณ ํ ๋ ์ ๋ฐฉ๋ฒ๋๋ก ์ฌ์ฉํ๋ค๋ฉด ๊ฐ์ ํ์ ์ Bear ๊ฐ์ฒด๋ฅผ ์์ฑ์์์ ์์ฑํด ์ฃผ๊ธฐ ๋๋ฌธ์ ๋ด๋ถ์์ ์ค์ ํด ์ค์ผ ํ๋ ๋ฌธ์ ๋ ์์ต๋๋ค. ๊ธด๋ฐํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๋ ๊ด๊ณ๋ ์ ์ฐํ์ง ๋ชปํ๊ฒ ๋ง๋ค๊ณ ๋ณ๊ฒฝ์ด๋ ์์ ์ ์์ ๋กญ์ง ๋ชปํ๋ค๋ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์์กด์ฑ ์ฃผ์ ์ DI = Dependency Injection์ด๋ผ๊ณ ํ๋๋ฐ์, ์ฝ๊ฒ ๋งํด์ ์์กด์ฑ์ ์ค๋ค~ ์ ๋๋ค. ์์์ Zoo ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ฐ ํ์ํ Bear ์ธ์คํด์ค, ์ฆ animal ํ๋กํผํฐ๊ฐ ์์กด์ฑ์ธ๊ฑธ ์์๋ค๋ฉด ์ด์ ๋ ์ด ์์กด์ฑ์ ์ด๋ป๊ฒ ์ ๊ณตํด์ ์ค์ ํด ์ค ๊ฒ์ด๋๋ฅผ ์๊ฐํด ๋ณผ ์ ์๋ ๊ฒ์ด์ฃ .
class Zoo {
let animal: Bear
init(bear: Bear) {
self.bear = bear
}
}
์ ๋ฐฉ๋ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ ์ด ์ฝ๋์์๋ ์์กด์ฑ์ ์ธ๋ถ๋ก ๋ถํฐ ์ ๋ฌ๋ฐ์ ์์ฑ์์์ ํ ๋นํด ์ฃผ๊ณ ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์์กด์ฑ ์ฃผ์ ์์ ์ด์ ์ ์ธ๋ถ๋ก๋ถํฐ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ ๋ฐ์ ํ์ํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋ฐฉ์์ด๋ผ๋ ๊ฒ์ ๋๋ค!
๋ค์ด๋๋ฏนํ ์์กด ๊ด๊ณ
์์ ์ฝ๋ ํ๋๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
class Zoo {
let animal: Bear
init(animal: Bear) {
self.animal = animal
}
func openZoo() {
animal.startCliming()
}
}
class Bear {
func startCliming() { }
}
class Duck {
func startSwim() { }
}
Zoo๋ Bear์ ์์กด ๊ด๊ณ์ด๊ณ ๊ทธ ํ์ํ ์์กด ๊ด๊ณ๋ฅผ ์ธ๋ถ๋ก ๋ถํฐ ์ฃผ์ ๋ฐ๊ณ ์์ต๋๋ค. ์์ ์ด์ง ์ธ๊ธํ ๋ฌธ์ ๊ฐ ๋จ์ ์์ต๋๋ค. ๋ฐ๋ก animal์ด Bear ์์ ๊ฐ์๊ธฐ Duck์ผ๋ก ๋ฐ๋์ด์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
class Zoo {
let animal: Duck
init(animal: Duck) {
self.animal = animal
}
func openZoo() {
animal.startCliming() // error!! Duck has no member 'startCliming'
}
}
class Bear {
func startCliming() { }
}
class Duck {
func startSwim() { }
}
Zoo ๋ด๋ถ์ animal ํ์ ์ด ๋ฐ๋์์ ๋ฟ์ธ๋ฐ ์์ฑ์์์ ์ฃผ์ ๋ฐ๋ ๊ฐ์ฒด์ ํ์ , ๊ทธ๋ฆฌ๊ณ animal์ ์ํด ์ฐธ์กฐํ ์ ์์๋ ํจ์๊น์ง ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ์ ์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ๋ํด ์๊ณ ๊ฐ์๋ค! ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ก๊ทธ๋๋ฐ ์ ํ์ํ ๋ฐ์ดํฐ๋ค์ ์ถ์ํ ์ํต๋๋ค. ์ถ์ํ ๋ ๊ฐ์ฒด๋ ์ํ(property)์ ํ์(method)๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ด ๊ฐ์ฒด๋ค์ ์๋ก ์ ๊ธฐ์ ์ธ ์ํธ์์ฉ์ ํ๋ฉฐ ๋ก์ง์ ํ์ฑํ๊ฒ ๋๋ ๋ฐ์, ์ฌ๊ธฐ์ ๋์ฌ๊ฒจ ๋ณผ ๋ด์ฉ์ '์ถ์ํ' ์ ๋๋ค.
protocol Animal {
func startAct()
}
class Zoo {
let animal: Animal
init(animal: Animal) {
self.animal = animal
}
func openZoo() {
animal.startAct()
}
}
class Bear: Animal {
func startAct() { }
}
class Duck: Animal {
func startAct() { }
}
Swift์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ผ๋ก protocol์ ์ ์ ํด ์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ Bear์ Duck์ Animal ํ๋กํ ์ฝ์ ๋ฐ๋ฆ ๋๋ค. Animal ํ๋กํ ์ฝ์์ ๊ตฌํํ startAct()๋ฅผ ๊ฐ๊ฐ ๊ตฌํํ๊ณ ์๊ณ ๊ฐ๊ฐ ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Zoo ํด๋์ค๋ ์ธ๋ถ๋ก ๋ถํฐ animal์ ์ฃผ์ ๋ฐ์ผ๋ฉฐ openZoo()์์ animal์ ๋ํ ๋์์ ์ํํ๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค๋ฉด ์ฝ๋๋ ๊ฐ์ฒด๊ฐ์ ๊ด๊ณ์ ์ ์ฐํ๊ฒ ์์กด์ฑ์ ์ฃผ์ ํ ์ ์๊ฒ ๋ฉ๋๋ค. Zoo๋ Bear๋ Duck๊ณผ ๊ฐ์ ํน์ ๊ฐ์ฒด์ ๋ํ ์์กด์ฑ์ด ๋ฎ์์ง๊ฒ ๋์ฃ !
DI์ ์ฅ์
- DI๋ ์์ ์ดํด ๋ดค๋ฏ์ด ๊ธด๋ฐํ ๊ด๊ณ๊ฐ ์ ์ฐํ๊ฒ ๋ฐ๋์ด ๋ชจ๋๊ฐ์ ๊ฒฐํฉ๋๋ ๋ฎ์์ง๊ณ ์ ์ฐ์ฑ์ ๋์์ง๊ฒ ๋ฉ๋๋ค.
- ์์กด์ฑ์ด ์ค์ด๋ค๊ณ ์์กด ๊ด๊ณ๊ฐ ๊ธด๋ฐํ์ง ์์ ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ์ฝ๋๊ฐ ๋ฉ๋๋ค.
- ํ ์คํธํ๊ธฐ ์ข์ ์ฝ๋๊ฐ ๋ฉ๋๋ค.
- ๊ฐ๋ ์ฑ์ด ๋์์ง๋๋ค. ๐ง
DI์ ๋จ์
๊ฐ์ธ์ ์ผ๋ก๋ ์น๋ช ์ ์ด๋ผ๊ณ ์๊ฐํ๋ ๋จ์ ์ด ์์ต๋๋ค. ์ธํฐํ์ด์ค๋ก ์์กด์ฑ์ด ์ ์ ๋๋ฉด ์ปดํ์ผ์ ๋ฐ๊ฒฌ๋์ง ์์๋ ์๋ฌ๊ฐ ๋ฐํ์์ ์ผ์ด๋ ์ ์์ต๋๋ค. (์ฑ์ผ๋ก ์น์๋ฉด ๋น๋๋ ์ ๋์ ๊ฐ๋๋ฐ ์ฑ ์ฌ์ฉ์ค ํฌ๋์ฌ... ๐ซ)
์ด๋ ๊ฒ DI์ ๋ํด ์์๋ณด์๋๋ฐ์, Swift ์ธ์ด๋ฅผ ์ฌ์ฉํด์ iOS ๊ฐ๋ฐํ์๋ ๋ถ๋ค์ ์์กด์ฑ์ด๋ DI๋ผ๋ ๋จ์ด๋ฅผ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํ์ง๋ ์๋๊ฒ ๊ฐ์์. ํ์ง๋ง ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ด๋ ์์ ์ ์ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์กด์ฑ์ ์ฃผ์ ํ ๊ฒ์ด๋์ ๋ฐ๋ผ ์ ์ง๋ณด์ ๋ฒ์๋ ๋ฌ๋ผ์ง๊ณ ์ข ๋ ํ ์คํฐ๋ธ ์ฉ์ดํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ฒ์ฏค ์๊ฐํด ๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ ๊ธ์ ์ ๊ฒ ๋์์ต๋๋ค!
ํน์ ์ค์ํ๊ฑฐ๋ ์์ ํด์ผ ํ๋ ๋ด์ฉ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
๐ ๋ค์ ๊ธ์์๋ ์ค์ํํธ์์ ์ด๋ป๊ฒ DI๋ฅผ ์ค์ ํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค~
์ฐธ๊ณ ์ฌ์ดํธ ๋ฐ ๋์
๋๊ธ