Spring 컨테이너 (DI,IoC)

witwint·2022년 9월 30일
0

Spring 컨테이너 (DI,IoC)


Spring 컨테이너

스프링 컨테이너는 스프링에서 자바 객체들을 관리하는 공간을 말합니다. 자바 객체를 스프링에선 빈(Bean)이라고 하는데, 스프링 컨테이너에서는 이 빈의 생성부터 소멸까지를 개발자 대신 관리해주는 곳이라고 할 수 있습니다.

쉽게 이해하기위해 DI(Dependency Injection)의 예시로 이해해보겠습니다.


DI(Dependency Injection)

Comopsition has a

class A {
	private B b;

	public A() {
		b = new B();
    }
}

B가 A가 생성될때 자동생성되어 이코드를 바꾸지않는 한 A안에 B가 묶여있음

Association has a

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(Inversion of Control)

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/

profile
("Hello World!");

0개의 댓글