스프링 컨테이너는 스프링에서 자바 객체들을 관리하는 공간을 말합니다. 자바 객체를 스프링에선 빈(Bean)이라고 하는데, 스프링 컨테이너에서는 이 빈의 생성부터 소멸까지를 개발자 대신 관리해주는 곳이라고 할 수 있습니다.
쉽게 이해하기위해 DI(Dependency Injection)의 예시로 이해해보겠습니다.
class A {
private B b;
public A() {
b = new B();
}
}
B가 A가 생성될때 자동생성되어 이코드를 바꾸지않는 한 A안에 B가 묶여있음
class A {
private B b;
public A() {
}
public void setB(B b) {
this.b = b;
}
}
B를 외부에서 생성에서 A가 쓰는 방식
//Comopsition has a
A a = new A();
//Association has a
B b = new B();
A a = new A();
a.setB(b);
후자는 언제든지 B를 다른 객체로 바꾸기 편함
이때 생성해야하는 부품같은 B b = new B();
를 Dependency라고하며
a.setB(b);
이과정을 Injection이라 표현한것
다만 이런 과정의 단점이라면 코드가 길어지고 내가 다 끼워줘야하는데 DI 이것을 누가 자동으로 해준다? == 스프링 컨테이너
IoC는 스프링 컨테이너가 Dependency Injection하는 방향을 말하는것과 같은데
class A {
private B b;
public A() {
}
public void setB(B b) {
this.b = b;
}
}
이런 과정이 A > B > C > D있는 상황에서 사용자가 A()를 부르게되면
A 생성 > B필요? B생성 > C필요? C생성 ... 이런과정으로 위에서부터 내려가게된다.
하지만 스프링 빈으로 미리다 등록해두고 어노테이션이나 xml로 관계를 등록시켜준다면
class A {
private B b;
public A() {
}
public void setB(B b) {
this.b = b;
}
}
이런 상황에서 A > B > C > D관계일때
스프링컨테이너는 D < C < B < A이런식으로 가작 작은 단위부터 조립해준다.
Dependency Injection를 해주는데 이 조립순서를 강조하고싶어서 Inversion of Control이라고 하는것이다.
스프링 컨테이너는 객체지향적으로 작성한 코드에 DI(Dependency Injection)를 IoC(Inversion of Control)방식으로 자동으로 해주려고
@Bean 등록이나 @Component,@Autowired 를 이용해 뭐가 뭐랑 어떻게 연결되어있는지 주문서를 던저줘야하는것이다.
그럼 그러한 관계들만 유지보수할수있는 곳이 생기고 지정해주면 다 알아서해준다.
참고사이트
https://www.youtube.com/watch?v=QrIp5zc6Bo4&t=332s
https://www.youtube.com/watch?v=WjsDN_aFfyw
https://velog.io/@tank3a/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%99%80-%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B9%88
https://jobjava00.github.io/language/java/framework/spring/container/