강좌/Spring 3.0

001_03. 스프링 없이 의존성 주입 2 - 속성을 통한 의존성 주입

여름나라겨울이야기 2012. 11. 18. 20:38
728x90

전체 강좌 프로젝트 파일:

ExpertSpring30.zip

의사 코드

운전자가 타이어를 생산한다.
운전자가 자동차를 생산한다.
운전자가 자동차에 타이어를 장착한다.

Java 로 표현 - 속성 메서드 사용

Tire tire = new KoreaTire();
Car car = new Car();
car.setTire(tire);

지난 강좌에서 생성자를 통해서 의존성을 주입하는 코드를 작성해 보았습니다.

이번 강좌에서는 속성을 통해 의존성을 주입 해보도록 하겠습니다.
생성자를 통해 의존성을 주입하는 것을 다시 실세계의 예로 들어보면 자동차를 생산(구입)할 때 한번 타이어를 장착하면 더 이상 타이어를 교체 장착할 방법이 없습니다.  그러나 더 현실적인 방법으로 운전자가 원할 때 Car 의 Tire 를 교체하려면 생성자가 아닌 속성을 통한 의존성 주입이 필요해 집니다.
프로그래밍 세계에서는 생성자를 통해 의존성을 주입하는 방법 vs 속성을 통해 의존성을 주입하는 방법에 대해 어느 쪽이 더 좋은가에 대한 의견이 갈리는데 대부분의 프로젝트에서는 속성을 통한 의존성 주입을 선호하는 것을 보게 됩니다.
특히 Spring 에서 @ 애노테이션을 사용하는 경우 속성 방식을 사용하게 됩니다.

그럼 시퀀스 다이어그램을 그려보죠.(참고로 아래 시퀀스 다이어그램에서 tire 는 인터페이스로 표기해야 하는데 이해를 위해.. 그리고 툴의 문제로 클래스처럼 보이는 건 살짝 이해를 구합니다.)

기존 시퀀스 다이어그램들 보다 복잡스러운 과정을 거치는 것 같죠?  하지만 더 현실 세계에 가까운 방식이 되어 가고 있기에 조금만 더 생각해 보면 더 이해하기 쉬운 코드가 되어 가는 것입니다.
클래스 다이어그램은 아래와 같습니다.

Car 클래스에서 생성자가 사라졌네요.  Java 에서 기본 생성자를 제공하겠죠.  그리고 tire 속성의 get/set 속성 메서드가 보이는 것이 기존 소스와 달라진 부분입니다.

역시 expert001_03 이라는 패키지를 생성하고 Tire.java, Car.java, Driver.java 파일을 만들어 보겠습니다.

Tire.java - 이전 강좌 코드와 동일합니다.

package expert001_03;

public interface Tire {
 String getBrand();
}

KoreaTire.java - 이전 강좌 코드와 동일합니다.

package expert001_03;

public class KoreaTire implements Tire {
 public String getBrand() {
  return "코리아 타이어";
 }
}

AmericaTire.java - 이전 강좌 코드와 동일합니다.

package expert001_03;

public class AmericaTire implements Tire {
 public String getBrand() {
  return "미쿡 타이어";
 }
}

Car.java - 생성자가 없어지고 tire 속성에 대한 get/set 메서드가 보입니다.

package exam001_03;

public class Car {
 Tire tire;

 public Tire getTire() {
  return tire;
 }

 public void setTire(Tire tire) {
  this.tire = tire;
 }

 public String getTireBrand() {
  return "장착된 타이어: " + tire.getBrand();
 }
}

Driver.java - Car.java 가 바꾸었으니 이를 사용하는 부분이 변경되었습니다.

package exam001_03;

public class Driver {
 public static void main(String[] args) {
  Tire tire = new KoreaTire();
  Car car = new Car();
  car.setTire(tire);

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

역시 기존 대비 달라진 부분은 붉은색으로 처리했습니다.
expert001_03 패키지의 Driver 클래스를 선택하고 Run As > Java Application 을 선택/실행하면 이전 과정과 동일한 결과를 확인하실 수 있습니다. 

역시 JUnit 테스트를 만들도록 하겠습니다.

package expert001_03;

import static org.junit.Assert.*;
import org.junit.Test;

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

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

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

  assertEquals("장착된 타이어: 미쿡 타이어", car2.getTireBrand());
 }
}

아래는 실행 결과 화면입니다. 

이번 강좌는 여기까지이고 다음 시간에는 스프링을 통한 의존성 주입을 배워보도록 하겠습니다.

그럼 다음 강좌까지.. 샬롬

반응형