제어
public class A {
private B b;
public A() {
this.b = new B();
}
}
public class A {
private B b;
public A(B b) {
this.b = b;
}
}
IoC 왜 필요할까? 객체지향 원칙을 잘 지키기 위함
Hollywood Principle(할리우드 법칙) : 주도권을 빼앗기고 호출당하기를 기다리는것과 유사하여 할리우드 법칙으로 불리기도 함
DIP(Dependency Inversion Principle) : 의존 역전 법칙
(빵의 종류가 Bread라는 상위 의존-> 역전)
IoC와 DIP 목적
IoC와 DIP 모두 Principle(원칙) 이다.
IoC 방법 : DI(Dependency Injection - 의존성 주입), 팩토리, 템플릿 메소드 등의 방법이 있으나 영상에서는 DI설명
의존성 : 클래스 간 의존 관계가 있다는 것
주입 방법
의존성을 주입하는 방법을 알아봤지만, 각각의 속성들을 변경하고 싶을때는 어떻게 해야할까? DIP 이용
ex) 화이트브레드 -> 다른 빵으로 변경
public class ItalianBMT {
WhiteBread whiteBread;
MozzarellaCheese mozzarellaCheese;
ChiliSauce chiliSauce;
MayonnaiseSuace mayonnaiseSauce;
public ItalianBMT(WhiteBread whiteBread, MozzarellaCheese mozzarellaCheese, ChiliSauce chiliSauce, MayonnaiseSuace mayonnaiseSauce) {
this.whiteBread = whiteBread;
this.mozzarellaCheese = mozzarellaCheese;
this.chiliSauce = chiliSauce;
this.mayonnaiseSauce = mayonnaiseSauce;
}
}
public class ItalianBMT {
Bread bread;
Cheese cheese;
List<Sauce> sauces;
public ItalianBMT(Bread bread, Cheese cheese, List<Sauce> sauces) {
this.bread = bread;
this.cheese = cheese;
this.sauces = sauces;
}
}
DIP로 의존 관계를 분리할 시 각각의 속성이 변화로부터 자유로움
IoC와 DIP는 원칙 / DI는 IoC를 달성하는 디자인 패턴 중 하나
Spring DI 방법 -> 자동주입 : 스프링 빈으로 등록되면 스프링이 자동으로 생성, 필요한 의존성도 주입
@Autowired 어노테이션 활용 : 여기에 의존성을 주입해줘! 하는 의미
Setter주입
생성자주입
생성자가 여러개라면?
의존성 주입 대상이 여러 개일 때 -> 타입 검색 후 여러개라면 bean의 이름을 기준으로 의존성 주입
-> 네이버/카카오가 구현되어 있다면, naver라는 이름보고 주입
-> 그러나 이러면 naver만 주입됨 (수동으로 카카오 넣어줘야하는 등 번거로움)
-> @Qualifier 어노테이션 활용(해당 빈의 구분자 지정 가능)
-> @Primary 어노테이션 활용 -> 우선주입
-> Qualifier와 @Primary 둘다 있다면 Qualifier가 우선순위를 가짐
의존성 주입 기준 : 타입 -> Qualifier -> Primary -> 변수명