[ SpringBoot ] 의존성 주입

devK08·2024년 9월 27일

SpringBoot

목록 보기
1/9

의존성 주입이란?

필요한 객체를 직접 생성하거나 찾지 않고 외부에서 넣어주는 방식

객체의 의존관계를 내부에서 결정하는 것이 아니라 객체 외부에서, 런타임 시점에 결정하는 방식

왜 의존성을 주입할까?

Cake라는 객체를 가지고 있는 Bakery 클래스가 있다고 생각해보자.

// Not Dependency Injection Code

public class Bakery {

    private Cake cake;
    
    public Bakery() {
        this.cake = new Cake();
    }
    
}

public class Cake {

} 

이런 클래스는 이런 문제들이 있다

  • Bakery와 Cake 클래스가 강하게 결합됨
  • 객체들간의 관계가 아니고 클래스간의 관계가 맺어짐.

1. Bakery와 Cake 클래스가 강하게 결합됨

만약 Cake가 아닌 Bread라는 상품을 팔게 한다면, Bakery에 생성자에 대한 수정도 필요하게 된다.
그래서 유연성이 떨어진다.

2. 객체들간의 관계가 아니고 클래스간의 관계가 맺어짐.

일단 올바른 객체지향적 설계라면, 그야 말로 객체관의 관계가 맺어져야 한다. 그런데 class에서 관계가 맺어지면, 만약 this.food를 new Cake()에서 new Bread()로 바꾸고 싶으면, 생성자 안에 있는 내용까지 모두 바꿔야한다.

이런 문제점이 발생하는 이유는 어떤 음식을 판매할 지에 대한 관심이 분리되지 않았기 때문이다.

이러한 이유 때문에 DI를 사용하여 이러한 문제점을 해결하고자 하였다.

의존성 주입을 통한 문제해결

// Food Interface 구현

public interface Food {

}

public class Cake implements Food {

}

public class Bread implements Food {

}
public class Bakery {

	private Food food;
	
	public Bakery(Food cake) {
		this.food = cake;
	}
	
}

그런데 이렇게 만들면 외부에서 Food를 주입해줘야 한다.

Bakey클래스에서 의존하지 않게 해야한다.

이러한 이유로 우리는 Spring이라는 IOC 컨테이너가 필요한 것이다.

Bakery에서 Food라는 객체를 주입하기 위해서는 애플리케이션 실행시점에 필요한 객체(빈)를 생성해야하며, 의존성이 있는 두 객체를 연결하기 위해 한 객체를 다른 객체로 주입 시켜야한다.

public class BeanFactory {
	public void bakery {
		Food cake = new Cake();
		Bakery bakery = new Bakery(cake);
	}
}

이런 부분은 스프링 프레임워크가 완벽히 지원해준다고 한다.

이러한 객체(빈)들을 저장하는 컨테이너를 IOC Container라고 부른다.

그리고 이 개념들을 제어의 역전(Inversion of Control, IoC)라고 부른다.

IOC Container에서 한 번 만들어 놓고 그것을 계속 사용하는 것을 싱글톤 패턴이라고 부른다.

참고자료

https://mangkyu.tistory.com/150

틀린 것이 보이시면 댓글 남겨주세요!!

profile
안녕하세요. 개발자 지망 고등학생입니다.

0개의 댓글