Categories
Algorithm🧩
백준 📝
BookReview📕
CleanCode✨
Network 📨
Database 🗄
DevOps☁️
에러 일기📕
Etc💬
Fishy Fish 🎣
Spring🌱
IoC, DI, 컨테이너
1. 제어의 역전 IoC
- 기존 프로그램은 클라이언트 구현 객체가 스스로 필요한 구현 객체 생성, 연결, 실행을 담당함(개발자에게 자연스러운 흐름)
- 하지만 AppConfig 등장 후 구현 객체는 자신의 로직 실행만을 담당하고 제어의 흐름은 모두 AppConfig가 담당한다.
→ 이렇게 프로그램의 제어 흐름을 직접 제어하는 것이 아닌 외부에서 관리하는 것을제어의 역전(IoC)라고 함
2. 의존 관계 주입 DI
- 클라이언트는 인터페이스에 의존하기 때문에 실제 어떤 구현 객체가 사용될 지 모름.
-
의존 관계는 정적인 클래스 의존 관계와 실행 시점 결정되는 동적 객체(인스턴스) 의존 관계를 분리해서 생각해야함
정적인 클래스 의존 관계: 클래스가 사용하는 import코드로 의존 관계 쉽게 판단 가능- 애플리케이션을 실행하지 않아도 분석할 수 있음
- 동적 객체 인스턴스 의존 관계: 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조과 연결된 의존 관계
- 애플리케이션 실행 시점에 외부에서 실제 구현 객체를 생성하고 클라이언트에 전달해 클라이언트와 서버의 실제 의존 관계가 연결되는 것
- 객체 인스턴스를 생성하고 그 참조값을 전달해 연결된다.
- 의존관계 주입 사용 시 클라이언트 코드를 변경하지 않고 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다.
3. 컨테이너
- AppConfig처럼 객체를 생성하고 관리하며 의존관계를 연결해 주는 것을 IoC컨테이너 또는 DI 컨테이너라 함
- 의존관계 주입에 초점을 맞춰 최근에는
DI 컨테이너라고 함
4. 스프링 컨테이너
ApplicationContext를 스프링 컨테이너라 함- 기존에는 개발자가
AppConfig를 사용해 직접 객체를 생성하고 DI를 했지만 원래 이건 스프링 컨테이너가 하는 일 - 스프링 컨테이너는
@Configuration이 붙은 AppConfig를 설정 정보로 사용함 - 이때
@Bean이라 적힌 메서드를 모두 호출해 반환된 객체를 스프링 컨테이너에 등록. 이렇게 등록한 객체를스프링 빈이라고 한다. - 스프링 빈은
@Bean이 붙은 메서드 명을 스프링 빈의 이름으로 사용한다. - 원래는 개발자가 필요한 객체를 AppConfig를 사용해 직접 조회.
→ 이제는 스프링 컨테이너를 통해 필요한 스프링 빈을 찾음.
→applicationContext.getBean()메서드 사용
[출처]