[안드로이드스튜디오_문화][의존성 주입]

기말 지하기포·2024년 1월 13일
0

-"의존성"이란 어떤 대상이 참조하는 객체 또는 메서드를 의미한다.

class Engine

class Car {
	val engine = Engine()
}
  • Car는 Engine에 의존하고 있다.
  • Car Class 입장에서 Engine은 의존성이 되는 것이다.



-"의존성 주입"이란 대상 객체에 의존성을 제공하는 기술을 의미한다.

class Engine

class Car {
	val engine = Engine()
}    
  • Engine 인스턴스를 생성하는 책임을 갖고 있다.



-위 코드에서 의존성을 없애는 방법

class Car (val engine : Engine) {

}
  • 이렇게 파라미터로 Engine을 받아오면 Engine을 외부에서 전달 받을 수 있어서 Car 클래스는 더 이상 Engine 클래스에 대한 책임이 없다.(제어역전)
  • 객체 생성의 책임을 내부에서 외부로 뒤집으면서 Engine에 대한 제어를 역전시키는 것이다. 이렇게 제어를 역전시킴으로서 Engine이라는 의존성을 외부에서 주입받을 수 있게 세팅을 해준다. 이 과정을 의존성 주입이라고 할 수 있다.




-의존성 주입이 가져다주는 장점

fun main(args:Array<String>) {
	val gasolineCar = Car(GasolineEngine())
    val dieselCar = Car(DieselEngine())
}    
  • 재상용성이 높다. : car 코드를 변경안해도 된다.
  • 디커플링 : 결합도가 낮아진다.
class Car(
	val engine : Engine,
    val wheels : Wheels,
    val wiper : Wiper,
    val battery : Battery
) {
	// 위에어 의존성을 주입받아서 일일히 객체를 만들어 줄 필요 X
    // 따라서 더 적은 소스 코드 사용이 가능하다.
}
  • 코드의 양을 줄 일 수 있어서 비즈니스 로직 같은 중요 코드에 집중 할 수 있다.
class CarTest {
	@Test
    fun CarTest() {
    	val car = Car(SuccessEngine())
        
    }
    
    @Test
    fun CarTest() {
    	val car = Car(FailEngine())
        
    }
}
  • 만약 Car Class가 Engine()에 대한 의존성 주입이 없었더라면

Injector

-Injector란 의존성을 클라이언트에게 제공하는 역할을 의미한다.

-보통 Injector를 통해서 의존성을 제공한다.

Injector가 없는 코드

fun mian(args:Array<String>) {
	val engine = Engine()
    val car = Car(engine)
}
  • 위 코드는 직접 Engine() 객체를 생성해서 의존성을 주입해주고 있다.

유사 Injector가 있는 코드

class Injector{
	fun getEngine(){
    	return Engine()
    }
}
fun mian(args:Array<String>) {
	val engine1 = Injector().getEngine()
    val engine2 = Injector().getEngine()
    val car1 = Car(engine1)
    val car2 = Car(engine2)
}
  • 위 코드는 유사 Injector를 사용한 코드인데 , getEngine()을 호출해서 Engine 객체를 메인함수에서 사용 할 수 있게 도와준다.

  • 그러나 Injector().getEngine()을 호출 할 때마다 반환되는 Engine()은 서로 다른 객체이다. 이렇게 생성하면 관리하기가 너무 불편하다.

유사 Injector가 있는 코드

class Injector{
	val engine = Engine()
}
fun mian(args:Array<String>) {
	val injector = Injector()
	val engine1 = Injector().engine()
    val engine2 = Injector().engine()
    val car1 = Car(engine1)
    val car2 = Car(engine2)
}
  • 위 코드에서 engine() 은 모두 같은 객체이기 때문에 자원 공유가 가능하다.

Injector의 또 다른 명칭들

-Container
-Assembler
-Provider
-Factory

의존성 주입의 장점

1.클래스간의 결합도가 낮아진다.(디커플링)

2.재사용성이 높아진다.

3.보일러플레이트가 감소한다.

4.테스트가 용이하다.

5.자원의 공유와 동시에 의존성 관리가 용이하다.

profile
포기하지 말기

0개의 댓글