Skip to content

의존성 주입, 의존 관계 역전 법칙 #79

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
seungchan2 opened this issue Jun 16, 2022 · 0 comments
Closed

의존성 주입, 의존 관계 역전 법칙 #79

seungchan2 opened this issue Jun 16, 2022 · 0 comments
Assignees
Labels

Comments

@seungchan2
Copy link
Owner

seungchan2 commented Jun 16, 2022

의존성 주입은 Swift에서만 등장하는 것이 아님

Dependency

객체 지향 프로그래밍에서 Dependency, 의존성은 서로 다른 객체 사이에 의존 관계가 있다는 것을 말함

즉, 의존하는 객체가 수정되면, 다른 객체도 영향을 받음

import UIKit

struct Eat {
    func coffee() {
        print("아메리카노")
    }

    func meal() {
        print("피자")
    }
}

struct Person {
    var todayEat: Eat
    
    func coffee() {
        todayEat.coffee()
    }
    
    func meal() {
        todayEat.meal()
    }
}

Person 객체Eat 객체 를 인스턴스로 사용하고 있고, Eat 객체에 의존성이 생김

이때, Eat 객체에 중요한 수정이나 오류가 발생한다면, Person 객체에도 영향이 감

의존성을 가지는 코드가 많아 진다면, 재사용성이 떨어지고, 매번 의존성을 가지는 객체들을 함께 수정해줘야 함

이러한 의존성을 해결하기 위해 나온 것이 Dependency Injection, 의존성 주입임

Injection

주입은 외부에서 객체를 생성해서 넣는 것을 의미

class Eat: Menu {
    var coffee: String
    var meal: String
    
    init(coffee: String, meal: String) {
        self.coffee = coffee
        self.meal = meal
    }
    
    func printCoffee() {
        print("아메리카노")
    }
    
    func printMeal() {
        print("피자")
    }
}

let menu = Eat(coffee: "아메리카노", meal: "피자")

해당 방식처럼 생성자를 활용해서 외부에서 주입할 수 있음 ㅇㅇ

하지만 의존성을 주입하는 것 만으로 의존성 주입이라고 하지 않음

의존 관계 역전 법칙에 대해 알아야 함

의존성 주입에서 의존성 분리는 의존 관계 역전 법칙으로 의존 관계를 분리시켜야 함

DIP, 의존 관계 역전 법칙

객체 지향 프로그래밍의 SOLID 원칙 중의 하나임.

의존 관계 역전 법칙은 상위 계층(정책 결정)이 하위 계층(세부 사항)에 의존하는 전통적인 의존관계를 반전시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 할 수 있는 구조를 말함

  • 상위 모듈은 하위 모듈에 의존해서는 안됨
    • 상위 모듈과 하위 모듈 모두 추상화에 의존해야 함
  • 추상화는 세부 사항에 의존해서는 안됨
    • 세부사항이 추상화에 의존해야 함

Protocol

protocol Menu {
    func printCoffee()
    func printMeal()
}

Class

class Eat: Menu {
    var coffee: String
    var meal: String
    
    init(coffee: String, meal: String) {
        self.coffee = coffee
        self.meal = meal
    }
    
    func printCoffee() {
        print("아메리카노")
    }
    
    func printMeal() {
        print("피자")
    }
}
struct Person {
    var todayEat: Menu
    
    func printCoffee() {
        todayEat.printCoffee()
    }
    
    func printMeal() {
        todayEat.printMeal()
    }
    
    mutating func changeMenu(menu: Menu) {
        self.todayEat = menu
    }
}

이렇게 구현한다면 Eat객체와 Person객체는 거의 독립적인 객체가 됨

Eat 객체를 수정하거나 Person을 수정한다고 해서 상대 객체를 함께 수정해야 하는 문제를 방지할 수 있음

(Person->Eat) 구조에서 의존 관계 역전 법칙에서는 어떤 추상화된 인터페이스에 A, B 객체가 모두 의존 (Eat → 프로토콜 ← Person)

위 구조는 Eat(상위 모듈), Person(하위 모듈) 모두 Menu(추상화 프로토콜) 에 의존해있어 의존 관계를 독립 시킨 상태

이렇게 의존의 방향이 역전되어 제어가 반전되는 상황을 제어의 반전 (IoC: Inversion of Control) 이라고 표현

@seungchan2 seungchan2 self-assigned this Jun 17, 2022
@seungchan2 seungchan2 added the iOS label Jun 17, 2022
@seungchan2 seungchan2 changed the title 의존성 주입 in iOS 의존성 주입, 의존 관계 역전 법칙 Jun 17, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant