ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 의존성 주입(Dependecy Injection) 이란?
    Computer Science 2020. 12. 17. 01:55

    의존성 주입(DI, Dependency Injection)이란?

    하나의 객체에 다른 객체의 의존성을 제공하는 기술이다.

     

    의존성: 객체 지향에서 두 클래스 간의 관계이다. 둘 중 하나가 다른 하나를 필요로 한다.

    예를 들면, Computer 클래스는 Cpu 클래스에 의존적이다.

     

    주입: 생성자나 메서드 등을 통해 외부로 부터 생성된 객체를 전달 받는 것을 의미한다.

    public class Computer{
    
    	private CPU cpu;
        
        public void setCPU(CPU cpu){
        	this.cpu = cpu;
        }
    }

    setCPU(CPU) 메서드를 통해 외부로 부터 생성된 객체를 전달받아 멤버 변수에 할당하는 코드이다.

     

    요악하면, 의존성 주입은 "의존 관계에 있는 클래스의 객체를 외부로 부터 생성하여 주입받는다." 라고 할 수 있다.

     

    의존성 주입의 필요성

    1. 변경의 전이 : 하나의 클래스를 변경함으로써 다른 의존 관계까지 변경사항이 전이된다.

     

    Computer와 CPU의 관계를 생각해봤을 때, Computer는 CPU에 의존한다. 하지만 CPU의 타입을 바꿔야 한다면?

    CPU 클래스를 의존하던 Computer 클래스도 같이 변경해야 한다.

    public class Computer{
    
    	private A_CPU cpu;
        
        public void setCPU(A_CPU cpu){
        	this.cpu = cpu;
        }
    }

    이를 해결할 방법은 Computer가 의존하는 CPU를 interface로 만드는 것이다. interface로 만들면, Computer에서는 CPU의 타입을 변경할 필요는 없어진다.

     

    하지만, 여전히 문제점은 남아있다. CPU를 인터페이스로 변경함에 따라 변경의 전이는 최소화했지만, Computer 클래스에서 CPU 객체를 생성하고 관리하여, 또 다른 CPU를 사용한다면 또다시 Computer 클래스를 변경해야한다.

    public class Computer{
    
    	private CPU cpu;
        
        public Computer(){
        	//this.cpu = new A_CPU;
            this.cpu = new B_CPU;
        }
    }

     

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

    제어의 역전은 어떠한 일을 수행하도록 만들어진 프레임워크에 제어권을 위임함으로써 관심사를 분리하는 것을 의미한다.

    public class Computer{
    
    	private CPU cpu;
        
        public Computer(CPU cpu){
        	this.cpu = cpu;
        }
        
        public void setCPU(CPU cpu){
        	this.cpu = cpu;
        }
    }
    
    public static void main(){
    	CPU a_cpu = new A_CPU();
        Computer computer1 = new Computer(a_cpu)
        
        Computer computer2 = new Computer()
        computer2.setCPU(a_cpu)
    }

    Computer 클래스의 생성자에서 CPU 객체를 만들지 않고, 외부로부터 CPU 객체를 생성한 뒤 Computer 생성자 또는 메서드의 매개 변수로 객체를 제공한다. 기존에는 Computer가 CPU의 객체를 생성하고 관리했으나 개선된 코드에서는 CPU 객체의 생성 및 관리를 외부에 위임했다. 이를 제어의 역전이라고 한다.

     

    제어의 역전을 통해 결합도를 약하게 만들었고, Computer는 이제 CPU의 변경사항에 의해 내부 필드나 매개 변수를 수정하지 않아도 된다.

     

    의존성 주입 장단점

    장점

    1. 의존성 주입은 인터페이스 기반으로 설계되며, 코드를 유연하게 한다.
    2. 주입하는 코드만 변경하면 되어서 리팩토링이 수월하다.
    3. 단위테스트가 더욱 쉬워 진다.
    4. 클래스간 결합도를 느슨하게 한다.
    5. 인터페이스 기반으로 설계하여,  여러 개발자가 서로 사용하는 클래스를 독립적으로 개발할 수 있다. ?

    단점

    1. 간단한 프로그램을 만들 때는 번거롭다.
    2. 의존성 주입은 동작과 구성을 분리해 코드를 추적하기 어렵게 하고, 가독성을 떨어뜨릴 수 있다.
    3. 즉, 개발자는 더 많은 파일을 참조해야만 한다.
    4. Dagger2 같은 DI 프레임워크는 컴파일 타임에 어노테이션 프로세서를 이용하여 파일을 생성하므로 빌드에 시간이 조금 더 소요된다.

     


    * 어노테이션 프로세서 

    일반적으로 애노테이션에 대한 코드베이스를 검사, 수정 또는 생성하는데 사용됩니다. 본질적으로 애노테이션 프로세서는 java 컴파일러의 플러그인의 일종입니다. 

     

    www.charlezz.com/?p=1167

     

    [Android] Annotation Processor 만들기 | 찰스의 안드로이드

    Annotation이란 ? 애노테이션이란 무엇일까요? 사실 우리 모두가 이미 정의된 애노테이션을 쓰고 있습니다. 예를 들면, @Override 어노테이션을 사용하여 메소드를 재정의하고 싱글톤 패턴을 사용하

    www.charlezz.com

     

    'Computer Science' 카테고리의 다른 글

    Java Collection Framework  (0) 2020.12.21
    JVM 이해  (0) 2020.12.19
    커널(Kernel)  (0) 2020.12.09
    Garbage Collector 이해  (0) 2020.12.01
    PNG와 JPG 파일 차이  (0) 2020.11.30
Designed by Tistory.