본문 바로가기
Android

의존성 주입이란?

by 안솝우화 2021. 8. 24.
반응형

의존성(종속성) 이란?

의존성 예시

위에 사진을 보면 ComputerClass가 CpuClass를 이용하고 있는 것을 볼 수 있습니다

 

여기서 종속성이 발생하는데 종속성이란 두 클래스가 상호 종속될 때 코드 기반에서 일어나는 상황을 의미합니다

위의 사진을 보고 저희는 2가지를 알 수 있습니다

  1. ComputerClass가 CpuClass에 의존한다
  2. CpuClass가 ComputerClass의 종속성이다

위의 두 개의 말 모두 같은 말입니다, 또한 다르게 설명하는 방법이 있습니다

바로 ComputerClass가 클라이언트CpuClass가 서비스라고 설명할 수 있습니다

위의 사진같이 말이죠, client, service 용어는 소프트웨어 설계에서 광범위하게 사용합니다

하지만 만약 아래와 같은 상황이면 "어떤 게 클라이언트고 어떤 게 서비스지? "라는 의문이 생길 수 있습니다

좀더 복잡한 시나리오

CpuClass는 ComputerClass가 사용하기 때문에 서비스라고 할 수 있습니다. 하지만 PartClass관점에서 보면 CpuClass는 클라이언트라고 할 수 있습니다.

이처럼 클라이언트, 서비스 용어는 각각의 상황마다 달라집니다, 때문에 이것을 논의할 때마다 상황의 맥락 등을 확인해야 합니다

 

 

 


클라이언트가 서비스의 참조를 얻는 방법은?

 

 

위에 사진처럼 클라이언트가 서비스에 대한 참조를 얻는 방법은 몇 가지가 있습니다

1. 클라이언트는 서비스를 인스턴스화

  • 가장 직관적인 접근 방법입니다
  • 어디에서나 볼 수 있습니다

2. 정적 메서드를 발행

3. 클라이언트가 정적 글로벌 변수에 접근하여 서비스를 참조

4. 외부에서 3번의 참조를 받는 것

 

하지만 여기서 처음 1~3번째 옵션은 기본적으로 정적 메서드 호출과 정적 전역 변수가 활성화되어 있습니다.

마지막 4번째는 외부로부터 레퍼런스를 받는 것으로 다소 수동적이라고 할 수 있고 종속성에 대한 참조가 외부에서 클라이언트로 주입되고 있습니다

 

4번째 이 방법이 바로 의존성 주입입니다!

 

이제 종속성 주입을 한 문장으로 설명해 보자면

"종속성 주입은 기본적으로 외부에서 클라이언트에게 서비스를 제공하는 것! "이라고 말할 수 있습니다

 

(의존성 주입과 종속성 주입은 번역의 차이일 뿐 둘 다 같은 말입니다)

 


의존성 주입 용어

 

 

앞에 클라이언트가 서비스를 참조하는 4가지 방법에 대해 소개했습니다. 그중 4번째 의존성 주입 방법에 대해 좀 더 자세히 알아보겠습니다

외부에서 서비스를 주입하는 방법은 3가지가 있습니다

  1. 생성자 주입
  2. 메서드 주입
  3. 필드 주입

생성자 주입

 

생성자 주입에 대해 설명해 보겠습니다. 우선 코드로 보여드리겠습니다

 

class Client(private val service1 : Service1) {
}
view raw gistfile1.txt hosted with ❤ by GitHub

 

위 코드대로 작성하면 ClientClass를 구성할 때마다 미리 초기화된 Service1 인스턴스를 제공해줘야 합니다

이것이 생성자 주입입니다!

 

메서드 주입

 

class Client(private val service1 : Service1) {
private var service2 : Service2? = null
fun setService2(service2 : Service2){
this.service2 = service2
}
}
view raw gistfile1.txt hosted with ❤ by GitHub

 

위 코드에서 service2를 먼저 선언해두고 나중에 의존성을 주입하고 싶다면 나중에 메서드로 위 코드와 같이 할 수 있습니다. 하지만 Kotlin에서는 이렇게 하는 경우가 거의 없습니다(자바에서 이렇게 한다)

코틀린에서는 대부분 생성자 주입만 사용합니다

 

반응형