Programming/Spring

[Spring/스프링] IoC컨테이너

개발도비 2023. 5. 17. 23:29

IoC(Inversion of Control : 제어의 역전)이란 ? 

: 객체의 생성, 생명주기의 관리까지 모든 객체에 대한 제어권이 바뀌었다는 것이다.

컴포넌트 의존관계 설정(Component dependency resolution), 설정(Configuration) 및 생명주기(LifeCycle)을 해결하기 위한 디자인 패턴이다.

 

IoC 컨테이너란 ? 

: 컨테이너는 보통 객체의 생명주기를 관리하고 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것이다. 스프링도 객체를 생성,관리하고 책임지고 의존성을 관리해주는 컨테이너가 있는데 그게 IoC컨테이너(=스프링 컨테이너)다. 

 

인스턴스의 생성부터 소멸까지 인스턴스 생명주기 관리를 개발자가 아니라 컨테이너가 대신 해준다. 객체관리의 주체가 프레임워크(Container)가 되기 때문에 개발자는 로직에만 집중할 수 있는 장점이 있다.

 

- IoC컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다

- POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가진다

- 개발자들이 직접 POJO를 생성할 수 있지만 컨테이너에게 맡긴다

- 개발자는 비즈니스 로직에 집중할 수 있다

- 객체 생성 코드가 없기 때문에 TDD가 용이하다.

 

+) POJO(Plain Old Java Object)는 주로 특정 자바 모델이나 기능, 프레임워크를 따르지 않는 Java Object를 지칭한다. Java Bean객체가 대표적이고 간단하게는 getter / setter를 생각해보면 된다 

 

++) java static은 Classloader 기준으로 공유하고 spring은 ApplicationContext 기준으로 공유한다 

 

IoC의 분류 

: DL(Dependency Lookup)과 DI(Dependency Injection) 

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

- DI : 각 클래스간의 의존관계를 빈 설정(Bean Definition) 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것. 개발자가 new를 이용해서 객체를 생성하지 않고, IoC컨테이너에 존재하는 Bean객체를 주입해준다. 해당 기능을 사용하면 싱글톤, 개발자의 편의, 성능이슈 등등을 해결할 수 있다. 

  * Setter Injection (수정자 주입) 

  * Constructor Injection (생성자 주입) 

  * Method Injection (필드 주입) 

 

DL 사용시 컨테이너 종속이 증가하기 떄문에 주로 DI를 사용한다 

Reference https://dog-developers.tistory.com/12

DI(Dependency Injection) 

: 스프링 빈을 등록하는 두 가지 방법 (@Component, @Bean) 

https://dev-coco.tistory.com/69

 

[Spring] 스프링 빈을 등록하는 두 가지 방법(@Component, @Bean)

Bean이 뭘까? 먼저 Bean을 이해하기 위해 스프링 컨테이너 (Spring Container 또는 IoC 컨테이너)에 대해서 알 필요가 있습니다. 자바 어플리케이션은 어플리케이션 동작을 제공하는 객체들로 이루어져

dev-coco.tistory.com

:의존성 주입하는 3가지 방법 (Setter Injection, Constructor Injection, Field Injection) 

https://dev-coco.tistory.com/70

 

[Spring] 의존성 주입 3가지 방법 - (생성자 주입, Field 주입, Setter 주입)

Spring은 @Autowired 어노테이션을 이용한 다양한 의존성 주입(DI; Dependency Injection) 방법을 제공합니다. 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로부터 객체를 받아 사용하는 것입

dev-coco.tistory.com

 

스프링 컨테이너(IoC 컨테이너)의 종류 

: 스프링 컨테이너가 관리하는 Java 객체를 빈(Bean)이라고 하고 이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리(Bean Factory)라고 부른다. 

- 객체의 생성과 객체 사이의 런타임 관계를 DI 관점에서 볼 때 컨테이너를 Bean Factory라고 한다

- BeanFactory에 여러 가지 컨테이너 기능을 추가한 ApplicationContext가 있다

 

BeanFactory와 ApplicationContext

: IoC 컨테이너에는 BeanFactory.class, ApplicationContext.class라는 핵심적인 두 가지 클래스가 있다

1. BeanFactory

- BeanFactory계열의 인터페이스만 구현한 클래스는 단순히 컨테이너에서 객체를 생성하고 DI를 처리하는 기능만 제공한다. 

- 자바 객체(Bean) 인스턴스를 등록, 생성, 조회, 반환 관리하는 실질적인 컨테이너이다. 

- 팩토리 디자인 패턴을 구현한 것으로 BeanFactory는 빈을 생성하고 분배하는 책임을 지는 클래스이다

- Bean을 조회할 수 있는 getBean() 메소드가 정의되어 있다

- 보통은 BeanFactory를 바로 사용하지 않고, 이를 확장한 ApplicationContext를 사용한다

 

2. ApplicationContext

- BeanFactory를 상속받고 있다. BeanFactory의 확장버전이다.

- 상속받아서 구현한 대표적인 차이점은 BeanFactory는 지연로딩, ApplicationContext는 pre로딩이다

- Bean을 등록, 생성, 조회, 반환 관리하는 기능은 BeanFactory와 같다 

- 스프링의 각종 부가 기능을 추가로 제공한다 

 

-BeanFactory보다 더 추가적으로 제공하는 기능

 * 국제화가 지원되는 텍스트 메시지를 관리해준다

 * 이미지같은 파일 자원을 로드할 수 있는 포괄적인 방법을 제공해준다

 * 리스너로 등록된 빈에게 이벤트 발생을 알려준다 

Spring DI 컨테이너에 대한 구조 Reference https://dog-developers.tistory.com/12

 

 

그 외 참고해보면 좋을 링크

https://velog.io/@jkijki12/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-Bean-IoC-Container-DI%EA%B0%80-%EB%AD%94%EB%8D%B0

 

[Spring] 스프링 Bean, IoC Container, DI가 뭔데!!

Spring Core인 Bean, IoC, Container를 알아보자!

velog.io