의존성 주입(Dependency Injection, DI)
스프링 컨테이너에서 객체 Bean을 먼저 생성해두고 생성한 객체를 지정한 객체에 주입하는 방식
외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴,
인터페이스를 사이에 둿 클래스 레벨에서는 의존관계가 고정되지 않도록 런타임 시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 합니다.
- 두 객체 간의 관계라는 관심사의 분리
- 두 객체 간의 결합도를 낮춤
- 객체의 유연성을 높임.
- 테스트 작성을 용이하게 함.
의존성 주입을 왜 사용하는가?
public class Store{
private Coke coke;
public Store(){
this.coke = new Coke();
}
}
<문제점>
1. 두 클래스가 강하게 결합되어 있다
만약 Store에서 Coke가 아닌 Milk로 변경하고자 한다면 Store 클래스의 생성자에 변경이 필요 -> 유연성이 떨어진다.
2. 객체들 간의 관계가 아니라 클래스 간의 관계가 맺어진다. -> 객체 지향 위배
올바른 객체지향적 설계라면 객체들 간에 관계가 맺어져야 한다.
객체들 간의 관계가 맺어졌다면 다른 객체의 구체 클래스(coke or milk)를 전혀 알지 못하더라도, 인터페이스의 타입(Drinks)으로 사용할 수 있다.
즉, 객체간의 관심이 분리 되지 않았다.
[의존성 주입으로 해결되는 점]
| 문제점 | 적용 후 해결 방식 |
| 강한 결합 | Store는 더 이상 Coke, Milk 같은 구체 클래스에 의존하지 않고 Drinks 인터페이스에만 의존함. 따라서 다른 음료로 교체 시 Store를 수정할 필요가 없음 |
| 클래스 간의 관계 | 이제 클래스 간 관계가 아닌 객체 간의 관계로 구성됨. 외부에서 어떤 객체를 넣느냐에 따라 동작이 바뀌므로 유연성이 생김 |
| 관심사 분리 | Store는 어떤 음료를 파는지에 대한 책임이 없음 → 책임이 분리되고 관심사가 명확해짐 |
| 확장성 | 새로운 음료 (Juice, Water 등) 추가 시 Store 수정 없이 사용 가능 |
요약
의존성 주입은 객체 간의 결합을 낮추고, 추상화된 타입을 통해 더 유연하고 테스트 가능한 구조를 만들어준다.
이로 인해 객체 지향 설계 원칙을 잘 따르게 되고, 유지보수와 확장이 쉬워진다.
'개발자 면접 노트' 카테고리의 다른 글
| Kotlin과 같은 등급은 Java인가 Spring인가? (3) | 2025.06.25 |
|---|---|
| Spring - 의존성 주입(DI)의 종류 (0) | 2025.06.25 |
| AJAX를 사용하는 이유 (1) | 2025.06.24 |
| 동기(Synchronous)와 비동기(Asynchronous)의 차이점 (0) | 2025.06.24 |
| 백엔드 vs 프론트엔드 (1) | 2025.06.24 |