DI (의존성 주입)

Ek·2022년 1월 30일
0

CS

목록 보기
1/7
post-custom-banner

DI(의존성 주입)이란?

  • DI란 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴으로, 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.
  • 즉, 각 객체간의 의존성을 스프링 컨테이너(Spring Container)가 자동으로 연결해주는 것으로, 개발자가 빈(Bean) 설정파일에 의존관계가 필요한 정보를 추가해주면, 스프링 컨테이너가 자동적으로 연결해 준다
  • 의존성이란 한 객체가 다른 객체를 사용할 때 의존성이 있다고 한다.
  • 의존성 주입은 IoC(Inversion of Control: 제어의 역전)원칙 하에 객체 간의 결합을 약하게 해주고 유지보수가 좋은 코드를 만들어 준다. 또한 의존성 주입은 개발자들이 객체를 생성하는 번거로움과 다양한 케이스를 고려하는 겨우를 줄이고, 변수 사용과 개발에 더욱이 집중할 수있게 해준다.

DI(의존성 주입)를 사용하는 이유?

  1. 재사용성을 높여준다.

  2. 테스트에 용이하다.

  3. 코드를 단순화 시켜준다.

  4. 사용하는 이유를 파악하기 수월하고 코드가 읽기 쉬워지는 점이 있다.

  5. 종속성이 감소하기 때문에 변경에 민감하지 않다.

  6. 결합도(coupling)는 낮추면서 유연성과 확장성은 향상 시킬 수 있다.

  7. 객체간의 의존관계를 설정할 수 있다.

스프링에서 의존성을 주입하는 방법

  • 생성자에서 주입
  • 필드에서 주입
  • setter 에서 주입

ex)

Store 객체가 Pencil 객체를 사용하고 있는 경우에 우리는 Store객체가 Pencil 객체에 의존성이 있다고 표현한다.

public class Store { 
	private Pencil pencil; 
}
  • 두 객체 간의 관계(의존성)를 맺어주는 것을 의존성 주입이라고 하며 생성자 주입, 필드 주입, 수정자 주입 등 다양한 주입 방법이 있다. Spring 4부터는 생성자 주입을 강력히 권장하고 있다.

ex) DI가 필요한 이유

public class Pencil {

}
public class Store { 
	private Pencil pencil; 

public Store() { 
	this.pencil = new Pencil(); 
	} 
}

1. 두 클래스가 강하게 결합되어 있음

2. 객체들 간의 관계가 아니라 클래스 간의 관계가 맺어지고 있음

: 위와 같은 문제점이 발생하는 근본적인 이유는 Store에서 불필요하게 어떤 제품을 판매할 지에 대한 관심이 분리되지 않았기 때문이다.

ex)의존성 주입(Dependency Injection)을 통한 문제 해결

  • 문제를 해결하기 위해서는 우선 다형성이 필요하다. Pencil, Food 등 여러 가지 제품을 하나로 표현하기 위해서는 Product 라는 Interface가 필요하다. 그리고 Pencil에서 Product 인터페이스를 우선 구현해주도록 하자.
public interface Product {

}
public class Pencil implements Product {

 }
  • Store와 Pencil이 강하게 결합되어 있는 부분을 제거해주어야 한다. 이를 제거하기 위해서는 다음과 같이 외부에서 상품을 주입(Injection)받아야 한다
public class Store { 
	private Product product; 

public Store(Product product) { 
	this.product = product; 
	} 
}
  • 여기서 Spring이 DI 컨테이너를 필요로 하는 이유를 알 수 있는데, 우선 Store에서 Product 객체를 주입하기 위해서는 애플리케이션 실행 시점에 필요한 객체(빈)를 생성해야 하며, 의존성이 있는 두 객체를 연결하기 위해 한 객체를 다른 객체로 주입시켜야 하기 때문이다.

  • 예를 들어 다음과 같이 Pencil 이라는 객체를 만들고, 그 객체를 Store로 주입시켜주는 역할을 위해 DI 컨테이너가 필요하게 된 것이다.

public class BeanFactory { 
	public void store() { 
// Bean의 생성 
	Product pencil = new Pencil(); 

// 의존성 주입 
	Store store = new Store(pencil); 
	} 
}
  • 이러한 개념은 제어의 역전(Inversion of Control, IoC)라고 불리기도 한다.

  • 어떠한 객체를 사용할지에 대한 책임이 BeanFactory와 같은 클래스에게 넘어갔고, 자신은 수동적으로 주입받는 객체를 사용하기 때문이다. (실제 Spring에서는 BeanFactory를 확장한 Application Context를 사용한다.)

출처:https://mangkyu.tistory.com/150

profile
hello~
post-custom-banner

0개의 댓글