[TIL] Spring Core 1.1-1.2

WonJune Kang·2021년 8월 8일
0

spring-core

목록 보기
1/2
post-thumbnail

1. The IoC Container

이 장에서는 Spring의 IoC(Inversion of Control) 컨테이너를 다룬다.

1.1. Introduction to the Spring IoC Container and Beans

이 장에서는 Spring IoC 컨테이너와 빈에 대해서 소개한다.
IoC는 dependency inject(DI)로도 알려져 있다.

객체가 생성자 파라미터, 팩토리 메소드에 대한 파라미터 또는 팩토리 메소드에서 생성되거나 반환된 후 객체 인스턴스에서 설정된 속성을 통해서만 객체가 종속성을 정의하는 프로세스다.
컨테이너는 빈을 생성할 때 이러한 종속성을 주입한다.
이 프로세스는 클래스의 직접 구성 또는 Service Locator 패턴과 같은 메커니즘을 사용하여 종속성의 인스턴스화 또는 위치를 제어하는 Bean 자체의 IoC를 수행한다.

Service Locator 패턴
캐시에 원하는 데이터가 있을 경우, 캐시에서 데이터를 찾아 넘겨주고
없을경우, 메모리에 기적재된 데이터를 찾아 캐시에 등록 및 반환한다.

org.springframework.beans
org.springframework.context
패키지들은 Spring IoC컨테이너의 기초가 된다.
BeanFactory 인터페이스는 모든 유형의 객체를 관리할 수 있는 진보된 환경설정 메커니즘을 제공한다.

ApplicationContext는 BeanFactory의 하위 인터페이스이다.

ApplicationContext 에서 추가된 사항

- Spring의 AOP 기능과의 손쉬운 통합
- 메시지 리소스 핸들링 (Internationalization에 사용)
- 이벤트 발생
- 웹 어플리케이션에서 사용하는 WebApplicationContext와 같은 어플리케이션 계층의 특정 컨텍스트들

BeanFactory는 Configuration framework와 기본 기능적인 부분을 제공하고,
ApplicationContext는 더 많은 Enterprise적인 특정 기능들이 추가되어 있다.

ApplicationContext는 BeanFactory의 완전한 상위집합 (즉, 확장개념이다. BeanFactory의 기능을 ApplicationContext가 다 가지고 있다.)이다.

Bean은 Spring IoC에 의해 인스턴스화, 조립 및 관리되는 객체이다.
Bean이 Spring IoC에 의해 관리되지 않으면 애플리케이션에 있는 많은 객체 중 하나일 뿐이다.
Bean과 이들 간의 종속성은 컨테이너에서 사용하는 Configuration metadata에 반영된다.

1.2. Container Overview

The org.springframework.context.ApplicationContext 인터페이스는 Spring IoC 컨테이너를 나타내며 Bean의 인스턴스화, 구성 및 조립을 담당한다.

컨테이너는 Configuration metadata를 읽어 인스턴스화, 구성 및 조립할 객체에 대한 지침을 얻는다.

Configuration metadata

- XML
- Java Annotation
- Java Code

ApplicationContext 인터페이스의 여러 구현체들이 Spring과 함께 제공된다.
Stand-alone 어플리케이션에서는 ClassPathXmlApplicationContext 또는 FileSystemXmlApplicationContext의 인스턴스를 만들어 구현하는 것이 일반적이다.

Application 클래스는 Configuration metadata와 결합되어 ApplicationContext가 생성, 초기화된 후 완전히 구성되고 실행 가능한 시스템 또는 어플리케이션을 가지게 된다.

1.2.1. Configuration Metadata

Spring IoC 컨테이너는 Configuration metadata 형식을 사용한다.
Configuration metadata는 어플리케이션 개발자로서 Spring 컨테이너에 어플리케이션 개체를 인스턴스화, 구성 및 조립하도록 하는 방법을 나타낸다.

XML 기반 메타데이터가 유일하게 허용된 구성 방식이 아니므로, Spring IoC 컨테이너 자체는 이 방식과 완전히 분리되어 구성되어 있다.
최근에는 많은 개발자들이 Spring 개발시에 Java 기반 구성을 더 선호한다.
Annotation-based configuration: Spring 2.5 부터 도입되었다.
Java-based configuration: Spring 3.0부터 도입되었다.
xml 파일 대신 Java를 사용하여 어플리케이션 클래스 외부에 Bean을 정의할 수 있다.
@Configuration, @Bean, @Import, @DependsOn Annotation 참조

Spring 구성은 컨테이너가 관리해야 하는 최소 하나 이상의 Bean 정의로 구성된다.
XML 기반에서는 이러한 빈을 <beans> <bean/> <beans/> 형태로 구성한다.
Java에서는 @Configuration 클래스 내에서 @Bean 메소드를 사용한다.
이러한 빈 정의는 어플리케이션을 구성하는 실제 객체에 해당한다.
일반적으로 서비스 계층 객체, 데이터 액세스 객체(DAO), Struts Action 인스턴스와 같은 프레젠테이션 객체, HibernateSessionFactories, JMS 대기열 등과 같은 인프라 객체를 정의한다.
일반적으로 도메인 객체를 만들고 로드하는 것이 DAO 및 비즈니스 로직의 책임이기 때문에 컨테이너에 세분화된 도메인 개체를 구성하지 않는다.
Spring과 AspectJ의 통합을 사용하여 IoC 컨테이너의 제어 외부에서 생성된 객체를 구성할 수 있다.

XML-based 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">

    <bean id="..." class="...">  
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <bean id="..." class="...">
        <!-- collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions go here -->

</beans>

1.2.2. Instantiating a Container

ApplicationContext 생성자에 제공된 위치 경로 또는 경로는 컨테이너가 로컬 파일 시스템, Java CLASSPATH 등과 같은 다양한 외부 리소스에서 Configuration metadata를 로드할 수 있도록하는 리소스 문자열이다.

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

services.xml

<?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">

    <!-- services -->

    <bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
        <property name="accountDao" ref="accountDao"/>
        <property name="itemDao" ref="itemDao"/>
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for services go here -->

</beans>

daos.xml

<?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">

    <bean id="accountDao"
        class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
        <!-- additional collaborators and configuration for this bean go here -->
    </bean>

    <!-- more bean definitions for data access objects go here -->

</beans>

위 예제에서, 서비스 계층은 PetStoreServiceImpl 클래스와 JpaAccountDao 및 JpaItemDao 유형(JPA ORM 표준)의 두 데이터 액세스 객체로 구성된다.
property 요소는 Javabean 속성의 name을 참조하고, ref 요소는 다른 빈 정의의 이름을 참조한다.

1.2.3. Using the Container

ApplicationContext는 다른 빈과 그 의존성의 레지스트리를 유지할 수 있는 발전한 인터페이스다.
T getBean(String name, Class<T> requiredType) 메소드를 사용하여 빈 인스턴스를 검색할 수 있다.

// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

// retrieve configured instance
PetStoreService service = context.getBean("petStore", PetStoreService.class);

// use configured instance
List<String> userList = service.getUsernameList();

ApplicationContext 인터페이스에는 빈을 검색하기 위한 몇 가지 다른 메소드가 있지만, 실제 어플을 만드는 과정에서 이러한 메소드 사용은 지양해야 한다.
실제론 애플리케이션 코드에는 getBean() 메소드에 대한 호출이 전혀 없어야 하며, Srping API에 대한 종속성이 전혀 없어야 한다.

profile
Excelsior!

0개의 댓글