[SpringBoot] Container, BeanFactory, Application Context, @Autowired

임유빈·2022년 8월 28일

다양한 Container :

실질적으로 Container는 하나만 있고, 그 외에 다양한 IoC, Servlet, Core 등등 다양한 영역으로 Container에 존재한다.

SpringContainer (또는 IoC Container) :

Bean을 담고 있는 박스로 Bean의 라이프 사이클을 관리하며, 생성된 SpringBean들에게 추가적인 기능을 제공하는 역할을 한다. (IoC와 DI의 원리가 SptingContainer에 적용이 된다.)

개발자는 new 연산자, 인터페이스 호출, 팩토리 호출 방식으로 객체를 생성하고 소멸하지만, 스프링 컨테이너를 사용하면 해당 역할을 대신해 준다. 즉, 제어 흐름을 외부에서 관리하게 된다. 또한, 객체들 간의 의존 관계를 스프링 컨테이너가 런타임 과정에서 알아서 만들어 준다.

SptingContainer는 두가지 종류로 나뉜다.

  • BeanFactory : Bean의 생성과 관계설정 같은 제어를 담당하는 IoC 오브젝트이다.
  • Application Context : Application Context는 BeanFactory를 상속하였으며,
    별도의 정보를 참고해서 빈의 생성, 관계설정 등의 제어 작업을 총괄한다. 그 자체로는 애플리케이션 로직을 담당하지는 않지만 IoC 방식을 이용해 애플리케이션 컴포넌트를 생성하고, 사용할 관계를 맺어주는 등의 책임을 담당한다.

BeanFactory 와 ApplicationContext 차이점 :

BeanFactory 는 getBean 메소드 호출시에 bean을 초기화하는데,
applicationfactory 는 스프링 컨테이너 구동시에 초기화한다.
ApplicationContext 는 어노테이션 기반 설정 처리 가능하다. (@Autowired 같은거)
ApplicationContext 는 여러 설정파일 적용 가능하다.
ApplicationContex 는 i18N 처리 가능하다. (다국어 처리)

@Autowired :

필요한 의존 객체의 타입에 해당되는 Bean을 찾아 주입한다.
필드(객체의 데이터), 메소드, 생성자 세가지로 주입할 수 있다.
A는 B를 주입 당하겠다고 선언 > A가 실행하려면 B가 필요하다고 SpringBoot가 인식한다.

  • 장점 : A가 실행되는 시점에서 필요한 객체만 실행할 수 있는 절약, 객체를 이미 컨테이너에 있는 객체를 활용하여 최대한으로 인스턴스(객체)를 최소한으로 사용한다.
  • 주의사항 : 필드 주입의 경우 2개 이상을 주입할 시 어떤 게 먼저 주입 당하는지 모른다.
    (주입 당하는 A와 B 가 서로 주입 당할 경우 어떤 게 먼저 생성할 지 모르는 문제가 생기기 때문에 주의해야한다.)

@Autowired 동작원리 :
@Autowired 어노테이션은 BeanPostProcessor라는 라이프 사이클 인터페이스의 구현체인 AutowiredAnnotationBeanPostProcessor에 의해 의존성 주입이 이루어진다.

특이점 : Bean끼리 서로 의존관계(이것을 설정해주는 역할을 한다.)가 있다. Service가 Controller에게 주입 받는 것처럼 BeanPostProcessor > SpringContext에서 Container에 Bean을 생성하여 넣으려고 한다.

Spring은 객체를 생성하여 Container에 넣는 그 사이에 (인터페이스로) BeanPostProcessor가 존재하는데 이것을 통하여 생성된 (Bean이 될) 객체를 수정하거나 변경할 수 있다.

0개의 댓글