Spring Framework - IoC(Inversion of Control)

DY·2023년 5월 15일
0

IoC : Inversion of Control(제어권의 역전)

일반적으로 클래스에서 필요한 특정 타입에 대해 의존성이 필요한 경우(특정 타입의 Bean을 사용하려고 하는 경우) 해당 클래스에서 신규 생성을 하지만, Spring Framework에서는 객체에 대한 의존성을 직접 관리하며, 의존성 주입(DI : Dependency Injection)을 통해 의존성이 필요한 곳에 미리 생성해 둔 객체를 주입한다. Spring에서는 IoC Container에서 이러한 역할을 수행하고 있다.

IoC Container는 Spring 기반의 프로젝트에서 특정 annotation이 붙은 Bean들의 의존성을 관리한다. Bean들을 미리 생성해 두기도 하고, 의존성 주입이 필요한 경우 대상이 되는 Bean을 주입해 주기도 한다. ApplicationContext에서 생성된 Bean들을 확인할 수 있다. 의존성 주입은 IoC Container에 등록된 Bean에 한해 가능하다.

Bean

IoC Container가 관리하는 객체이다. ApplicationContext가 만들어서 담고 있는 객체를 의미한다. new 키워드를 사용하여 새 객체를 생성한 경우, 이 객체는 Bean이 아니다. IoC Container에 Bean을 등록하려면 1) Component Scan, 2) XML 등록을 하는 방법이 있다. Component Scan을 통해 Bean을 등록하려면 특정 annotation이 붙은 클래스를 만들면 되는데, @Component가 포함된 annotation을 사용하면 된다. 이러한 annotation으로 Controller, Service, Configuration 혹은 직접 Component annotation을 사용할 수 있다.

의존성 주입(Dependency Injection)

Autowired annotation을 이용하여 의존성을 주입할 수 있다. 의존성은 Field/Setter/Constructor Injection이 가능하며 Spring 4.3 버전부터는 Constructor Injection을 하는 경우 Autowired annotation을 생략할 수 있다. Field/Setter Injection을 하는 경우 final 키워드를 사용할 수 없다. Spring에서는 Constructor Injection을 권장하는데, 특정 Bean의 생성을 강제할 수 있고, 순환참조를 방지할 수 있기 때문이다.
(순환참조 : 두 개의 Bean이 서로를 참조함/의존성을 가짐. Stack overflow가 발생할 수 있음)

예시

Java에서 일반적인 경우, 특정 타입의 객체가 필요하다면 아래와 같이 new 키워드를 이용하여 생성할 것이다.

ProductRepository product = new ProductRepository();

Spring에서는 해당 Repository를 이미 IoC Container에서 관리하고 있기 때문에, 아래와 같이 코드를 작성하면 new 키워드를 이용하여 새로이 객체를 생성할 필요 없이 해당 타입에 맞는 Repository의 의존성을 주입해준다.
예시 1번과 2번은 Autowired라는 annotation을 사용하였으며 각각 필드(Field) 주입, 수정자(Setter) 주입이라고 하며, 예시 3번은 서비스의 생성자에 의존성 주입 대상을 선언한 경우이다.

ex1)

@Autowired
private ProductRepository product;

ex2)

private ProductRepository product;

@Autowired
public setProductRepository(ProductRepository product) {
	this.product = product;
}

ex3)

private final ProductRepository product;

public ProductService(ProductRepository product) {
	this.product = product;
}

참고한 자료
백기선 - 예제로 배우는 스프링 입문
https://www.youtube.com/playlist?list=PLfI752FpVCS8_5t29DWnsrL9NudvKDAKY

0개의 댓글

관련 채용 정보