스프링

[스프링] IoC, DI

j9972 2023. 10. 4. 23:25
728x90

스프링

IoC 컨테이너

‘제어의 역전’의 약어이며, 일종의 디자인 패턴중 하나 이다.

컨테이너는 보통 객체[ POJO ]의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것이다.

이 말은 객체[ POJO ]의 생성 및 생명주기 등 객체[ POJO ]의 모든 제어권이 바뀌었단 말이다.

결론, 객체[ POJO ]의 제어권이 “ 나(개발자) → 컨테이너 “ 이동한단 말이다.

 

POJO란, 주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object를 지칭한다.
-> Java Bean 객체가 대표적이다.

 

빈 등록방법 

  1. @Component
  2. @Bean

 

IoC 사용이유

  1. DI → 객체를 new해서 생성 하지 않고, IoC 컨테이너에 존재하는 Bean 주입하면, 싱글톤 문제 및 편의성 등등 상승!
  2. 객체의 scope → IoC컨테이너가 해당 객체 scope 관리해줌
  3. 라이플 사이클 인터페이스 지원 → 클래스 단위테스트시에 테스팅 지원

결론 인스턴스의 생명주기를 내가 아닌 컨테이너가 해주니까 우리는 로직에 집중할 수 있으며, new를 안쓰는 등 객체 생성 코드가 없으니까 TDD가 용이하다!

 

IoC 컨테이너 class

IOC 컨테이너에는 BeanFactory.class, ApplicationContext.class핵심적인 2가지의 클래스가 있다.

  1. BeanFactory : 자바 객체(bean) 인스턴스를 생성, 설정, 관리하는 실질적인 컨테이너이다.
  2. ApplicationContext : BeanFactory를 상속받는 BeanFactory의 확장 버전이다. 

 

ApplicationContext에서 확장된 기능

  1. 국제화가 지원되는 텍스트 메시지를 관리 해준다.
  2. 이미지같은 파일 자원을 로드할 수 있는 포괄적인 방법을 제공해준다.
  3. 리스너로 등록된 빈에게 이벤트 발생을 알려준다.

 

IoC는 DL과 DI 2가지가 있다

DL : 저장소에 저장되어 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lockup하는 것이다

DI : 각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것

-> DL 사용시 컨테이너의 종속이 증가하기에 DI를 사용한다.

 

DI

 

의존성 주입은 각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해줌으로써, 프로그램 디자인 결합도를 느슨하게 되도록하고, 의존관계 역전 원칙과 단일 책임 원칙을 따르도록 클라이언트의 생성에 대한 의존성을 클라이언트의 행위로부터 분리하는 것이다

 

의존성을 주입하는 방법

  1. Setter Injection (수정자 주입)
  2. Constructor Injection (생성자 주입)
  3. Method Injection (필드 주입)