DIP Dependency Inversion Principle
- DIP(Dependency Inversion Principle) - 의존관계 역전 원칙
- 상위 모듈이 하위 모듈에 의존하면 안되고 두 모듈 모두 추상화에 의존하게 만들어야 한다는 원칙
- 추상화를 진행해서 각각의 모듈에 더 추상화된 것에 의존하게 만들어야 한다는 것
- 이렇게 코드를 설계해야 재사용에도 유용하고 하나를 수정했을 때 더욱 수정상황이 많이 없는 훌륭한 프로그램을 설계할 수 있다
- Refactoring에서도 MVP 패턴을 사용하는 이유를 생각하면 된다
BadCase
class AccountManager {
func getAccount() -> String {
return "XX은행 00-0000-0000-00"
}
}
class BankService {
private let accountManager: AccountManager = AccountManager()
func transfer() {
let accountNumber = accountManager.getAccount()
print("1000원을 \(accountNumber)로 송금합니다.")
}
}
let bankService = BankService()
bankService.transfer()
- AccountManager 객체가 BankService 내부에서 생성되고 사용되고 있어서 테스트에 용이하지 않다.
- AccountManager의 변화가 생기면 BankService에서도 수정이 필요하게 된다.
NiceCase
protocol AccountProtocol {
func getAccount() -> String
}
class AccountManagerNice: AccountProtocol {
func getAccount() -> String {
return "XX은행 00-0000-0000-00"
}
}
class BankServiceNice {
let accountManager: AccountProtocol
init(accountManager: AccountProtocol) {
self.accountManager = accountManager
}
func transfer() {
print("1000원을 \(accountManager.getAccount())로 송금합니다.")
}
}
let accountManagerNice = AccountManagerNice()
let bankServiceNice = BankServiceNice(accountManager: accountManagerNice)
bankServiceNice.transfer()
- protocol을 활용하여 AccountManager를 독립적으로 구현한다
- BankService 생성자에 AccountProtocol을 사용하여 AccountManager를 주입시켜 처리한다
- 이렇게 구한하게 되면 테스트 케이스 작성 시 Mock으로 간편하게 AccountManager를 만들어 테스트를 용이하게 처리할 수 있다.