Spring

Spring IoC와 DI


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