TypeScript의 종속성 역전 원칙

Depend upon abstractions, not concretions.



애플리케이션에서 두 가지 유형의 클래스를 구분할 수 있습니다.

  • 데이터베이스에서 읽기 또는 파일 저장과 같은 작업을 수행하는 저수준 클래스입니다.

  • 비즈니스 로직을 구현하고 이러한 하위 수준 클래스를 사용하는 상위 수준 클래스.

  • 이 원칙이 제안하는 것은 높은 수준의 클래스가 구체적인 구현 대신 인터페이스에 의존한다는 것입니다. 이것은 예를 들어 이해하기 쉽습니다.


    다음 나쁜 예에는 데이터베이스에 주문을 저장하는 OrderService 클래스가 있습니다. OrderService 클래스는 하위 수준 클래스MySQLDatabase에 직접적으로 의존합니다.

    나중에 사용 중인 데이터베이스를 변경하려면 OrderService 클래스를 수정해야 합니다.

    class OrderService {
      database: MySQLDatabase;
    
      // constructor
    
      save(order: Order): void {
        if (order.id === undefined) {
          this.database.insert(order);
        } else {
          this.database.update(order);
        }
      }
    }
    
    class MySQLDatabase {
      insert(order: Order) {
        // insert
      }
    
      update(order: Order) {
        // update
      }
    }
    


    인터페이스를 만들고 OrderService 클래스를 인터페이스에 종속시켜 이를 개선할 수 있습니다. 이런 식으로 종속성을 뒤집습니다. 이제 상위 수준 클래스는 하위 수준 클래스 대신 추상화에 의존합니다.

    class OrderService {
      database: Database;
    
      // constructor
    
      save(order: Order): void {
        this.database.save(order);
      }
    }
    
    interface Database {
      save(order: Order): void;
    }
    
    class MySQLDatabase implements Database {
      save(order: Order) {
        if (order.id === undefined) {
          // insert
        } else {
          // update
        }
      }
    }
    


    이제 OrderService 클래스를 수정하지 않고 새 데이터베이스를 추가할 수 있습니다.

    좋은 웹페이지 즐겨찾기