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

[Swift] ์˜์กด์„ฑ ์ฃผ์ž… ์™œ ํ•„์š”ํ• ๊นŒ? DI ์•Œ์•„๋ณด๊ธฐ

by ํ‹ด๋”” 2022. 4. 29.
๋ฐ˜์‘ํ˜•

  ์ฒ˜์Œ 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๋ฅผ ์„ค์ •ํ•˜๋Š”์ง€ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค~

 

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

 

biggwang์˜ ๊ฐœ๋ฐœ ๋ธ”๋กœ๊ทธ

๋ฐฑ๋ฌธ์ด๋ถˆ์—ฌ์ผ๊ฒฌ

biggwang.github.io

 

728x90
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€