Programming/Java, Spring

[Spring] DI / IOC란? / 의존성을 주입하는 방법

Juun 2022. 10. 11. 13:00
반응형

DI / IOC

컨테이너란?

IoC와 DI를 이해하기 전에 먼저 이해해야 할 개념이 있습니다. 그것은 바로 '컨테이너'입니다.

컨테이너란, 우리 대신 객체의 생성과 소멸 같은 부분을 전담해주는 역할을 합니다.

IoC란(Inversion of Control)?

그대로 해석을 돌리면 제어의 역전이라고 합니다.

제어는 무언가를 조종하고 다루는 것, 역전은 바뀌는 것 입니다.

즉, 무언가를 조종하고 다루는 존재가 바뀌는 것을 IoC라고 합니다.

우리는 프로그램을 다룰 때, 우리가 직접 제어를 합니다. (예를 들어 객체의 생성을 직접 한다거나)

그러나 스프링에서는 우리가 아닌 다른 존재(컨테이너)가 제어를 합니다.

결과적으로, 스프링의 객체들을 생성하고, 제어하고, 소멸하는 존재는 컨테이너라고 볼 수 있습니다.

그래서 이것을 제어의 역전이라고 합니다.

DI(의존성 주입)란?

DI는 의존성을 주입시켜준다는 의미입니다.

객체를 직접 생성하는게 아니라 외부에서 생성한 후 주입을 시켜주는 방식입니다.

즉, 객체를 직접 생성하지 않고, 외부에서 생성된 객체를 getter() 혹은 생성자를 이용해서 사용하며 이걸 '주입' 한다고 합니다.

DI를 사용하는 이유

DI를 하지 않으면 객체와 객체 간의 결합력이 강하기 때문에 객체가 바뀌게 되면 많은 수정을 해야하는 번거로움이 있기 때문입니다.

public class A {
	private B b;

	public A() {
			this.b = new B();
		}
	
	public void printHello() {
		this.b.hello();
	}
	
}

위 코드를 보면 A 클래스에서 printHello 메서드가 호출하려면 B 클래스가 필요합니다.

그래서 ‘A클래스는 B 클래스에 의존한다.’ , ‘A클래스는 B클래스의 의존성을 가진다’ 라고 할 수 있습니다.

위 코드는 결합도가 높다고 할 수 있습니다.

왜냐하면 B 클래스가 수정되면 A클래스도 B 클래스의 수정부분을 똑같이 바꿔줘야하기 때문입니다.


의존성을 주입하는 방법

1. 스프링 어노테이션

의존성을 주입하는 방법은 크게 두가지가 있습니다.

과거부터 사용해오던 XML 설정방식과 스프링에서 제공해주는 어노테이션 @AutoWired를 활용한 방식입니다.

먼저 스프링 어노테이션인 @AutoWired 방식을 살펴보겠습니다

  1. 생성자 주입
public class A{
	private B b;

	@AutoWired
	public A(B b){
		this.b = b;
	}
	public void printHello() {
		this.b.hello();
	}
}
  1. Setter 주입
public class A {
	private B b;
	
	@AutoWired
	public void setB(B b){
		this.b = b;
	}

	public void printHello(){
		this.b.hello();
	}
}
  1. Field 주입
public class A {

	@AutoWired
	private B b;
	
	public void printHello() {
		this.b.hello();
	}
}

@AutoWired를 붙인다면 어떠한 클래스를 갖다 쓸 수 있지 않습니다!

스프링 IoC 컨테이너에 들어있는 Bean 객체에서만 사용할 수 있습니다.

반응형