티스토리 뷰

JAVA/Spring

Spring 02 - Spring Bean

쟌쥰 2020. 3. 18. 20:13

포스팅에 앞서...

이 포스팅은 Spring Framework 를 이용한 Java 코드 위주의 설명입니다.

 

관련 코드는 아래 링크를 통해 깃허브에서 받아보실 수 있습니다.

 

https://github.com/ChoHyeonJunn/Workspace_Spring

 

ChoHyeonJunn/Workspace_Spring

Contribute to ChoHyeonJunn/Workspace_Spring development by creating an account on GitHub.

github.com


Spring03 프로젝트에 com.test03 패키지에서부터 testCode 를 진행하겠습니다.

 

실습의 주요 내용은 클래스의 구성에 따라 applicationContext.xml (IoC Container) 를 작성하고 main 메서드에서 이를 사용하는 방법에 대한 내용입니다.

 

http://www.springframework.org/schema/beans/spring-beans.xsd

불러오는 중입니다...

다루게 될 주요 내용

 


TestCode


1. <Spring03 - com.test03 package>

com.test03 패키지의 클래스 구성도 입니다.

Engineer 클래스와 Developer 클래스는 Emp 클래스를 상속받고 있고, 각각의 생성자에서 Emp 클래스의 생성자를 호출한 모습입니다.

추가로 만든 필드 dept 는 Setter 메서드에서 초기화하고 있습니다.

applicationContext.xml 문서에서 bean 태그를 통해 Developer , Engineer 의 객체를 생성합니다.

 

<constructor-arg> 태그로 생성자에 아규먼트 셋

<property> 태그로 setter 에 변수 셋

 

이외에 특별한 점은 없습니다.

 

main()

package com.test03;

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/test03/applicationContext.xml");

		Emp hong = factory.getBean("hong", Emp.class);
		Emp lee = factory.getBean("lee", Emp.class);

		System.out.println(hong);
		System.out.println(lee);
	}
}


2. <Spring03 - com.test04 package>

com.test04 패키지의 클래스 구성도입니다.

com.test03 패키지와의 차이점은 Engineer 와 Developer 클래스가 Emp 클래스를 상속받지 않고, 각각필드에 Emp 타입의 변수를 가지고 있다는 점입니다.

 

applicationContext.xml에서 위와 같은 구조의 객체를 생성하기 위해서는 

 

<bean> 태그를 이용해 Emp객체를 만든 후, Engineer 와 Developer 객체 생성에서 'ref' 속성을 이용해 이를 참조해야 합니다.

12줄 : honggd 객체 생성시 <constructor-arg> 의 ref 속성을 이용해 (8줄 :) id가 hong인 객체를 생성자의 아규먼트에 주입합니다.

 

22줄 : 위 설명과 같습니다.

 

이외 특별한 점은 없습니다.

package com.test04;

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/test04/applicationContext.xml");

		Developer hong = factory.getBean("honggd", Developer.class);
		Engineer lee = factory.getBean("leess", Engineer.class);

		System.out.println(hong);
		System.out.println(lee);
	}
}

 


3. <Spring03 - com.test05 package>

 

(클래스 구성은 위의 test04 패키지와 일치합니다.)

 

  • c: & p:  Schema의 사용

평소와 같이 applicationContext.xml 을 생성한 후, Namespaces 탭으로 들어가 c 와 p 체크박스를 체크해줍니다.

 

네임스페이스를 추가하면 c & p schema 를 사용 가능한데 

<constructor-arg/> 혹은 <property/> 태그를 대신해서 c: p: 속성을 이용해 값을 지정해 줄 수 있습니다.

 

main()메서드를 통해 출력하는 내용도 com.test04패키지와 일치합니다.

 


4. <Spring03 - com.test06 package>

com.test06 패키지의 클래스구성도입니다. 

 

이번 패키지에서는 applicationContext.xml 파일을 생성하지 않고 이를 BeanFactory 클래스를 이용해 대신해보도록 하겠습니다.

 

실제 applicationContext.xml (IoC Container) 즉 스프링 컨테이너에는 factory 패턴, singleton 패턴, strategy 패턴 등 다양한 패턴이 적용되어 있습니다.

 

이번 패키지에서는 BeanFactory 클래스에 factory 패턴을 적용한 모습을 살펴보겠습니다.

기본 클래스는 SamsongTV , IgTV 가 TV 인터페이스를 상속받고 있습니다. 필드는 따로 존재하지 않고 인터페이스에 정의한 가상클래스를 각각 SamsongTV , IgTV 클래스에서 구현하고 있습니다.

 

applicationContext.xml 을 대신하는 BeanFactory 클래스는 간단한 Factory 클래스의 모습을 보여주고 있으며 파라미터로 받는 String 변수의 값에 따라 리턴하는 클래스가 다릅니다.

 

main()

package com.test06;

import com.test07.TV;

public class MTest {
	public static void main(String[] args) {
		BeanFactory factory = new BeanFactory();
		TV tv = (TV) factory.getBean("samsong");
		
		tv.powerOn();
		tv.volumeUp();
		tv.volumeDown();
		tv.powerOff();
		
	}
}

BeanFactory 객체를 생성한 main 메서드에서는 samsong 이라는 아규먼트를 전달해 객체를 호출하고 있습니다.

 

결과값은 위 console 창에 나온것 처럼 SamsongTV 객체가 생성되고 SamsongTV 의 멤버메서드들이 호출되는 모습을 보실 수 있습니다.

 

 


5. <Spring03 - com.test07 package>

 

com.test07의 클래스 구성도는 위의 com.test06 패키지와 같습니다. 

 

다만 applicationContext.xml 파일을 생성하도록 하겠습니다.

 

bean 태그를 통해 SamsongTV 와 IgTV 의 객체를 생성한 모습입니다.

 

bean 태그의 속성으로 lazy-init 이라는 속성이 들어가있는데요. 

 

기존 applicationContext의 객체가 생성되는 순간 bean 태그에 해당하는 객체들이 동시에 생성되던 것과 달리

 

lazy-init 속성을 사용하면 호출측에서 해당객체를 생성하기 전에는 객체가 생성되지 않습니다.

 

main()

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");
		
		//TV samsong = factory.getBean("samsong", TV.class);
		TV ig = factory.getBean("ig", TV.class);
		
//		samsong.powerOn();
//		samsong.volumeUp();
//		samsong.volumeDown();
//		samsong.powerOff();
		
		ig.powerOn();
		ig.volumeUp();
		ig.volumeDown();
		ig.powerOff();
	}
}

applicationContext.xml 파일에서 bean 태그를 통해 SamsongTV 와 IgTV 객체를 생성했음에도 불구하고 lazy-init 이라는 속성때문에 호출측(main 메서드) 에서 해당 객체를 호출하지 않으면 객체 생성이 이루어지지 않는 것을 볼 수 있습니다.

 

applicationContext.xml 의 bean 태그에 lazy-init 속성을 지워보고 main메서드의 samsong 객체 호출 주석을 풀어보며 console 창에서 출력 내용을 비교해 보시면 lazy-init 속성의 역할을 더 확실히 눈으로 확인하실 수 있습니다.

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함