Spring/Spring

[Spring][Core] 1. IoC Container

noahkim_ 2023. 10. 14. 16:32

1. Introduction to the Spring IoC Container and Beans

IoC (Inversion of Control)

  • 전통적으로 애플리케이션의 객체 생성, 생명 주기 관리는 개발자가 작성한 코드에 의해 제어됩니다.
  • IoC는 이러한 제어 흐름의 주체를 프레임워크나 컨테이너가 담당하도록 하는 매커니즘입니다.
  • 프레임워크나 컨테이너가 주요 제어 흐름을 담당하게 하여, 개발자가 비즈니스 로직에 집중할 수 있게 합니다.

 

DI (Dependency Injection)
  • IoC의 한 형태로, 객체의 의존성을 외부에서 주입하는 기법입니다.
  • 의존성 주입을 개발자가 직접 코드로 수행하는 것이 아닌, 프레임워크의 IoC Container에 의해 자동으로 수행됩니다.

 

IoC Container

  • Spring에서 객체의 생성 및 관리, 의존성 주입을 담당하는 컴포넌트입니다.
  • IoC Container의 명세와 구현체가 제공됩니다.

 

BeanFactory (org.springframework.beans)
  • 오브젝트 생성 및 관리 역할을 담당하는 인터페이스입니다.

 

ApplicationContext (org.springframework.context)
  • BeanFactory의 확장 인터페이스로, IoC Container의 모든 기능을 제공하는 인터페이스입니다.
  • 기능 
    • AOP : 통합적인 AOP 기능을 쉽게 사용할 수 있게 합니다.
    • i18n : 국제화를 위한 Message resourece handling 기능을 제공합니다.
    • Event Publishing : 이벤트 발행과 처리를 지원합니다.
    • Application-layer 컨텍스트 : 웹 애플리케이션 등의 특정 유형에 특화된 구현체를 제공합니다.

 

Bean

  • 애플리케이션의 핵심 역할을 하는 오브젝트입니다.
    • 애플리케이션을 구성하는 실제 객체입니다.
  • IoC Container에 의해 생성되고 관리됩니다.
    • Configuration Metadata를 기반으로 생성됩니다.

 

2. Container Overview

Configuration Metadata

  • 개발자가 Spring Ioc Container에게 Bean의 객체화, 구성 및 조립 방법을 지시합니다.
    • Configuration Metadata을 통해 개발자는 Bean 구성을 풍부하게 표현할 수 있습니다.
  • 애플리케이션 클래스가 Configuration Metadata와 결합되어 Bean이 생성됩니다.
  • ApplicationContext는 Configuration Metadata 기반으로 Bean을 생성하고 관리합니다.
  • 다양한 Configuration metadata 방식에 따라 ApplicationContext의 구현체가 제공됩니다.

 

XML
  • 전통적으로 Configuration Metadata을 정의하는 방식입니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd">

	<import resource="services.xml"/>
	<import resource="resources/messageSource.xml"/>
	<import resource="/resources/themeSource.xml"/>

	<bean id="bean1" class="..."/>
	<bean id="bean2" class="..."/>
</beans>
  • <import/> 요소를 사용하여 다른 파일(들)에서 빈 정의를 로드할 수도 있습니다.
  • Spring에서 제공하는 XML 네임스페이스의 선택에 따라 단순한 빈 정의를 넘어서 추가 구성 기능들을 사용할 수 있습니다.

 

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
  • ClassPathXmlApplicationContext
    • xml 형식의 configuration metadata를 로드합니다.
    • 애플리케이션 컨텍스트 생성자를 사용하여 XML 조각들로 빈 정의를 로드할 수 있습니다.
  • FileSystemXmlApplicationContext
    • file system에서 xml 형식의 configuration metadata를 로드합니다.

 

Java Code
  • XML 파일이 아닌 Java 코드를 사용하여 Bean 정의를 할 수 있습니다.
  • @Configuration, @Bean, @Import, @DependsOn

 

Annotations
  • 어노테이션을 사용하여 Bean 생성, 의존성 주입, 라이프사이클 관리 등의 작업을 간편하게 수행할 수 있습니다.
  • @Component, @Service, @Repository, @Controller, @Autowired, @Qualifier
  • @ComponentScan

 

AnnotationConfigApplicationContext
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

 

 

 

출처