본문 바로가기
Backend/SpringBoot

의존성 주입( Dependency Injection, Di ..)

by burning-man 2024. 8. 26.

개요

의존성 주입이란, 객체가 필요한 의존성을 외부에서 전달받는 것이다. 스프링에서는 이 괒어을 컨테이너가 자동으로 처리해주기 때문에, 개발자는 객체 생성이나 의존성 관리에 대해 신경쓰지 않고 애플리케이션 로직에만 집중할 수 있다.

예시

평화로운 주말 오후 나는 커피를 마시고 싶다. 커피를 만들기 귀찮으므로 원두를 씹어먹을수도 있겠지만(?) 정제된 커피가 먹고 싶다.

커피를 위해서 필요한건 커피머신, 원두, 물, 컵 등이 있다.

  1. 의존성
    1. 커피머신만 있다고 해서 커피를 얻을 수 없다.
    2. 커피머신으로 커피를 만들기 위해서는 재료들이 제공 되어야한다.
    3. 커피머신은 재료인 원두, 물, 컵 등에 의존적이다
  2. 의존성 주입

나는(스프링 컨테이너) 커피 머신에 필요한 재료들을 미리 준비하고, 커피 머신에 넣어준다. → 이것이 바로 의존성 주입이다.

커피 머신이 재료를 직접 찾지 않고, 내가 준비해준 재료들로 바로 커피를 만들 수 있게 돕는 것이다.

프로그래밍에서는..

프로그래밍에서 객체들이 협력하려면, 하나의 객체가 다른 객체를 필요로 하는 경우가 많다.

이 때 필요한 객체를 직접 생성하지 않고, 외부에서 전달 받는 방식이 의존성 주입이다.

public class CoffeeMachine {

	private CoffeeBean coffeBean;
	private Water water;
	
	public CoffeeMachine (CoffeeBean coffeeBean, Water water){
		this.coffeBean = coffeeBean;
		this.water = water;
	}
	
	public void makeCoffee() {
		System.out.println("Making coffee with" + coffeeBean + "and" + water);
	}
}
  1. 의존성
    1. CoffeeMachine 클래스는 CoffeeBean 클래스와 Water에 의존한다. 이 두 객체가 없으면 CoffeeMachine은 제대로 작동하지 않는다.
  2. 의존성 주입
    1. CoffeeMachine 객체를 생성할 떄, 필요한 CoffeeBean과 Water 객체를 생성자에 전달한다.
    2. 스프링에서는 이 작업을 컨테이너가 대신 해준다.
    3. 즉, CoffeeMachine 이 직접 CoffeeBean과 Water를 생성하는게 아니라 외부에서 주입받아서 사용한다.

결론

  • 스프링은 이런 의존성 주입 과정을 컨테이너가 자동으로 처리해주기 때문에 개발자는 비즈니스 로직에만 집중하면 된다.
  • → 위의 예시에서는 내가 스프링 컨테이너의 역할이다.
  • 의존성 주입은 객체 간의 결합도를 낮추고, 유연한 애플리케이션 설계가 가능하게 한다.