Spring Practice

DI란? (Dependency Injection)

박은유 2024. 4. 10. 21:16
반응형

DI란 무엇인가요?

 : DI는 의존성 주입을 의미하며, 객체가 필요로 하는 의존성을 외부에서 주입받는 디자인 패턴입니다.

 

예시를 들어보겠습니다.

 

DI 사용 X

public class Coffee {...}

public class Programmer {
	private Coffee coffee = new Coffee();

	public startProgramming(){
		this.coffee.drink()
	}
}

 

여기서 Programmer객체는 Coffee객체가 필요해서 Coffee객체를 생성했습니다.
Programmer객체는 Coffee객체에 의존하고 있다. 라고 설명할 수 있습니다.

만약, Coffee객체가 아닌 Cappuccino, Americano객체를 사용하고 싶다면 해당 코드는 수정해야 합니다.
결합도(coupling)이 높아지게 되어 코드의 재활용성등 문제가 많아집니다.

DI 사용

public class Coffee {...}
public class Cappuccino extends Coffee {...}
public class Americano extends Coffee {...}

public class Programmer {
	private Coffee coffee;

	public Programmer(Coffee coffee){
		this.coffee = coffee
	}

	public startProgramming(){
		this.coffee.drink()
	}
}

 

이 코드를 보면 Programmer객체에 Coffee라는 객체를 "주입"해주는 것을 알 수 있습니다.
이렇게 함으로서 Programmer객체가 Cappuccino를 마시는 중이라면, Cappuccino객체를 Programmer에 넘겨주어 생성하면 됩니다. Americano를 마시고 싶다면 똑같이 하면 됩니다! 코드를 계속해서 재사용할 수 있게 되는 것이죠.

Q

  1. DI의 장점은 무엇인가요?
  2. DI를 구현하기 위해 어떤 방법들이 있고, 각각의 차이점은 무엇인가요?
  3. DI를 사용하면 어떻게 코드의 유지보수성과 테스트 용이성을 향상시킬 수 있나요?
  4. DI 컨테이너(container)의 역할은 무엇이며, 어떻게 동작하나요?
  5. 생성자 주입(Constructor Injection), 세터 주입(Setter Injection), 필드 주입(Field Injection)의 차이점과 각각의 장단점은 무엇인가요?
  6. DI 주입 방식을 선택할 때 어떤 요소들을 고려해야 하나요?
  7. DI를 적용한 시스템에서의 유연성과 확장성에 대해 설명해주세요.
  8. DI와 의존성 역전(Inversion of Control, IoC)의 관계는 무엇이며, 어떻게 서로 다른 개념인가요?
  9. DI를 사용할 때 발생할 수 있는 주요 문제점들은 무엇이 있으며, 이러한 문제들을 해결하기 위한 전략은 무엇인가요?
  10. DI를 적용한 프로젝트에서 발생한 경험을 공유하고, 그로 인해 얻은 교훈은 무엇인가요?

A

  1. DI의 장점은 코드의 유연성과 재사용성을 향상시키며, 주입된 의존성을 변경하기 쉽게 만듭니다.
  2. DI를 구현하는 방법으로는 생성자 주입, 세터 주입, 필드 주입 등이 있으며, 각각의 장단점이 있습니다.
  3. DI를 사용하면 코드의 결합도를 낮추어 유지보수성과 테스트 용이성을 향상시킬 수 있습니다.
  4. DI 컨테이너는 객체의 생명주기를 관리하고 의존성을 주입하는 역할을 합니다. 대표적으로 Spring Framework의 ApplicationContext가 DI 컨테이너의 예시입니다.
  5. 생성자 주입은 객체 생성 시점에 의존성을 주입하며, 세터 주입은 세터 메서드를 통해 주입하고, 필드 주입은 필드에 직접 주입합니다. 생성자 주입은 불변성을 보장하고, 필드 주입은 코드 가독성을 낮출 수 있습니다.
  6. DI 주입 방식을 선택할 때는 의존성의 복잡성, 테스트 용이성, 코드 가독성 등을 고려해야 합니다.
  7. DI를 적용한 시스템에서는 객체 간의 결합도가 낮아져 쉬운 유지보수와 확장이 가능해집니다.
  8. DI와 IoC는 서로 밀접한 관계를 가지고 있으나, DI는 의존성 주입에 초점을 두고 있는 반면 IoC는 제어의 역전 개념을 포함하고 있습니다.
  9. DI를 사용할 때 주의할 점은 순환 의존성, 너무 많은 의존성 주입, 테스트용 객체와 실제 객체의 분리 등이 있으며, 이를 해결하기 위해 인터페이스 추상화와 Mocking 등의 전략을 사용합니다.
  10. DI를 적용한 프로젝트에서는 코드의 유연성과 테스트 용이성을 경험했으며, 인터페이스와 의존성 주입을 통한 코드의 확장성을 깨달았습니다.
반응형