SOLID - 문자 D - 종속성 역전 원칙

마지막 SOLID 원칙은 DIP(Dependency Inversion Principle)입니다. 이 원칙은 가장 유연한 시스템이 구체적인 종속성 대신 추상 종속성을 사용한다는 것을 알려줍니다. 이를 달성하는 방법은 인터페이스를 사용하는 것입니다.

인터페이스란?



소프트웨어 개발에 대해 말하면 인터페이스는 데이터를 포함하지 않지만 동작을 메서드 서명으로 정의하는 추상 유형입니다.
예를 들어 데이터베이스에 계정을 삽입한다고 가정해 보겠습니다.

interface AddAccountRepository {
  add: (email: String, password: String) => Account
}


AddAccountRepository 인터페이스에 구현이 없고 Add 메서드의 서명만 있는 것을 볼 수 있습니다. 하지만 궁금하실 겁니다. 코드가 없다면 어떻게 이 방법을 사용할 수 있을까요?

인터페이스를 구현하는 방법?



Add 메서드의 코드를 작성하고 싶다고 상상해 보십시오. 이 인터페이스를 구현하려면 새 클래스를 만들어야 합니다.

class AccountMongoRepository implements AddAccountRepository {
}


이 코드 줄만 작성하면 IDE(Visual Studio, Eclipse 등)에서 "Add"라는 메서드를 만들어야 한다고 말할 것입니다. 즉, "구현"이라는 단어를 사용하고 인터페이스 다음에 이 인터페이스의 모든 서명을 설명하고 구현해야 합니다. 따라서 코드는 다음과 같습니다.

class AccountMongoRepository implements AddAccountRepository {
  add (email: String, password: String): Account {
  // insert an user into a MongoDb
  }
}


DeleteAccountRepository라는 또 다른 인터페이스가 있다면.

interface DeleteAccountRepository {
  delete: (email: String) => void
}


"구현"부분에 인터페이스를 추가하고 삭제 메서드 구현을 작성하기만 하면 됩니다.

class AccountMongoRepository implements AddAccountRepository, DeleteAccountRepository {
  add (email: String, password: String): Account {
  // insert an user into a MongoDb
  }

  delete (email: String): void {
  // delete an user
  }
}


이제 인터페이스와 이러한 인터페이스의 메서드를 구현하는 클래스가 있습니다. 이제 이 인터페이스를 어떻게 사용할 수 있습니까?

인터페이스 구현을 사용하는 방법은 무엇입니까?



구현 방법을 사용하려면 클래스에 이 종속성을 주입해야 합니다. 의존성 주입에 대해 더 알고 싶다면 .

class DbAddAccount {
  constructor (private readonly addAccountRepository: AddAccountRepository) { }

addUser (email: String, password: String): Account {
    accountCreated = this.addAccountRepository.add(name, password)
    return accountCreated
  }
}


위의 코드에서 AddAccountRepository 인터페이스의 삽입을 볼 수 있습니다. DbAddAccount 클래스는 Add 메서드에 대한 구현에 대해 알지 못합니다. 종속성 클래스의 변경 사항을 인식할 필요가 없기 때문에 이는 중요합니다.

이름이 종속성 반전인 이유는 무엇입니까?



한 시나리오에서 구체적인 클래스를 사용하여 사용자를 데이터베이스에 삽입하는 경우 DbAddAccount 클래스는 이 클래스에 종속됩니다.



예를 들어 데이터베이스를 Postgres로 변경해야 하는 경우 클래스가 영향을 받습니다. 주입 종속성을 사용하여 아래 이미지에서 볼 수 있듯이 종속성을 반전시킵니다.



이제 DbAddAccount는 AddAccountRepository 인터페이스를 통해 AccountMongoRepository를 사용합니다. DbAddAccount는 AccountMongoRepository에 의존하지 않지만 그 반대입니다. 사용하려면 AccountMongoRepository가 DbAddAccount에 의존합니다.

결론



종속성 역전 원리와 종속성 주입은 함께 작동합니다. 우리는 다른 하나를 얻기 위해 하나를 사용해야 합니다. 이해하고 코딩하기가 더 어려울 수 있지만 코드에서 두 가지를 모두 사용하면 재사용성이 향상되고 코드가 더 깨끗해지고 변경하기가 더 쉬워집니다.

좋은 웹페이지 즐겨찾기