티스토리 뷰

1. 의존성 주입이란?

  • 의존성 주입(DI, Dependency Injection)
  • 하나의 객체의 다른 객체의 의존성을 제공하는 기술
  • 의존성과 주입
    • 의존성 : 객체 지향에서 두 클래스 간의 관계, 일반적으로 둘중 하나가 다른 하나를 필요로함
class CPU

class Computer {

    private val cpu: CPU

    init {
        cpu = CPU()
    }
}
  • 위 코드를 보면
  • 컴퓨터를 생성할 떄 CPU가 강하게 결합한다.
  • 다른 CPU로 변경이 불가능 -> 'Computer가 CPU에 의존성을 갖는다'

 

  • 주입 : 생성자나 메서드를 통해 외부로 부터 생성자 객체를 전달 받는 것
class CPU

class Computer {
    private var cpu: CPU? = null
    fun setCPU(cpu: CPU) {
        this.cpu = cpu
    }
}
  • 위 코드는 setCPU()로 부터 외부에서 생성된 객체를 받아온다
  • 즉, 의존 관계에 있는 클래스의 객체를 외부로 부터 생성하여 주입받음.

2. 의존성 주입의 필요성

  • 의존성 주입 꼭 해야하는가

변경의 전이

  • (앞서 보인 예제 코드에서)cpu를 변경하고 싶은 경우
class Computer {
    private val cpu: A_CPU

    init {
        cpu = A_CPU()
    }
}
  • CPU를 의존하고 있던 Computer 클래스의 코드 수정이 필요하게된다...
  • 하나의 클래스 변경으로 다른 의존 관계 까지 변경사항이 전달됨
  • 이를 위해 CPU를 인터페이스로 만든다면
interface CPU

class A_CPU : CPU

class Computer {
    private val cpu: CPU

    init {
        cpu = A_CPU()
        //cpu = new I_CPU()
    }
}
  • 이래도 의존성이 생긴다
  • Computer 에서 CPU를 생성하기 때문에 Computer 클래스를 어쩔수없이 변경해야함

제어의 역전(IoC, Inversion of Control)

  • 특정 일을 수행하도록 만들어진 프레임워크에 제어권을 위임 -> 관심사를 분리
class Computer {
    private var cpu: CPU? = null

    constructor() {}
    constructor(cpu: CPU) {
        this.cpu = cpu
    }

    fun setCPU(cpu: CPU) {
        this.cpu = cpu
    }
}

fun main() {
    val cpu = I_CPU()
    val computer1 = Computer(cpu)
    val computer2 = Computer()
    computer2.setCPU(cpu)
}
  • 외부로 부터 CPU를 생성해서 주입시키고 있음
  • 결합도를 낮췄다!

의존성 주입의 장단점

  • 장점
    1. 의존성 주입은 인터페이스를 기반으로 설계되며, 코드를 유연하게 함
    2. 주입하는 코드만 따로 변경하기 쉬워. 리팩토링 수월
    3. 의존성 주입을 사용하는 결과로 stub 또는 mock 객체를 사용해서 단위 테스트 하기 더 쉬워짐👍
    4. 클래스 간 결합도를 느슨하게
    5. 인터페이스 기반이므로 여러 개발자가 서로 사용하는 클래스를 독립적으로 개발 가능 (클래스간 의존하는 인터페이스만 알면됨)
  • 단점도 있다
    1. 간단한 프로그램을 만들때는 번거롭다.
    2. 동작과 구성을 분리하게 되면서 코드 추적이 어려워지고 가독성을 떨어뜨릴 수 있음 (더 많은 파일을 와리가리 해야함)
    3. Dagger2와 같은 의존성 주입 프레임워크는 컴파일 타임에 애노테이션 프로세서를 이용하여 파일을 생성하므로 빌드에 시간 소요가 좀 늘어난다.

 

  • 지속적인 유지보수가 필요한 일반적인 상용 앱의 경우에는 장점이 더욱 많다.
  • 코드 가독이 어려워지는 것은 적응하면 그래도 수월해질 수 있음. 😂

2021.07.19 - [Android/클린 아키텍처] - [Clean Architecture] 04-안드로이드 앱 설계 패턴 (MVC, MVP, MVVM)

2021.07.17 - [Android/클린 아키텍처] - [Clean Architecture] 03-안드로이드 권장 애플리케이션 설계 원칙

2021.07.16 - [Android/클린 아키텍처] - [Clean Architecture] 02-안드로이드 클린 아키텍처

 

해당 글은 '아키텍처를 알아야 앱 개발이 보인다' 를 공부하며 요약 정리한 글 입니다.
댓글
최근에 올라온 글
최근에 달린 댓글
네이버 이웃추가
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함