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