Spring

[Spring] 의존성(Dependency), 의존 관계 주입(Dependency Injection)

웹코린이 2023. 8. 5. 22:20
728x90

DI란 ?

DI는 Dependency Injection의 줄임말로 의존 관계 주입이라는 의미를 나타낸다.

 

 

의존 관계란 ?

의존 관계란 의존 대상 a 가 변할 때, 그것이 b에게 영향을 미칠 때 b는 a와 의존 관계라고 한다.

 

 

의존 관계 주입(DI)란 ?

DI는 의존 관계를 외부에서 주입해주는 것을 말한다. DI를 담당하는 DI 컨테이너가 존재하는데 이 DI 컨테이너가 객체들 간의 의존 관계를 주입한다.

 

 

TV와 리모콘을 예시로 들어 설명하자면 먼저 TV와 리모콘을 interface를 만든다.

 

public interface TV {

}
public interface Remote {

}

 

 

 

그리고 사용할 메소드를 생성한다.

public interface TV {
	void funcA(); // 사용할 메소드 1
    void funcB(); // 사용할 메소드 2
}
public interface Remote {
	void funcA(); // 사용할 메소드 1
    void funcB(); // 사용할 메소드 2
}

 

 

그 후 implements를 받을 클래스를 생성한다.

public class SamsungTV implements TV{

}
public class RemoteA implements Remote {

}

 

 

메소드 구현이 강제 되므로 interface에서 생성해놓은 메소드를 구현해야 한다. 따라서 아래와 같이 구현한다.

public class SamsungTV implements TV {
	
    @Override
    public void funcA() {
    	remote.funcA();
        System.out.println("SamsungTV 전원 ON/OFF");
    }
    
    @Override
    public void funcB() {
    	remote.funcB();
    	System.out.println("SamsungTV 전원 ON/OFF");
    }
}
public class RemoteA implements Remote {
	
    @Override
    public void funcA() {
    	System.out.println("리모컨A");
    }
    
    @Override
    public void funcB() {
    	System.out.println("리모콘A");
    }
}

 

 

또한, SamsungTV 클래스에서는 remote 클래스의 메소드를 사용하고 있으므로 멤버변수로 선언해줘야 한다.

public class SamsungTV implements TV {

	private Remote remote; 
	
    @Override
    public void funcA() {
    	remote.funcA();
        System.out.println("SamsungTV 전원 ON/OFF");
    }
    
    @Override
    public void funcB() {
    	remote.funcB();
    	System.out.println("SamsungTV 전원 ON/OFF");
    }
}

 

이 때 생기는 것이 의존 관계이다. 따라서 의존 주입을 해줘야 한다.

@Component("sTV") // 객채화
public class SamsungTV implements TV {

	@Autowired // 자료형이 같은 애로 remote 의존 주입
	private Remote remote; 
	
    @Override
    public void funcA() {
    	remote.funcA();
        System.out.println("SamsungTV 전원 ON/OFF");
    }
    
    @Override
    public void funcB() {
    	remote.funcB();
    	System.out.println("SamsungTV 전원 ON/OFF");
    }
}

 

scan을 하기 위해서 applicationContext.xml 파일을 resource 파일에 생성 후 하단의 Namespaces 클릭 하여 Context를 체크한 후 Source 파일로 돌아와 <bean> 태그를 통해 scan을 요청하면 끝 !

 

<context:component-scan base-package="day59" /> 
<!-- day59를 읽어서 component(@ 어노테이션) 있는지 확인 -->

<bean calss="day59.SamsungTV" id="tv" />
<!-- 객체화 -->

 

의존 관계를 주입의 장점

 

1. 결합도가 낮아진다.
2. 유연성이 높아진다.
3. 가독성이 높아진다.

 

728x90