[Springframework] 스프링 컨테이너 구동 및 테스트

2020. 12. 11. 18:54스프링프레임워크/실습

728x90

 

1. 스프링 환경설정 파일 생성

 

1-1. [src/main/resource 우클릭 - New - Other 클릭]

혹시, 스프링프로젝트 생성방법을 모른다면 여기 클릭

 

 

 

1-2. Spring  - Spring Bean Configuration File 선택 후 Next 버튼 클릭

 

 

 

1-3. File name에 'applicationContext' 입력 후 Finish버튼 클릭

 

 

 

1-4. 생성된 스프링 환경파일 확인(applicationContext.xml)

 

 

 

 


 

2. 스프링 컨테이너 구동 및 테스트

 

2-1. TV 인터페이스 생성

 

package com.spring.study.polymorphism;

public interface TV {
	
	public void powerOn();
	public void powerOff();
	public void volumeUp();
	public void volumeDown();
}

 

 

2-2. TV 인터페이스를 구현한 SamsungTV클래스 생성

 

package com.spring.study.polymorphism;

public class SamsungTV implements TV{

	public SamsungTV() {
		System.out.println("===> SamsungTV 객체 생성");
	}
	
	@Override
	public void powerOn() {
		System.out.println("SamsungTV---전원 켠다.");
	}

	@Override
	public void powerOff() {
		System.out.println("SamsungTV---전원 끈다");
	}
	
	@Override
	public void volumeUp() {
		System.out.println("SamsungTV---소리 올린다.");
	}
	
	@Override
	public void volumeDown() {
		System.out.println("SamsungTV---소리 내린다.");
	}
}

 

 

2-3. 스프링설정파일(applicationContext.xml)에  SamsungTV클래스 설정

앞에 작성한 클래스를 스프링 기반으로 테스트하기 위해서 SamsungTV클래스를 스프링 설정 파일에 등록.

이 때 <bean> 엘리먼트를 사용하는데 클래스 하나당 하나의 <bean>설정이 필요함.

 

<?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="tv" class="com.spring.study.polymorphism.SamsungTV"></bean>
</beans>

 

 

2-3. TV객체를 테스트하기 위한 클라이언트클래스 생성 후 실행

package com.spring.study.polymorphism;

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

public class TVUser {

	public static void main(String[] args) {
		
		//1. Spring 컨테이너를 구동
		AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
		
		//2. Spring 컨테이너로부터 필요한 객체를 요청(Lookup) 
		TV tv = (TV)factory.getBean("tv");
		tv.powerOn();
		tv.volumeUp();
		tv.volumeDown();
		tv.powerOff();
		
		//3.Spring 컨테이너를 종료
		factory.close();
		
	}
}

TVUser 클라이언트 실행 과정

    1. TVUser 클라이언트가 스프링 설정 파일을 로딩하여 컨테이너 구동

    2. 스프링 설정 파일에 <bean> 등록된 SamsungTV 객체 생성

    3. getBean() 메소드로 이름이 'tv'인 객체를 요청(Lookup)

    4.  SamsungTV객체 반환

 


 

3. 스프링 설정파일 엘리먼트

 

3-1. <beans> 루트 엘리먼트

스프링 컨테이너는 <bean> 저장소에 해당하는 XML 설정 파일을 참조하여 <bean>의 생명주기를 관리하고 여러가지 서비스 제공하기 때문에 스프링 프로젝트전체에서 가장 중요한 역할을 담당.

스프링 설정 파일 이름은 무엇을 사용하든 상관없지만 <beans>를 루트 엘리먼트로 사용해야함.

<beans>엘리먼트 시작 태그에 네임스페이스를 비롯한 XML스키마 관련 정보가 설정됨.

STS를 이용하여 만든 스프링 설정파일에는 beans 네임스페이스가 기본 네임스페이스로 선언되어 있음.

spring-beans.xsd 스키마 문서가 schemaLocation으로 등록되어 있음.

<bean>, <description>, <alias>, <import> 등 네 개의 엘리먼트를 자식 엘리먼트로 사용할 수 있음. (<bean>, <import>정도만실제프로젝트에서사용함)

 

3-2. <import> 엘리먼트

스프링 설정 파일 하나에 모든 클래스를 <bean>으로 등록하여 관리할 수도 있지만, 그렇게 하면 스프링 설정 파일이 너무 길어지고 관리도 어렵기 때문에 기능별 여러 XML파일로 나누어 설정하는 것이 효율적인데, 이렇게 분리하여 작성한 설정 파일들을 하나로 통합할 때 <imprort> 엘리먼트를 사용

 

3-3. <bean> 엘리먼트

스프링 설정 파일에 클래스를 등록하여면 <bean>엘리먼트를 사용함.

이 때 id와 class속성을 사용하는데, id속성은 클라이언트가 컨테이너로부터 특정객체를 요청할 때 사용하므로 반드시 스프링 컨테이너 사이에서 유일해야 하고, class 속성에는 정확한 패키지 경로와 클래스 이름을 지정해야함.

 

3-4. <bean> 엘리먼트 속성

 

3-4-1. init-method 속성

스프링 컨테이너가 스프링 설정 파일에 등록된 클래스의 객체를 생성할 때 디폴트 생성자를 호출하는데, 객체를 생성한 후에 멤버변수 초기화 작업이 필요하다면 init-method속성에 정의된 메서드를 호출하여 초기화 실행.

스프링 컨테이너가 bean에 등록된 클래스의 객체를 생성한 후에 호출될 임의의 메서드를 지정할 수 있음.

 

3-4-2. destroy-method 속성

스프링 컨테이너가 객체를 삭제하기 직전에 호출될 임의의 메서드를 지정할 수 있음.

 

3-4-3. lazy-init 속성

ApplicationContext를 이용하여 컨테이너를 구동하면 컨테이너가 구동되는 시점에 스프링 설정 파일에 등록된 <bean>들을 생성하는 즉시 로딩방식으로 동작하는데, 그러면 어떤 <bean>은 자주 사용되지도 않으면서 메모리를 많이 차지하여 시스템에 부담을 주는 경우가 생김.

그래서 스프링에서는 컨테이너가 구동되는 시점이 아닌 해당 <bean>이 사용되는 시전에  객체를 생성하도록 lazy-init속성을 제공함. 

<bean>을 등록할 때 lazy-init="true"로 설정하면 스프링 컨테이너는  해당 bean을 미리 생성하지 않고 클라이언트가 요청하는 시점에 생성하여 메모리 관리를 더 효율적으로 할 수 있게 됨.

 

3-4-4. scope 속성

스프링 컨테이너는 컨테이너가 생성한 bean을 어느 범위에서 사용할 수 있는지를 지정할 수 있는데, 이 때 scope속성을 사용함.

  • scope="singleton" : scope속성값은 기본이 싱글톤인데, bean이 해당 스프링 컨테이너에 의해 단 하나만 생성되어 운용되도록 함.
  • scope="prototype" : 컨테이너는 해당 <bean>이 요청될 때마다 매번 새로운 객체를 생성하여 반환함.

 

 

 

출처 : 스프링 퀵 스타트 [채규태 지음 / 루비페이퍼] (교재)

728x90