Spring , FactoryBean . 스프링 컨테이너
A A

목차

    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 메서드를 실행해서 해당객체를 제공, 실시간으로 소스코드 수정없이 전달받음

     

    Copyright 2024. GRAVITY all rights reserved