카테고리 없음

[Spring] 스프링 ioC 시작하기, 스프링 컨테이너의 종류

책 읽는 개발자_테드 2020. 12. 23. 20:40
반응형

[Spring] 스프링 ioC 시작하기, 스프링 컨테이너의 종류

 

아래 두 개의 글에서  스프링 ioC관련  개념과 스프링 프로젝트를 생성하는 방법을 설명 했습니다. 해당 글에서는 ioC를 실제로 스프링 프로젝트에서 사용해봅니다.

 

스프링 ioC 개념: https://scshim.tistory.com/32 

스프링 시작하기(스프링 프로젝트 생성): https://scshim.tistory.com/206 




설정 파일과 스프링 컨테이너

 

IoC 컨테이너는 각 컨테이너에서 관리할 객체들을 위한 별도의 설정 파일이 있습니다. 예를들어 Servlet 컨테이너는 web.xml 파일이 필요합니다. 

 

마찬가지로 스프링 프레임워크도 자신이 관리할 클래스들이 등록된 XML 설정 파일이 필요합니다. 지금부터 XML 설정 파일을 통해 스프링 ioC를 동작하겠습니다.

 

스프링 MVC 프로젝트를 생성하면 아래와 같은 디렉토리와 파일들을 볼 수 있습니다.

 



먼저 스프링 설정 파일을 생성합니다. src/main/resouce 폴더를 마우스 오른쪽 버튼으로 클릭하고, new->other->Spring->Spring Bean Configuration File을 클릭합니다.



 

파일 이름은 applicationContext로 설정합니다.

 

 

xml 파일이 생성되며, 초기 코드는 다음과 같습니다.

 

applicationContext.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 
http://www.springframework.org/schema/beans/spring-beans.xsd">



</beans>

 

src/main/java 폴더로 이동합니다. 이곳에 기본적으로 존재하는 HomeController.java 파일을 삭제하고,

User.java 파일을 생성합니다.

 

 

생성된 User.java 파일에 아래와 같이 스프링 환경설정 파일인 applicationContext.xml을 로딩하여 스프링 컨테이너 중 하나인 GenericXmlApplicaionContext를 구동하는 코드를 작성합니다.

 

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class User {
public static void main(String[] args) {
        AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
	}
}

 

User.java을 오른쪽 클릭하여 Run As -> Java application 선택하여 프로그램을 실행합니다.

 

 

🔔결과

INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]
INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@51b7e5df: startup date [Wed Dec 23 13:40:14 KST 2020]; root of context hierarchy
INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6a03bcb1: defining beans []; root of factory hierarchy



실행 결과를 보면 클래스 경로에 있는 applicationContext.xml 파일이 로딩되고,

다음으로 GenericXmlApplicationContext 객체가 생성되어 스프링 컨테이너가 구동됐다는 메시지가 출력됩니다.



스프링 ioC 시작하기

 

스프링 컨테이너 설정을 완료했으니, 이번에는 스프링 컨테이너로 객체를 조작해보겠습니다. 먼저 src/main/java 폴더에 Computer 클래스를 생성합니다.

 

public class Computer {

	void powerOn(){
		System.out.println("전원 On.");
	}

	void powerOff(){
		System.out.println("전원 Off");
	}

}

 

생성된 Computer 클래스를 컨테이너 설정 파일에 등록합니다. class=”패키지명.클래스명”으로 클래스 이름, 클래스가 위치한 패키지명을 등록하고, id=”이름”으로 해당 클래스를 스프링 프로젝트에서 해당 클래스를 구분할 이름을 등록합니다.

 

<?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 
http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="computer" class="com.tistory.scshim.Computer"/>

</beans>

 

마지막으로 User 클래스에 Computer 클래스를 조작할 코드를 입력하고, 프로그램을 실행합니다.

 

public class User {

public static void main(String[] args) {

        AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");

        //2. Spring 컨테이너로부터 필요한 객체를 요청(Lookup)한다.
        Computer computer = (Computer)factory.getBean("computer");
        computer.powerOn();
        computer.powerOff();
      
        //3.Spring 컨테이너를 종료한다.
        factory.close();
        
	}

}

 

🔔결과

INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [applicationContext.xml]

INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing org.springframework.context.support.GenericXmlApplicationContext@51b7e5df: startup date [Wed Dec 23 14:13:25 KST 2020]; root of context hierarchy

INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@5ab9e72c: defining beans [computer]; root of factory hierarchy

전원 On.

전원 Off

INFO : org.springframework.context.support.GenericXmlApplicationContext - Closing org.springframework.context.support.GenericXmlApplicationContext@51b7e5df: startup date [Wed Dec 23 14:13:25 KST 2020]; root of context hierarchy

INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@5ab9e72c: defining beans [computer]; root of factory hierarchy



스프링 컨테이너의 종류

 

스프링은 BeanFactory와 이를 상속한 ApplicationContext 두 가지 유형의 컨테이너를 제공합니다.

 

BeanFactory

 

✔ 스프링 설정 파일에 등록된 객체를 생성하고 관리하는 가장 기본적인 컨테이너 기능만 제공합니다.

 

✔ 컨테이너가 구동될 때 객체를 생성하지 않고, 클라이언트의 요청(Lookup)에 의해서만 객체가 생성되는 지연 로딩(Lazy Loading) 방식을 사용합니다.

 

✔ 일반적인 스프링 프로젝트에서 BeanFactory의 사용 빈도는 낮습니다.

 

ApplicationContextBeanFactory

 

✔ BeanFactory가 제공하는 1. <bean> 객체 관리 기능 외에도 2. 트랜잭션 관리, 3. 메시지 기반 다국어 처리 등 다양한 기능을 지원합니다.

 

✔ 컨테이너가 구동되는 시점에 등록된 클래스들을 객체 생성하는 즉시 로딩(pre-loading) 방식으로 동작합니다.

 

✔ 웹 애플리케이션 개발도 지원하여 대부분 스프링 프로젝트가 ApplicationContext 유형의 컨테이너를 이용합니다.


ApplicationContext 구현 클래스 예시

 

✅ GenericXmlApplicationContext: 파일 시스템이나 클래스 경로에 있는 XML 설정 파일을 로딩하여 구동하는 컨테이너입니다. 위에서 설명한 예제 처럼 클라이언트의 요청(Lookup)에 의해서만 객체가 생성되는 지연 로딩(Lazy Loading) 방식을 사용합니다. 

 

XmlWebApplicationContext: 웹 기반의 스프링 애플리케이션을 개발할 때 사용하는 컨테이너입니다. 클라이언트가 직접 생성하지 않고 구동되고 사용됩니다.

 

 

 

출처: 스프링 퀵 스타트

반응형