의존성(Dependency)이란?
어떤 객체가 자신의 기능을 수행하기 위해 필요로 하는 외부 요소
한 객체가 다른 객체를 사용할 때, 의존성이 있다고 한다.
public class OrderService {
private Rider rider = new Rider(); // 의존성
...
}
의존성 주입(Dependency Injection)이란?
외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴
인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮춘다.
의존성 주입(Dependency Injection) 이 필요한 이유
1. 객체 간 결합도 감소
- 특정 구현체에 강하게 의존하지 않으므로, 코드 변경이 쉽고 유지보수가 용이
2. 코드 재사용성과 확장성 증가
- 다양한 의존성을 주입 받아 동작할 수 있어, 같은 코드로 다른 시나리오를 쉽게 처리 가능
3. 테스트 용이성 증가
- 실제 의존성을 사용하지 않고 테스트용 객체를 주입해서 테스트를 쉽게 작성 가능
public interface DeliveryAgent {
void deliver(); // 배달
}
public class Rider implements DeliveryAgent{
@Override
public void deliver() {
// 라이더 배달
}
}
public class Drone implements DeliveryAgent{
@Override
public void deliver() {
// 드론 배달
}
}
public class OrderService {
private final DeliveryAgent agent;
public OrderService(DeliveryAgent agent) {
this.agent = agent;
}
public void order() {
agent.deliver();
}
}
public static void main(String[] args) {
OrderService service1 = new OrderService(new Rider());
service1.order(); // 라이더가 배달
OrderService service2 = new OrderService(new Drone());
service2.deliver(); // 드론이 배달
}
조립자
의존성 주입(조립)을 담당하는 객체
main이 의존성 주입과 실행을 모두 담당하는 것은 좋은 객체 지향 방식이 아니다. 한 객체는 하나의 책임을 지는 것이 유지보수에 아주 유리하기 때문이다. 의존성 주입 코드를 모두 모아 정리한 객체가 조립자이다.
// 조립자
public class DeliveryContext {
// 도심 배송: 라이더 주입
public static OrderService urbanCenter() {
return new OrderService(new Rider()); // 여기서 '주입(Injection)' 해줌!
}
// 하늘길 배송: 드론 주입
public static OrderService skyZone() {
return new OrderService(new Drone());
}
}
public static void main(String[] args) {
OrderService urban = DeliveryContext.urbanCenter();
urban.order(); // 라이더가 배달
OrderService sky = DeliveryContext.skyZone();
sky.deliver(); // 드론이 배달
}'Java > 객체 지향' 카테고리의 다른 글
| 방어적 복사 (0) | 2026.06.15 |
|---|---|
| 값 객체(Value Object)와 불변성 (0) | 2026.06.12 |
| 객체 지향 원칙 4 - 다형성(Polymorphism) (0) | 2026.06.04 |
| 객체 지향 원칙 3 - 추상화 (0) | 2026.06.04 |
| 객체 지향 원칙 2 - 상속(Inheritance) (0) | 2026.06.04 |