의존성이란?
소프트웨어 공학에서 의존성은 한 요소가 다른 요소에 의해 영향을 받거나 연결되는 상태 또는 관계를 나타내는 개념입니다.
주로 모듈, 클래스, 함수, 객체와 같은 소프트웨어 구성 요소 간의 상호 작용과 관련이 있습니다.
소프트웨어 설계, 아키텍쳐, 모듈화, 테스트, 유지보수, 확장성, 리팩토링 등 다양한 측면에서 의존성을 이해하고 관리하는 것이 중요합니다.
의존성 관리는 코드의 구조와 아키텍처를 개선하고 효율적인 소프트웨어 개발을 하는데 이해해야 하는 필수적인 개념 중 하나입니다.
의존성과 관련된 다양한 원칙과 설계 패턴이 존재하며 그 중 대표적으로 Robert C. Martin이 제안한 클린 아키텍쳐가 의존성의 개념을 효과적으로 다룬 아키텍처입니다.
의존성을 커피머신과 바리스타의 관계로 설명하자면 아래 코드와 같습니다.
// 고수준
class CoffeeMachine() {
fun makeCoffee(menuItem: MenuItem): Coffee {
return when (menuItem) {
MenuItem.ESPRESSO -> Coffee(water = 0, milk = 0)
MenuItem.AMERICANO -> Coffee(water = 10, milk = 0)
MenuItem.LATTE -> Coffee(water = 2, milk = 8)
}
}
}
// 저수준
class Barista(private val coffeeMachine: CoffeeMachine) {
fun prepareCoffee(menuItem: MenuItem): Coffee {
return coffeeMachine.makeCoffee(menuItem)
}
}
바리스타는 커피를 만들기 위해 커피머신을 사용합니다.
바리스타는 주문받은 커피를 만들기 위해 커피머신을 필요로 합니다.
이것은 커피머신에서 제조된 커피를 전달받아 손님에게 제공하는 역할을 수행하기 때문에, 바리스타는 커피머신에 의존합니다.
반면, 커피머신은 바리스타나 손님에 대한 의존성을 가지지 않습니다.
커피머신은 주어진 주문에 따라 커피를 만들기만 하면 됩니다.
커피머신은 누가 주문했는지 또는 커피를 어떻게 사용할지에 대한 정보를 모릅니다.
코드를 살펴보면 바리스타(Barista)는 커피머신(CoffeeMachine)객체를 참조하게 됩니다.
바리스타(Barista)가 커피머신(CoffeeMachine)를 알고 있다는 의미입니다.
이렇게 어떤 객체가 다른 객체를 참조하고 있다는 것은 다른 객체에게 의존하고 있다는 것입니다.
커피머신(CoffeeMachine)는 그 어떤 객체도 참조하지 않기 때문에 커피를 만드는 비즈니스 로직에 외부의 영향을 받지 않게 됩니다.
추가적으로 의존과 종속은 같은 의미이지만 주체가 누구냐에 따라 다르게 표현합니다.
"바리스타는 커피머신을 의존하고 있다 ▷ 커피머신은 바리스타를 종속하고 있다"
바리스타 ▷ 커피머신
의존과 종속 모두 의존성의 방향은 위와 같습니다.