강좌/Spring 3.0

003. 스프링을 통한 의존성 주입 - 스프링 설정 파일(xml)에서 속성 주입

여름나라겨울이야기 2012. 11. 19. 22:23
728x90

000 ~ 005 STS 프로젝트 파일:

의사 코드 - 점점 더 현실 세계를 닮아가고 있습니다.

운전자가 종합 쇼핑몰에서 자동차를 구매 요청한다.
종합 쇼핑몰은 자동차를 생산한다.
종합 쇼핑몰은 타이어를 생산한다.
종합 쇼핑몰은 자동차에 타이어를 장착한다.
종합 쇼핑몰은 운전자에게 자동차를 전달한다.

Java 로 표현

ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/java/expert003/expert.xml");
Car car = (Car)context.getBean("car");

XML 로 표현

<bean id="koreaTire" class="expert003.KoreaTire"></bean>
<bean id="americaTire" class="expert003.AmericaTire"></bean>
<bean id="car" class="expert003.Car">
       <property name="tire" ref="koreaTire"></property>
</bean>

클래스 다이어그램은 3회째 변화가 없습니다.  그러므로 처음으로 패스해 봅니다.
시퀀스 다이어그램은 좀 달라졌습니다.

자 xml 파일에 새롭게 property 라고 하는 부분이 보이네요.  Java 에서 get/set 메소드를 속성 메서드라고 하죠.  영어로 속성이 뭐게요?  설마.. 아시죠 ^^?   속성 = Property
결국 Driver.java 에서 car.setTire(tire) 하던 부분을  xml 파일의 property 태그를 이용해 대체해 버리는 것입니다.

Tire.java, KoreaTire.java, AmericaTire.java, Car.java 는 변경되는 부분이 없으니 이번에는 생략하도록 하겠습니다.  기억이 안 나시면 앞의 강좌를 참고해 주세요.
(이제 분량보다 귀차니즘이 더 강하군요. ㅡㅡ;)

그럼 변화가 있는 2 개의 파일만 살펴 보도록 하죠.

Driver.java - 이전 강좌의 코드 대비 어디가 어떻게 달라졌을까요?

package expert003;

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

public class Driver {
 public static void main(String[] args) {
  ApplicationContext context = new FileSystemXmlApplicationContext("/src/main/java/expert003/expert.xml");
  Car car = (Car)context.getBean("car");

  System.out.println(car.getTireBrand());
 }
}

왜 빨간줄이 안 보일까요?  기존 코드 대비 달라진 곳에 항상 빨간색으로 처리했었는데... 제가 게을러져서.. 이거 왜 이러십니까.. 아무리 게을러졌어도 그건 아니잖아요. ^^;  네 달라진 곳이 없기 때문입니다.  다만 삭제된 곳이 두군데 인데요.

Car car = (Car)context.getBean("car");
Tire tire = (Tire)context.getBean("tire");
car.setTire(tire);

기존 소스에서 위에 초록색, 빨간색으로 처리된 2 줄이 사라졌습니다.(순서요. 그건 상관 없습니다. 밥을 먼저 먹든, 반찬을 먼저 먹던 소화와 배설에는 문제가 되지 않듯이.. Car 를 구매한 후 Tire 를 구매하는 것이나, Tire 를 구매한 후 Car 를 구매하거나 상관이 없다는 거죠.  물론 car.setTire(tire) 전에는 두 개 모두 구매가 완료된 상태여야 하죠.)

그럼 사라진 2 줄은 어떻게 된 것일까요?  xml 파일을 한 번 살펴 보면 감이 오실 겁니다.

expert.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="expert003.KoreaTire"></bean>

 <bean id="americaTire" class="expert003.AmericaTire"></bean>

 <bean id="car" class="expert003.Car">
      <property name="tire" ref="koreaTire"></property>
 </bean>

</beans>

다시 줄긋기 놀이입니다. 

선이 조금 복잡한데요. 먼저 주홍색 선은 소스에서 Car 를 구매하는 부분으로 그대로 남겨 둡니다.

초로색 부분은 타이어를 구매하는 부분이구요.  파란색 부분은 코리아 타이어를 자동차의 타이어 속성에 결합하는 부분입니다.  초록색과 파란색 부분은 xmll 설정만으로 완성됨으로 소스에서는 사라집니다.


빨간색 부분은 자동차의 타이어 속성을 설정하는 부분입니다.  역시 xml 설정만으로 완성됨으로 소스에서 사라집니다.

조금 복잡해졌나요.  위의 의사 코드와 시퀀스 다이어그램, 그리고 현실 세계의 자동차 구매 프로세스를 생각하면서 정리해 보시면 쉽게 이해되실거라 믿어(?) 봅니다.

그리고 porperty 태그의 ref 속성을 americaTire 로 변경하면 어떨게 될까요?
과제입니다. ^^

아 참 아직 JUnit Test Case 가 남았네요.

package expert003;

import static org.junit.Assert.assertEquals;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("expert.xml")
public class CarTest {
 @Autowired
 Car car; 

 @Test
 public void 자동차_코리아타이어_장착_타이어브랜드_테스트() {
  assertEquals("장착된 타이어: 코리아 타이어", car.getTireBrand());
 }
}

오오... 테스트 코드에도 뭔가 Spring 스러운 것을 접목할 수 있군요.
이 부분은 다음 강좌 내용과 접목하여 설명하도록 하겠습니다.
JUnit 을 Run 해보시고 JUnit 결과 초록바뿐만 아니라 Console 창에 INFO 정보도 한 번 봐주세요.

그럼 다음 강좌에서 보아요. 호산나 주의 이름으로 오시는이여.. 호산나

반응형