ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SOLID] 의존 관계 역전 원칙이란 (Dependency Inversion Principle, DIP)
    공부 2021. 8. 29. 19:48

    의존 관계 역전 원칙에선 고수준의 모듈은 저수준 모듈의 구현에 의존해선 안됩니다. 다시 말해 의존 관계를 맺을 때, 변하기가 어려운 것에 의존해야 합니다. 즉, 구체화된 클래스에 직접적인 의존 관계를 맺지 않고 인터페이스나 추상 클래스에 의존관계를 맺는 것입니다.

    사용자가 티켓을 예매한다고 가정합니다. 해당 원칙을 적용하지 않고 구현을 한다면 사용자 → 티켓 이라는 관계를 맺어 고수준 모듈인 사용자가 저수준 모듈 티켓을 의존하는 형태가 나옵니다.

    from dataclasses import dataclass
    
    class Ticket:
        def book(self):
            print('티켓을 예약한다.')
    
    @dataclass
    class User:
        ticket: Ticket
    
        def buy(self):
            self.ticket.book()
    
    ticket = Ticket()
    user = User(ticket)
    user.buy()
    
    // 티켓을 예약한다.
    // 주문을 한다.

    여기서 사용자가 티켓이 아닌 굿즈를 구매하고자 한다면 굿즈에 관련된 코드를 추가하는 것 뿐만 아니라 Ticket 클래스를 의존하고 있던 User 클래스를 수정해야 합니다. 이는 개방 폐쇄 원칙을 위배하게 됩니다. 티켓과 굿즈와 같은 상품 단위로 추상화를 통해 해결할 수 있습니다.

    from abc import ABCMeta, abstractmethod
    from dataclasses import dataclass
    
    class Item(metaclass=ABCMeta):
        @abstractmethod
        def order(self):
            pass
    
    class Ticket(Item):
        def order(self):
            print('티켓을 예약한다.')
    
    class Goods(Item):
        def order(self):
            print('굿즈를 산다.')
    
    @dataclass
    class User:
        _item: Item
    
        def buy(self):
            self._item.order()
    
        @property
        def item(self):
            return self._item
    
        @item.setter
        def item(self, item: Item):
            self._item = item
    
    ticket = Ticket()
    user = User(ticket)
    user.buy()
    # 티켓을 예약한다.
    
    goods = Goods()
    user.item = goods
    user.buy()
    # 굿즈를 산다.

    Order는 고수준 모듈인 User 입장에서 생성이 되는데 의존 관계가 역전된다 하여 의존 역전 원칙이라 부릅니다. 또한 원칙을 적용하면 의존성 주입(Dependency Injection)으로 변경에 대해 내부 코드 수정 없이 외부에서 쉽게 변경을 할 수 있습니다.

    댓글