깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ⑤ ~ 의존성 역전의 원칙 ~

이번에는 SOLID의 의존 관계 역전의 원칙에 대해 정리했습니다.

그 외의 기사는 이하.
깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ① ~단일 책임의 원칙~
깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ② ~ 오픈 폐쇄 원칙 ~
깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ③ ~리스코프의 대체 원칙~
깨끗한 코드를 작성하기 위해 SOLID 원칙을 배웠습니다 ④ ~ 인터페이스 분리의 원칙 ~

종속성 역전의 원칙



High-level modules should not depend on low-level modules. Both should depend on abstractions.

직역하면 "하이 레벨의 모듈은 로우 레벨의 모듈에 의존해서는 안됩니다. 둘 다 추상에 의존해야합니다"라는 의미입니다.

'하이 레벨'이나 '로우 레벨'이나 '추상'이라는 낯선 단어가 나왔습니다 ...

예를 들어 전자상거래 애플리케이션을 생각해 봅시다.


사각형으로 둘러싸인 것은 응용 프로그램의 각 기능을 나타내며이를 모듈이라고합니다.

PayPal 및 GooglePay 모듈을 살펴보면 PaymentProcessor(지불 처리)의 특정 서비스 이름에 해당합니다. 이와 같이 PaymentProcessor와 같은 일반적인 기능에 해당하는 부분을 하이 레벨, 구체적인 수단에 해당하는 부분을 로우 레벨이라고 부릅니다. 다만, 그림의 Communication과 같은, CustomerProfile에서 보면 로우 레벨, EmailSender에서 보면 하이 레벨 같은 모듈도 있으므로, 레벨이라고 하는 것은 어디까지나 상대적인 개념이라는 점에 주의가 필요합니다.



단어의 정의를 알게 된 곳에서 그림을 보면 뭔가 위화감을 느낄 것입니다.
맞습니다. "하이 레벨의 모듈은 로우 레벨의 모듈에 의존해서는 안된다."라는 원칙을 위반해 버립니다.

인터페이스 도입



ProductCatalog와 SQLProductRepository 사이의 관계에 대해 다이어그램 종속성을 코드화하면 다음과 같습니다.
모듈 종속성은 다른 모듈 내에서 인스턴스화를 수행하는 것으로 간주 될 수 있습니다.
public class ProductCatalog {
  public void listAllProducts() {
    SQLProductRepository sqlProductRepository = new SQLProductRepository();
  }
}

public class SQLProductRepository {
  public List<String> getAllProductNames() {
    ...
  }
}

이 종속성을 제거하는 방법은 인터페이스와 인스턴스화를 수행하는 팩토리 클래스를 활용하는 것입니다.
public class ProductCatalog {
  public void listAllProducts() {
    ProductRepository productRepository = ProductFactory.create();
    ...
  }
}

public interface ProductRepository {
  public List<String> getAllProductNames();
}

public class ProductFactory {
  public static ProductRepository create() {
    return new SQLProductRepository();
  }
}

public class SQLProductRepository implements ProductRepository {
  public List<string> getAllProductNames() {
    ...
  }
}

인터페이스를 끼우면 모듈 간의 종속성이 사라지고 인터페이스가 두 모듈에서 종속됩니다.

따라서 종속된 측이었던 SQLProductRepository가 종속된 측으로 역전되기 때문에 종속성 역전의 원칙이라고 합니다.


결론



의존성의 주입에 대해서는, Laravel을 예로 하고 또 다른 기회에 정리해 보고 싶습니다.

참고서적・동영상



Crean Architecture Robert.C.Martin
SOLID Principles: Introducing Software Architecture & Design Sujith George

좋은 웹페이지 즐겨찾기