객체 의존관계를 '외부'에서 넣어주는 것을 의존성 주입이라 합니다.
주입될 의존성은 스프링 컨테이너에서 관리되는 빈(Bean)이어야 하며 이를 통해 객체 간의 결합도를 낮추고 유연성을 높일 수 있습니다.
@Autowired 어노테이션은 스프링 컨테이너에서 (연관된 객체) 해당 타입의 빈을 찾아서 주입합니다.
의존성 주입 X : Composition has a
결합도가 강하고 매번 new 객체 생성해야 해서 유지보수성이 떨어집니다.
class A {
B b;
public A() {
b = new B();
}
}
의존성 주입 O : Association has a
class A {
B b; // DI
public void setB(B b) { // Setter Injection
this.b = b; //외부에서 클래스 B의 인스턴스를 받아서 b 멤버 변수에 할당합니다.
}
public A(B b) { // Construction Injection
this.b = b;
}
}
class Main {
public void something() {
B b = new B(); // 보통 이렇게 선언 후 -> 할당하는데, IOC는 할당 후 -> 선언해서 가져다 씁니다.
// ----- Setter Injection ----- //
A a = new A();
a.setB(b); // 클래스 A의 setB 메서드를 사용하여 클래스 B의 인스턴스를 클래스 A에 주입합니다.
// 이제 클래스 A는 클래스 B의 인스턴스를 사용할 수 있습니다.
// IOC에서 관리해줍니다.
// -------------------------- //
// ----- Construction Injection ----- //
A a = new A(b);
}
}
객체 생성과 관리의 제어를 관리자가 아닌 프레임워크가 담당함을 의미합니다.
new DataSource() 하지 않고 ds가 null인데
어떻게 ds.getConnection()을 할 수 있냐면
DataSource가 Interface이고
@Autowired로 의존성을 주입 받았기 때문입니다.
DataSource의 몸통은 root-context.xml에 bean객체로 정의되어 있습니다.
객체를 선언한 후 할당하는 것이 일반적인 순서라면,
스프링에서 할당을 먼저한 후 선언하는 것을 제어의 역전(IOC)이라고 합니다.
따라서 DataSource ds;
선언문은 먼저 할당된 bean객체를 통해 ds.getConnection()을 가능하게 합니다.
애플리케이션에 공통적으로 나타나는 부가적인 기능들을 독립적으로 모듈화 하는 프로그래밍 모델입니다.
//추가 예정
@Transactional
프록시