Developer/Spring eGov4.0 (Java11, Tomcat9)

Spring , FactoryBean . 스프링 컨테이너

단님 2024. 9. 23. 01:07
728x90

 

스프링이란 ?

➡️앞서 보고오기 링크

 

Spring , 스프링 프레임 워크란 ?

스프링 프레임 워크의 특징을 한줄로 서술한다면," IoC와 AOP를 지원하는 경량의 컨테이너 프레임 워크"   경량크기 측면에서 가볍다.스프링은 여러개의 모듈로 구성되어 있으며 , 각 모듈은 하

radaonmommy.tistory.com

 

 

 

BeanFactory 개념
예전 프로그래밍에서는 절차지향이였고 , 이후에 객체 지향이 되어가면서 다형성이 적용되었다.

 

[✔️절차 지향 ]

➡️ 인스턴스 교체가 필요할 경우 새로이 생성하여 사용

// test 01 . 절차지향
System.out.println("test 01 . 절차지향");
//SsTV tv = new SsTV();
//tv.turnOn();
//tv.turnOff();
//tv.soundUp();
//tv.soundDown();
//tv 교체가 필요할 경우 새로이 생성해야함.
LgTV tv = new LgTV();
tv.powerOn();
tv.powerOff();
tv.volumeUp();
tv.volumeDown();

 

[✔️객체 지향 ]

➡️ 관련성이 없는 두객체를 하나의 인터페이스로 묶어줌, 규칙성 부여

인터페이스에 정의된 메서드만 사용했다는 의미 (그러므로 교체가능)

TV 교체 필요 : 우측의 클래스만 교체 (단, 소스코드수정-재컴파일 이 필요함)

System.out.println("test 02 . 객체지향 : 다형성 적용");
TV tvi = new SsTVi();
tvi.powerOn();
tvi.powerOff();
tvi.volumeUp();
tvi.volumeDown();
System.out.println("TV를 교체 합니다 !");
tvi = new LgTVi();
tvi.powerOn();
tvi.powerOff();
tvi.volumeUp();
tvi.volumeDown();

 

[✔️ Factory 패턴 ]

 

소스 코드 수정 없이 실시간으로 교체 작업이 필요하게 되었다.
객체를 생성해서 교체해줄 역할자가 필요하다. 
요구 사항에 따라 클래스를 Factory에게 전달하는 방법이 3가지가 있다. 
1. xml 방식
2. @ 방식
3. JavaConfig(Java_code)
BeanFactory 의 형태를 이전에 Factory 라고 했다면 , 스프링은 스프링 컨테이너라고 함.
 public TV getBean(String tv) {
	 
     if (tv!=null && tv.equals("ss")) {
    	 return new SsTVi();
     }
     else if (tv!=null && tv.equals("lg")) {
    	 return new LgTVi();
     }
     else {
    	 return null;
     }
 } //getBean
 
} //BeanFactory

 

BeanFactory(스프링 컨테이너) 생성
AbstractApplicationContext sc = 
	new GenericXmlApplicationContext("iocDI01_xml/app02.xml");

인자에 기술된 형태로 실행시켜준다.

패키지의 정확한 위치를 알려줘야 한다.

 

  • xml 파일 만들기

패키지 우클릭→new → spring Bean Configuration File

bean tag 를 통해 목록화 함.
bean Tag : new 생성을 요청하는 작업 지시서

1. id : 유일성이 있는 인지할 수 있는 식별자.
2. class : 패키지명.클래스명 (클래스는 실행시킬 클래스.)
3. lazy-init : 특정 객체나 변수를 필요할 때까지 초기화하지 않는 것
즉 , lazy-init 는 true 로 둔다면 , 전체 생성되지 않고 호출할때 생성됨으로 , 메모리 낭비를 막을 수 있다.
default 라면 , 무조건 생성됨을 의미.
	<bean id="tv" class="iocDI01_xml.SsTVi" lazy-init="true"/>
	<bean id="tvl" class="iocDI01_xml.LgTVi" lazy-init="true"/>
scope : 인스턴스 생성방식을 의미함.
빈을 생성할때 , 싱글톤 생성이 기본이다. 여러 인스턴스를 만들고 싶다면 , prototype을 줌.
<bean id="tv" class="iocDI01_xml.SsTVi"  scope="prototype"/>
<bean id="tv" class="iocDI01_xml.SsTVi"  scope="singleton"/>
<!--바로 위 코드는 <bean id="tv" class="iocDI01_xml.SsTVi" /> 와 같다 -->
  • Singleton Test
TV tv1 = (TV)sc.getBean("tv");
TV tv2 = (TV)sc.getBean("tv");
System.out.println("싱글톤 테스트 tv1 : "+tv1);
System.out.println("싱글톤 테스트 tv2 : "+tv2);
		
System.out.println("TV 교체 ,");
tv1 = (TV)sc.getBean("tvl");
tv2 = (TV)sc.getBean("tvl");
System.out.println("싱글톤 테스트 tv1 : "+tv1);
System.out.println("싱글톤 테스트 tv2 : "+tv2);

  • prototype Test

현재 상황에서 tvl 에 대해 prototype 적용

 

Singleton 에서는 주소값이 동일 , 생성자 1회 호출

prototype 에서는 주소값 일치하지 않음 , 생성자 다회 호출 됨을 비교 할 수 있다.

 

2. 필요 객체 전달 받고 Service 실행
TV tv =(TV)sc.getBean("tv");
//getBean 의 리턴타입이 object 타입임으로 강제 형변환이 필요.
if(tv !=null) {
	tv.powerOn();
	tv.powerOff();
	tv.volumeUp();
	tv.volumeDown();
}else {
	System.out.println("tv 선택을 하지 않았습니다.");
}

➡️ Spring 컨테이너는 getBean 메서드를 실행해서 해당객체를 제공, 실시간으로 소스코드 수정없이 전달받음