JAVA/Architecture

의존성 주입 Dependency Injection

호두밥 2022. 1. 11. 22:14

의존성 주입 Dependency Injection 

의존성 주입이란, 사용하는 객체를 클래스 내부에서 직접 생성/정의하지 않고, 외부에서 독립적으로 생성된 객체를 전달받아 사용하는 것을 의미한다.  

런타임(실행) 시점에 외부에서 실제 구현 객체를 전달받아 사용하는 것을 의미한다.

의존성 주입 방법

생성자 주입 Constructor Injection

생성자를 이용해 객체를 주입받는 방법을 말한다. 컴파일 타임에 의존성을 확인할 수 있다.

객체가 올바르게 생성되기 위해서, 필수적으로 주입받아야 할 객체를 명시할 수 있다. 

public class 컴퓨터(){
    private final 키보드 키보드;
    private final 모니터 모니터;
    
    //생성자 constructor
    public 컴퓨터(키보드 keyborad, 모니터 moniter){
    	this.키보드 = keyboard;
        this.모니터 = moniter;
    }
}

public class Main {
    public static void main(String[] args) {
		컴퓨터 내컴퓨터 = new 컴퓨터 ( new 저소음_적축_키보드(), new 27인치_와이드_모니터());
    }
}

Setter 주입 Setter Injection

런타임 시점에 의존성을 변경할 수 있다. (주입받은 객체를 변경할 수 있다.)

객체가 올바르게 생성되기 위해 필수적으로 주입받아야 할 객체를 명시할 수 없다. 

public class 컴퓨터(){
    private final 키보드 keyboard;
    private final 모니터 monitor;
    
    //setter
    public void setKeybord(키보드 keyboard){
    	this.keyboard = keyboard;
    }
    public void setMonitor(모니터 monitor){
    	this.monitor = monitor;
    }
}

public class Main {
    public static void main(String[] args) {
    	//객체 생성
		컴퓨터 내컴퓨터 = new 컴퓨터();
        // 의존성 주입
        내컴퓨터.setKeyboard( new 저소음_적축_키보드() );
        내컴퓨터.setMonitor( new 27인치_와이드_모니터() );
        
    }
}

메서드 주입 Method Injection

외부에서 주입받은 객체가 특정 메소드에서만 사용된다면 (일시적), 메소드의 매개변수로 주입받아 사용하도록 하는 것이 더 나은 방법일 수 있다. 

public class 컴퓨터(){
    private final 키보드 keyboard;
    private final 모니터 monitor;
    private final int powerConsumption = 100;
    
    //메소드 주입
	private void 예상_사용전기량_계산하기(키보드 keyboard, 모니터 monitor){
    	return powerConsumption 
        	+ keyboard.getPowerConsumption() 
            + monitor.getPowerConsumption();
    }
}

public class Main {
    public static void main(String[] args) {
        컴퓨터 myComputer = new 내컴퓨터();
        int powerConsumption = myComputer.예상_사용전기량_계산하기(
        			new 저소음_적축_키보드(), new 27인치_와이드_모니터());
    }
}

 

참고자료

  • 조영호, 오브젝트, 위키북스
  • 김영한, 스프링 핵심원리 - 기본편, 인프런