1. Spring IoC란?
IoC란 (Inversion of Control)이라고 하고 제어의 역전이라고 한다.
제어의 역전이란 뭘까? 단어만 봐서는 쉽게 이해가 가지 않는다, 제어권이 바뀌었다 라고 생각하겠다.
이 말은 즉 기존의 제어 방식을 뒤집고 사용한다는 뜻이다.
기존의 방식은 사용자가 작성한 코드가 라이브러리를 호출하고, 객체 간의 의존성 관계를 연결하는 것 또한 제어권이 사용자가 가지고 있었다. 하지만 IoC를 사용하고 난 후는 프레임워크가 프로그램의 흐름을 제어하고 사용자 지정 코드를 호출할 수 있게 되는 것이다.
이를 가능하게 하기 위하여 프레임워크는 내장된 추상화를 사용합니다. 이 부분은 뒤에서 자세히 보겠습니다.
2. 왜? 사용하는가
OOP프로그래밍에서는 끝이라는 개념이 없다. 설계가 바뀔 수도 있고 코드가 바뀔수도 있다 왜냐하면 요구사항이 언제든지 바뀔수 있기 때문이다, 그렇기 때문에 작업을 할 때 필요한 작업을 최소화하는 방법은 분리와 확장을 고려한 설계를 하는 것이다.
이러한 점에서 Spring IoC는 작업 실행을 구현에서 분리, 서로 다른 구현 간에 쉽게 전환을 할 수 있고, 프로그램의 더 큰 모듈성등 많은 장점이 있는 스프링의 핵심 아키텍처이다.
3. DI (의존성 주입)
DI(의존성 주입)이란 IoC를 구현하는 데 사용할 수 있는 패턴이다. 객체를 직접 생성하는 게 아니라 외부에서 생성한 뒤 주입하는 방법이다. 개체를 다른 개체와 연결하거나 개체를 주입하는 것은 개체 자체가 아니라 어셈블러에 의해서 수행이 된다.
기존의 방식으로 객체를 종속성으로 만드는 방법은 아래와 같다
public class Cafe {
private Coffe coffe;
public Cafe() {
coffe = new Coffe();
}
}
위의 방법은 cafe클래스 내부에서 coffe라는 객체를 생성하였기 때문에 의존성을 주입받은 것이 아닌 의존성을 스스로 만든 것이다.
의존성 주입을 적용한 경우
public class Cafe {
private Coffe coffe;
public Cafe(Coffe coffe) {
this.coffe =coffe;
}
}
4. Spring IoC 컨테이너
IoC컨테이너는 IoC를 구현하는 프레임워크의 일반적인 특성이다.
Spring 프레임워크에서 BeanFactory, 이를 상속한 AplicationContext는 IoC컨테이너를 나타낸다
컨테이너는 Bean으로 설정된 객체를 인스턴스화, 구성 및 조합을 하는 역할을 한다.
5. Spring의 의존성 주입 방법
spring의 의존성 주입방법은 생성자, setter, 필드를 통한 의존성 주입이 있다.
첫 번째는 생성자 기반 종속성 주입이다.
@Configuration
public class Appconfig {
@Bean
public Coffe coffe() {
return new Coffe1();
}
@Bean
public Cafe cafe() {
return new Cafe(coffe1());
}
}
두 번째는 setter를 사용하는 방법이다.
@Bean
public Cafe cafe() {
Cafe cafe = new Cafe();
cafe.setCoffe(coffe1());
return cafe;
}
세 번째는 필드 기반 종속성을 주입하는 것이다.
필드 기반 의존성 주입 경우에는 Autowired 주석으로 표시하여 종속성을 주입할 수 있다.
public class Cafe {
@Autowired
private Coffe coffe;
}
Reference
https://docs.spring.io/spring-framework/docs/current/reference/html/#beans-dependencies
https://www.baeldung.com/inversion-control-and-dependency-injection-in-spring