Java/Spring

[Spring] 07. 객체의 생성 타이밍 ( + lazy-init)

담크 2021. 6. 21. 17:30

오늘은 spring에서 객체는 언제 생성되는지에 대해 정리해보려고 합니다.

com.test07 패키지 만들러 가볼까요?

IgTv.java

package com.test07;

public class IgTv implements TV {
	
	public IgTv() {
		System.out.println("ig tv 생성");
	}

	@Override
	public void powerOn() {
		System.out.println("ig tv on");
	}

	@Override
	public void powerOff() {
		System.out.println("ig tv off");
	}

	@Override
	public void volumeUp() {
		System.out.println("ig tv volume up");
	}

	@Override
	public void volumeDown() {
		System.out.println("ig tv volume down");
	}

}

SamsongTv.java

package com.test07;

public class SamsongTv implements TV {

	public SamsongTv() {
		System.out.println("samsong tv 생성");
	}

	@Override
	public void powerOn() {
		System.out.println("samsong tv on");
	}

	@Override
	public void powerOff() {
		System.out.println("samsong tv off");
	}

	@Override
	public void volumeUp() {
		System.out.println("samsong tv volume up");
	}

	@Override
	public void volumeDown() {
		System.out.println("samsong tv volume down");
	}

}

TV.java

package com.test07;

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

}

MTest.java

package com.test07;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MTest {
	
	public static void main(String[] args) {
		ApplicationContext factory = new ClassPathXmlApplicationContext("com/test07/applicationContext.xml");
		
		System.out.println("spring ioc container 준비 완료");
		
		TV tv = (TV) factory.getBean("samsong");
		tv.powerOn();
		tv.volumeUp();
		tv.volumeDown();
		tv.powerOff();
	}

}

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

	<bean id="samsong" class="com.test07.SamsongTv"></bean>
	<bean id="ig" class="com.test07.IgTv"></bean>
</beans>

코드 실행결과

 

MTest에 ApplicationContext 객체를 생성할 때 applicationContext.xml의 bean태그에서 객체도 만들어집니다.

그 만들어진 객체는 바로 컨테이너에 담아 언제든 사용할 수 있게 만들어줍니다.

 

MTest에서의 진행순서를 매겨보자면

1. ApplicationContext factory = new ClassPathXmlApplicationContext("com/test07/applicationContext.xml");

 

2. System.out.println("spring ioc container 준비 완료");

 

3. TV tv = (TV) factory.getBean("samsong");
   tv.powerOn();
   tv.volumeUp();
   tv.volumeDown();
   tv.powerOff();

 

이라고 할 수 있는데요

 

1번의 순서가 진행될 때 applicationContext.xml에서 samsong과 ig의 이름을 가진 객체를 생성합니다.

2번은 사실 그냥 결과를 보려고 문장을 출력시켜놓은 것이지만 객체가 생성되었다면 spring container에서 이미 쓸 준비가 완료된것입니다.

3번 순서가 되면 컨테이너에 있는 객체들을 가져다가 자기가 원하는 형태로 사용한것입니다.

 

여기서 IoC의 특징이 나타난다고 볼 수 있습니다.

 - 생성하는 곳(applicationContext.xml)과 사용하는 곳(MTest)가 다르다.

 


다음은 <beans>태그에서 사용가능한 속성중에 하나인 lazy-init에 대해 알아보겠습니다.

lazy-init은 말 그대로 번역하자면 "게으른 초기화" 인데요 이게 과연 뭔지 실습을 통해 알아보겠습니다.

applicationContext.xml에서 <bean>태그 하나에 lazy-init 속성을 사용해 볼게요

<bean id="samsong" class="com.test07.SamsongTv" lazy-init='true'></bean>

이렇게 id가 samsong인 객체에 lazy-init='true'를 적용시켜봤습니다. 결과가 어떻게 달라질까요?

처음 결과에는 분명히 ApplicationContext factory = new ... 할때 ig tv, samsong tv 객체를 만들어줬는데

이번엔 ig tv만 만들어져있다가 늦게 samsong tv가 생성된 것을 확인할 수 있습니다.

 

lazy-init이 true라는 건 객체가 생성될 때 같이 생성되지 않다가 객체가 호출이 될 때 생성이되게 만들어줍니다.

 

 

 

 

 

이 밖에 <beans>태그에는 많은 속성들이 있는데요 이를 확인하려면

만들어진 xml파일에서 namespace에 들어가면 beans라는 속성을 클릭했을 때 오른쪽에 체크되어있는것이 현재 본인이 사용중인 spring의 버전입니다. 버전 확인 후

저 부분을 복사해서 웹에 붙여넣기하면

이렇게 나오는데요 저는 제가 사용중인 버전을 눌러보겠습니다.

위에 사진이 작아 안보일 수 있는데 lazy-init보이시나요 ㅎㅎ

이외에도 <beans>에서 사용할 수 있는 속성들이 정리되어있으니 확인해보시기 바랍니다.