[Spring]DI와 IOC란?

Hwangro Lee
3 min readMar 7, 2021

--

스프링에서 중요 개념인 DI와 IOC에 대해서 공부해보았습니다.

1. DI(Dependency Injection)

직역하면 의존성 주입이라고 합니다. DI 개념은 스프링에서만 사용하는 개념이 아닌 객체지향 프로그래밍에서 사용하는 개념입니다. 단어만 보면 정확히 어떤 개념? 느낌인지 감이 잘 오지 않더라구요.

class Cat {
private Dog dog;
public Cat() {
this.dog = new Dog();
}
}
class Dog {
public Dog() {}
}

위 코드에서 Cat 클래스 내에서 Dog 객체를 생성하였습니다. 이 경우 Cat는 Dog에 의존성을 가지고 있다. 라고 표현합니다. 이때 Dog 클래스의 이름이 Bear로 바뀐다면 Cat 클래스도 수정되어야 합니다. 이 처럼 Cat 클래스와 Dog 클래스 사이에는 강한 결합력 이 생깁니다. 낮은 결합력과 높은 응집도를 목적으로 하는 모듈화 작업에 해를 가하게 됩니다.

이러한 이유 때문에 의존성 주입이 이러한 프로그래밍을 방지하고자 미리 Dog의 객체를 만들어 두고 Cat 클래스에 주입하는 방법을 사용 할 수있습니다. 이것을 Dependency Injection 이라고 합니다.

이러한 방식으로 미리생성된 객체를 Bean이라고 하며 Bean을 관리하는 곳이 IOC Container 입니다. 또한 Bean을 저장된 곳은 Bean container 입니다.

2. IOC Container

Bean을 관리하는 곳이 IOC Container라고 하며 Bean을 생성하는 방법에는 Xml, Annotation을 사용하는 방법이 있습니다. Xml로 선언할 경우 Bean이 많으면 유지 관리가 상당히 힘들기때문에 Annotation으로 Bean을 생성하여 사용하는 편이다.

IOC Container에 대해서 공부하다보면 ApplicationContext와 BeanFactory 인터페이스가 핵심임을 알 수 있습니다. 이 두 인터페이스는 스프링을 받치는 핵심 인터페이스입니다. ApplicationContext는 BeanFactory를 상속받고 있습니다.

공부를 하다보니 ApplicationContext은 Bean을 즉시 생성하며 BeanFactory는 지연하여 생성한다고 합니다.

참고

--

--