리셋 되지 말자

스프링을 통한 의존성 주입-XML 파일 사용 본문

Java(폐지)/spring 책

스프링을 통한 의존성 주입-XML 파일 사용

kyeongjun-dev 2020. 8. 10. 17:40

의사 코드

운전자가 종합 쇼핑몰에서 타이어를 구매한다.
운전자가 종합 쇼핑몰에서 자동차를 구매한다.
운전자가 자동차에 타이어를 장착한다.

자바로 표현 - 속성 메서드 사용

        ApplicationContext context = new ClassPathXmlApplicationContext("expert002/expert002.xml");
        Car car = context.getBean("car", Car.class);
        Tire tire = context.getBean("tire", Tire.class);

        car.setTire(tire);

소스 코드 - Driver.java를 제외한 파일들은 모두 동일

  • Driver.java (기존의 생산과정에서 구매 과정으로 변경됨)
package expert002;

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

public class Driver {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("expert002/expert002.xml");
        Car car = context.getBean("car", Car.class);
        Tire tire = context.getBean("tire", Tire.class);

        car.setTire(tire);

        System.out.println(car.getTireBrand());
    }
}
  • expert002.xml (경로 : /src/main/java/expert002/expert002.xml )

    xml 생성 : expert002 패키지 위에서 마우스 우클릭 -> New -> Other -> Spring -> Spring Bean Configuration FIle 선택 후 이름 설정

<?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="tire" class="expert002.KoreaTire"></bean>
    <bean id="americaTire" class="expert002.AmericaTire"></bean>
    <bean id="car" class="expert002.Car"></bean>

</beans>
  • 결과
INFO : org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@ea30797: startup date [Mon Aug 10 17:23:45 KST 2020]; root of context hierarchy
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [expert002/expert002.xml]
INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@39fb3ab6: defining beans [tire,americaTire,car]; root of factory hierarchy
장착된 타이어: 코리아 타이어

JUnit 테스트 케이스

  • CarTest.java
package expert002;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

import expert001_03.AmericaTire;
import expert001_03.Car;
import expert001_03.KoreaTire;
import expert001_03.Tire;

class CarTest {

    @Test
    void 자동차_코리아타이어_장착_타이어브랜드_테스트() {
        Tire tire1 = new KoreaTire();
        Car car1 = new Car();
        car1.setTire(tire1);

        assertEquals("장착된 타이어: 코리아 타이어", car1.getTireBrand());
    }

    @Test
    void 자동차_아메리카타이어_장착_타이어브랜드_테스트() {
        Tire tire2 = new AmericaTire();
        Car car2 = new Car();
        car2.setTire(tire2);

        assertEquals("장착된 타이어: 아메리카 타이어", car2.getTireBrand());
    }

}
  • JUnit 테스트 결과

.xml .java main() 설명

.xml 파일에 bean이라는 상품들을 진열한다. 각 상품을 구분하기 위한 id가 각각 tire, americaTire, car이다.
이때 상품을 어떤 클래스를 통해 생산(인스턴스화) 해야 할지 나타내는 class 속성을 함께 지정한다.

<bean id="tire" class="expert002.KoreaTire"></bean>
<bean id="americaTire" class="expert002.AmericaTire"></bean>
<bean id="car" class="expert002.Car"></bean>

KoreaTire.java가 xml 파일에서 id가 tire인 bean 태그와 연결되어 있고, tire id가 Driver.java의 main() 메서드 안의 코드인

Tire tire = context.getBean("tire", Tire.class);

와 연결되어 있는것을 확인할 수 있다.

KoreaTire라고 하는 상품이 tire라는 이름으로 진열돼 있고, 구매(getBean) 할 수 있다.

결과 화면에서 INFO 세 줄은 내부적으로 스프링 프레임워크를 구축하는 과정에서 보여지는 정보라고 생각하면 된다.

스프링 도입의 장점

  1. 어떤것도 재컴파일/재배포하지 않아도 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="koreaTire" class="expert002.KoreaTire"></bean>
    <bean id="tire" class="expert002.AmericaTire"></bean>
    <bean id="car" class="expert002.Car"></bean>

</beans>
  • 변경 결과
INFO : org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@ea30797: startup date [Mon Aug 10 17:38:01 KST 2020]; root of context hierarchy
INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [expert002/expert002.xml]
INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@39fb3ab6: defining beans [koreaTire,tire,car]; root of factory hierarchy
장착된 타이어: 아메리카 타이어
Comments