본문 바로가기
Back/spring

스프링 컨테이너(spring container) 기본 흐름

by 시월해 2021. 6. 22.

1.객체(클래스 생성) -> 2.bean 생성 -> 3.AbstractApplicationContext 으로 bean 가져오기

 

 - 스프링은 객체를 생성하고 각각의 객체를 연결해주는 조립기 역할을 함.
 - 여기에 있는 GenericXmlApplicationContext 객체가 조립기 기능을 구현한 클래스.
 - 조립기에서 생성할 객체가 무엇이고, 각 객체를 어떻게 연결하는 지에 대한 정보는 xml 파일에 설정이 되어 있음.
 - GenericXmlApplicationContext 클래스는 xml 파일에 정의된 설정 정보를 읽어와서 객체를 생성하고,
   각각의 객체를 연결한 뒤에 내부적으로 보관함.
 - xml을 이용한 스프링 설정 파일에서는 컨테이너가 생성할 객체를 지정하기 위해 <bean> 태그를 사용함.
 - 스프링 컨테이너가 생성해서 보관하는 객체를 스트링 빈(bean) 객체라고 부르며 일반적으로 자바 객체와 동일함.
 - 스프링 컨테이너는 생성한 빈 객체를 <이름, 빈 객체> 쌍으로 보관함.
 - 스프링 컨테이너가 보관하고 있는 객체를 사용하고 싶은 경우 빈 객체와 연결되어 있는 이름을 이용해서 객체 참조.


 * 스프링 컨테이너의 종류 
  BeanFactory : 단순히 스프링 컨테이너에서 객체를 생성하고 DI만 처리해주는 기능을 제공하는 객체.
   스프링을 사용하는 이유는 단순히 DI사용을 위해서가 아니라, 스프링을 사용하는 다양한 부가기능
   (트랜잭션 처리, 자바 코드 기반의 스프링 설정, 애노테이션을 이용한 빈 설정, 스프링을 이용한 웹 개발 등)
   때문인데 이러한 부가적인 기능을 사용하기 위해서는 ApplicationContext객체를 주로 사용.
 - AbstractApplicationContext : 컨테이너 종료(close)와 같은 기능을 제공해 주는 객체.
 - GenericXmlApplicationContext : AbstractApplicationContext 객체를 상속 받아 만드는 클래스. xml 파일에서 스프링 빈 설정 정보를 읽어오는 역할.
 - GenericXmlApplicationContext 객체를 생성할 때 파라미터 값으로 xml의 경로를 전달하여 설정 파일로 사용함.
 - GenericXmlApplicationContext 객체는 전달받은 xml 파일에서 설정 정보를 읽어와서 스프링 빈 객체를 생성하고 프로퍼티 값을 설정함.
   생성된 스프링 빈 객체는 getBean() 이라는 메서드를 사용해서 구현함.
   getBean() 메서드의 첫번쨰 파라미터는 구현하고자 하는 스프링 빈 객체의 고유한 id이름이며, 두번째 파라미터는 그 객체의 타입을 의미함.

 

1. 객체(클래스 생성)

package com.sist.di01;

public class GetSum {
	private int num1;
	private int num2;
	
	public int getNum1() {
		return num1;
	}
	public void setNum1(int num1) {
		this.num1 = num1;
	}
	public int getNum2() {
		return num2;
	}
	public void setNum2(int num2) {
		this.num2 = num2;
	}
	
	public void hap(int num1, int num2) {
		System.out.println("더하기 >>> "+ (num1 + num2));
	}
}
package com.sist.di01;

public class MyGetSum {

	private int num1;
	private int num2;
	private GetSum getSum;
	
	public int getNum1() {
		return num1;
	}
	public void setNum1(int num1) {
		this.num1 = num1;
	}
	public int getNum2() {
		return num2;
	}
	public void setNum2(int num2) {
		this.num2 = num2;
	}
	public GetSum getGetSum() {
		return getSum;
	}
	public void setGetSum(GetSum getSum) {
		this.getSum = getSum;
	}
	
	// 핵심 기능
	public void sum() {
		this.getSum.hap(num1,num2);
	}
}

2. bean 생성(컨테이너에 객체 주입)

src/main/resources 패키지에서 오른쪽 클릭 -> New -> Spring Bean Configurtion File

 

생겨난 파일명.xml 파일이 스프링 컨테이너라고 생각하면 됨.

 

<bean></bean> : 태그 안에 작성한 객체가 자동으로 생성되는 것

- 속성

id: 참조변수명(별칭)

class : 만들어놓은 객체(클래스)의 이름을 그대로 넣음

 

<!-- GetSum getsum = new GetSum(); 과 똑같은 개념임. -->
<bean id="getsum" class="com.sist.di01.GetSum" />

 

<property></property> : Setter로 객체를 주입할 때 사용하는 태그

- 속성

name : 객체 내에 있는 필드 변수

value : 변수에 들어 갈 값

 

<ref><ref> beans에서 생성한 객체를 참조할 때 사용하는 태그

- 속성

bean : beans 내에서 생성한 객체의 id를 넣어 사용

 

<!-- Setter Method로 주입하는 방법
	MyGetSum mySum = new MyGetSum();
	mySum.setNum1(200);
	mySum.setNum2(100);
-->

<bean id="mySum" class="com.sist.di01.MyGetSum">
	<property name="num1" value="200" />
	<property name="num2" value="100" />
	<property name="getSum"> 
		<ref bean="getsum" />
	</property>
</bean>

 

3. AbstractApplicationContext 으로 bean 가져오기

package com.sist.di01;

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

public class Main {
	public static void main(String[] args) {
		/* 
		 * - DI 즉, 주입을 어떻게 할 것인지는 xml 문서에 기입이 되어 있음.
		 * - 스프링 컨테이너인 ctx가 "classpath:getsum.xml" 파일을 보고 DI를 진행.
		 * - getsum.xml 파일은 resources 폴더에 들어가 있어야 함.
		 * 
		 */
		
		// DI 작업을 해주는 스프링 컨테이너 생성
		// xml 파일을 이용하여 메모리로 스프링 컨테이너 객체 생성(메모리로 로딩)
		AbstractApplicationContext ctx = 
				new GenericXmlApplicationContext("classpath:getsum.xml");
		
		// bean 생성해놓은 id로 bean을 가져온다. : 실제 이 코드에서 주입 과정이 일어나게 됨.
		// new 키워드를 사용하지 않고 직접 스프링 컨테이너에서 꺼내서 사용.
		// 방법 2가지
//		MyGetSum my = (MyGetSum) ctx.getBean("mySum");
		MyGetSum my = (MyGetSum) ctx.getBean("mySum", MyGetSum.class);
		my.sum();
		
		// bean을 사용했으면 반납해야함.
		ctx.close();
	}
}