HTTP 200 OK

Memento mori & Carpe diem

Spring

Spring IoC 컨테이너 및 Bean소개(1) [with spring docs]

sjoongh 2022. 5. 11. 19:49

Spring IoC 컨테이너와 Bean에 대한 소개

IOC 컨테이너라고 하는 스프링 컨테이너는 DI(Dependency Injection)의 관점에서는 빈 팩토리라고도 하고, 이런 빈 팩토리에 여러가지 기능을 추가한 것을 어플리케이션 컨텍스트라고 한다.

 

객체가 생성자, 팩토리메서드에 대한 인수 또는 팩토리 메서드에서 생성되거나 반환 된 후 개체 인스턴스에 설정된 속성을 통해서만 개체가 종속성(즉, 작업하는 다른 개체)을 정의하는 프로세스이다.

 

컨테이너는 Bean을 생성할 때 의존성들을 주입한다.

 

이 프로세스는 기본적으로 클래스 또는 Service Locator 패턴과 같은 메커니즘을 사용하여 종속성의 인스턴스화 또는 위치를 제어하는 Bean 자체(이름, Inversion of Control)이다.

 

org,springframework.beansorg.springframework.context패키지는 스프링의 IOC컨테이너에 기반한다.

BeanFactory인터페이스는 어떠한 타입이더라도 제어를 할 수 있는 더 확장된 설정 메커니즘을 제공한다.

ApplicationContextBeanFactory의 하위 인터페이스이다. 그리고 다음을 포함한다.

  • Spring의 AOP적 특성의 쉬운 통합
  • Message 자원의 핸들링
  • 이벤트 발생
  • WebApplicationContext와 같은 Application 계층의 특정 문맥

 

다시 말해서 ApplicationContext 인터페이스를 구현한 컨테이너들은 실행 시점에 모든 빈을 로딩하기 때문에 무거운 컨테이너이며 BeanFactory에 비해 다양한 편의기능들을 가지고 있다. 반면 BeanFactory만을 구현한 컨테이너들은 DI관점만 가지고 있고 빈을 필요할 때 로딩해주기 때문에 상대적으로 가볍다.

 

  • 때문에 Application(애플리케이션 컨텍스트 기능 대표)는 BeanFactory(빈 팩토리의 기능 대표) 인터페이스를 상속받고 있다.

 

스프링에서 Application의 Backbone을 유지하는 객체와 IoC컨테이너에 의해 관리되는 객체는 모두 Bean이라고 불린다.
즉 Bean은 인스턴스화 되어 조립되는 IOC컨테이너에 의해 관리되는 객체이다.

Container Overview

org.springframework.context.ApplicationContext 인터페이스는 IoC컨테이너를 대표하고 인스턴스화, 설정, Bean assembling에 대한 역할을 담당한다.

 

컨테이너는 설정 메타 데이터를 읽음으로써 어떤 객체가 인스턴스화 되어야 하며, 설정되고 조립되는지에 대한 정보를 획득한다.

 

메타 데이터의 설정은 XML, 어노테이션(@, JDK에 내장되어있는 built-in annotation), Java Code(Custom Annotaion)가 대표적이다.

 

아래의 다이어그램은 Spring가 어떻게 동작하는지를 보여준다.

 

애플리케이션 클래스는 구성 메타 데이터와 결합되어 ApplicationContext가 생성되고 초기화 된 후 완전히 구성되고 실행 가능한 시스템 또는 애플리케이션을 갖게된다.

Configuration Metadata

다이어그램에서 보여주듯, Spring IoC 컨테이너는 설정 메타 데이터를 사용한다. 이 설정 메타데이터는 어떻게 애플리케이션을 개발하는지를 알려준다. 그럼 Spring 컨테이너는 넣은 정보를 가지고 인스턴스화 하고, 설정하고 객체를 조립하여 애플리케이션을 동작하게 한다.

 

XML 기반 메타 데이터형식은 오랜기간 spring 개발자들이 이용했던 방법이지만 요즘은 Spring 애플리케이션을 위해 Java기반의 구성을 선택한다.

 

즉 XML 파일이 아닌 자바를 통해 bean을 정의한다(Custom Annotaion 기반). @Configuration, @Bean, @Import, @DependsOn과 같은 어노테이션이다. 자바 설정에서는 보통  @Configuration 클래스 안에서 @Bean 어노테이션이 붙은 메소드를 사용한다.

 

Spring 구성은 컨테이너가 관리해야 하는 적어도 하나, 일반적으로 하나 이상의 빈 정의로 구성됩니다. XML 기반 구성 메타데이터는 이러한 빈을 최상위 요소 내부의 요소 로 구성 합니다.

 

Java 구성은 일반적으로 클래스 @Bean내에서 주석이 달린 메소드를 사용합니다.@Configuration

  • XML설정에서 id는 빈 정의를 식별한다.
  • Bean의 class유형을 정의해 어떤 class에서 사용될 것인지를 정의한다.

Instantiating a Container

Application Context는 서로 다른 Bean과 의존성을 등록하고 유지할 수 있는 Factory이다.

 

Bean 인스턴스를 회수하기 위해 ApplicationContext를 사용해 빈의 정의를 읽고 접근할 수 있다.

  • ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
  • ref : setter에 주입할 bean(객체)의 이름, 사용할 bean이 바뀔 경우 변경해야 함
  • name : class에서 사용할 setter 이름

 

PetStoreService service = context.getBean("petStore", PetStoreService.class);

위와 같은 코드로 getBean을 호출 할 수 있다.


하지만 실제 개발단계에서는 위의 코드처럼 getBean()메소드에 대한 호출이 전혀 없어야 하며 따라서 Spring API에 전혀 의존해서는 안된다.