Spring

IoC 컨테이너 1부: 스프링 IoC 컨테이너와 빈

나죽나강 2021. 6. 6. 14:13

# 컨테이너란?

컨테이너는 보통 인스턴스의 생명주기를 관리하고 생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것이라고 한다. 즉, 컨테이너는 코드의 처리과정을 위임받은 독립적인 존재이다. 컨테이너는 누구의 도움없이도 프로그래머가 장석한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 관리해 주는 역할을 한다. 

 

# IoC 컨테이너란?

컨테이너의 사전적 의미는 무언가를 담는 용기, 그릇이다. 스프링 컨테이너는 프로그래머가 작성한 코드의 처리과정을 위임받아 독립적으로 처리하는 존재이다. IoC 컨테이너는 객체의 생성을 책임지고, 의존성을 관리한다. POJO의 생성, 초기화, 서비스, 소멸에 대한 권한을 가지기 때문에 개발자는 직접 POJO를 생성할 수 있지만 컨테이너에게 역할을 맡긴다.

> BeanFactory, ApplicatonContext이 가장 중요한 인터페이스다.

> 애플리케이션 컴포넌트의 중앙 저장소이다.

> 빈 설정 소스로 부터  정의를 읽어들이고, 빈을 구성하고 제공한다.

> 빈들의 의존 관계를 설정해준다.(객체의 생성을 책임지고, 의존성을 관리한다)

 

의존성을 생성하는 방벙은 new 생성자를 내부에 생성하여 강한 결합을 구성하거나 getter/setter 기능을 써서 느슨한 결합을 구현하여 의존성 역전(IoC)을 이용한 의존성 주입(DI)를 구현했다. 어플리케이션에는 이러한 객체가 무수히 많이 존재하고 서로 참조하고 있을 것이다. 서로 참조하고 있는 정도가 심할 수록 의존성이 높다고 표현한다. 낮은 결합도와 높은 캡슐화로 대변되는 OOP에서 높은 의존성은 좋지 않은 설계방식이다.

 

 

의존성 제어, 즉 객체 간의 의존성을 낮추기 위해 바로 위의 사진의 Spring IoC 컨테이너가 사용된다

 

 

# 스프링 컨테이너의 종류

1) BeanFactory

> 스프링 빈 컨테이너에 접근하기 위한 최상위 인터페이스이다.

> Bean객체를 생성하고 관리하는 인터페이스이다.

> 디자인패턴의 일종인 팩토리 패턴을 구현한 것이다.

> BeanFactory컨테이너는 구동될 때 Bean 객체를 생성하는 것이 아니라, 클라이언트의 요청이 있을때 (getBean( )) 객체를 생성한다. (Lazy Loading)

 

2) ApplicationContext

> ListbleBeanFactory를 상속하고 있으며, 여러 기능(Bean Lifecycle, ApplicationEventPublisher 등등)을 추가로 제공한다.

> BeanFactory를 상속받은 Interface이며, ApplicationContext 컨테이너는 구동되는 시점에 등록된 Bean 객체들을 스캔하여 객체화한다. 

[추가기능]
- 국제화 지원 텍스트 메시지 관리
- 이미지 파일 로드
- Listener로 등록된 Bean에게 이벤트 발생 통보

 

# BeanFactory vs ApplicationContext 차이점

1) BeanFactory

> 처음으로 getBean( )이 호출된 시점에서야 해당 빈을 생성한다.(Lazy Loading / 게으른 호출)

2) ApplicationContext

> 컨텍스트 초기화 시점에 모든 싱글톤 빈을 미리 로드한 후 어플리케이션 가동 후에는 Bean을 지연없이 얻을 수 있다.

> 즉, 미리 Bean을 생성해 놓아 빈이 필요할 때 즉시 사용할 수 있다.

 

 

# 빈(Bean)이란 무엇인가?

> 빈은 IoC 컨테이너가 관리하는 객체이다. IoC 컨테이너에 등록된 Bean들은 의존성 관리가 수월해지기 때문에 IoC/DI 코드를 작성해서 사용하는 것이 아니라 스프링의 IoC컨테이너를 사용하는 것이다.

 

> 스프링 IoC 컨테이너에 등록된 Bean들은 싱글톤 형태이다.

더보기

singleton : 기본(Default) 싱글톤 스코프. 하나의 Bean 정의에 대해서 Container 내에 단 하나의 객체만 존재한다.
prototype : 어플리케이션에서 요청시 (getBean()) 마다 스프링이 새 인스턴스를 생성

 

 

 

# 인프런 강의 (백기선 / 스프링 프레임워크 핵심 기술)

IoC 컨테이너 1부: 스프링 IoC 컨테이너와 빈 https://joinwithyou.tistory.com/24

IoC 컨테이너 2부: ApplicationContext와 다양한 빈 설정 방법 https://joinwithyou.tistory.com/25

IoC 컨테이너 3부: @Autowire https://joinwithyou.tistory.com/26

IoC 컨테이너 4부: @Component와 컴포넌트 스캔 https://joinwithyou.tistory.com/27

IoC 컨테이너 5부: 빈의 스코프 https://joinwithyou.tistory.com/28

IoC 컨테이너 6부: Environment 1부. 프로파일 https://joinwithyou.tistory.com/29

IoC 컨테이너 6부: Environment 2부. 프로퍼티 https://joinwithyou.tistory.com/30

IoC 컨테이너 7부: MessageSource https://joinwithyou.tistory.com/31

IoC 컨테이너 8부: ApplicationEventPublisher https://joinwithyou.tistory.com/32

IoC 컨테이너 9부: ResourceLoader https://joinwithyou.tistory.com/33

 

# Reference

https://devlog-wjdrbs96.tistory.com/165?category=882236 (블로그)

https://www.inflearn.com/course/spring-framework_core (백기선 강의)