개발자 면접 노트

Spring - 의존성 주입(DI)

해로몬 2025. 6. 25. 19:04

의존성 주입(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 수정 없이 사용 가능

 


요약

의존성 주입은 객체 간의 결합을 낮추고, 추상화된 타입을 통해 더 유연하고 테스트 가능한 구조를 만들어준다.
이로 인해 객체 지향 설계 원칙을 잘 따르게 되고, 유지보수와 확장이 쉬워진다.