제어의 역전으로 제어의 흐름을 바꾸는 것입니다.
기존에는 객체를 생성하고 의존성객체를 생성하여 의존성 객체 메소드를 호출하는 방식으로 객체가 만들어지고 실행되었다면 스프링에서는 객체 생성 후 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입하고 메소드를 호출하는 방식으로 이루어집니다.
객체의 생성부터 소멸까지의 생명주기를 컨테이너가 관리하기 때문에 제어권을 컨테이너가 소유합니다.
IoC의 주된 목적은 Application의 Dependency를 제거해서 느슨한 결합을 제공하는 것 컨테이너가 제어권을 소유함으로써 객체간 결합도를 줄이고 유연한 코드를 작성할 수 있습니다.
또한 모든 의존성 객체를 스프링이 실행될 때 전부 생성 후 필요한 곳에 주입해주므로 Bean은 싱글톤 패턴의 특징을 갖게 됩니다.
IoC의 분류
- DL : 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Look up하는 것
- DI : 각 클래스 간의 의존관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것
- Setter Injection(수정자 주입)
- Constructor Injection(생성자 주입)
- Method Injection(필드 주입)
❓DI 더 알아보기
객체를 생성, 관리하고 책임지고 의존성을 관리해주는 컨테이너를 말합니다.
인스턴스 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 대신 해줍니다.
객체관리 주체가 컨테이너가 되기 때문에 개발자는 비즈니스 로직에 집중 할 수 있습니다.
IoC컨테이너는 객체의 생성을 책임지고 의존성을 관리
POJO의 생성, 초기화, 서비스, 소멸에 대한 권한
개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡김
개발자는 비즈니스 로직에 집중
객체 생성 코드가 없어지므로 TDD가 용이
✅ POJO(Plain Old Java Object)
- 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object를 지칭하며 특정 기술에 종속되어 동작하지 않는 자바 객체입니다.
- 특정 기술의 클래스를 상속받거나 직접 의존하게 되면 확장성이 떨어지게 되고 이는 객체지향 설계의 장점을 잃어버리는 것이므로 POJO의 사용은 지향해야합니다.
IoC는 제어의 흐름을 바꾸는 것으로 객체의 생성부터 소멸까지의 생명주기를 컨테이너가 관리하게 함으로써 객체간 결합도를 줄이고 유연한 코드를 작성할 수 있도록 하는 것입니다.
📒참고
IoC 컨테이너 (Inversion of Control) 란?
스프링(Spring) DI와 IOC에 대해
[Spring] Spring IoC와 DI란?