전체 강좌 프로젝트 파일:
의사 코드
운전자가 자동차를 생산한다.
운전자가 자동차에 타이어를 장착한다.
Java 로 표현 - 속성 메서드 사용
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 - 이전 강좌 코드와 동일합니다.
public interface Tire {
String getBrand();
}
KoreaTire.java - 이전 강좌 코드와 동일합니다.
public class KoreaTire implements Tire {
public String getBrand() {
return "코리아 타이어";
}
}
AmericaTire.java - 이전 강좌 코드와 동일합니다.
public class AmericaTire implements Tire {
public String getBrand() {
return "미쿡 타이어";
}
}
Car.java - 생성자가 없어지고 tire 속성에 대한 get/set 메서드가 보입니다.
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 가 바꾸었으니 이를 사용하는 부분이 변경되었습니다.
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 테스트를 만들도록 하겠습니다.
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());
}
}
아래는 실행 결과 화면입니다.
이번 강좌는 여기까지이고 다음 시간에는 스프링을 통한 의존성 주입을 배워보도록 하겠습니다.
그럼 다음 강좌까지.. 샬롬
'강좌 > Spring 3.0' 카테고리의 다른 글
003. 스프링을 통한 의존성 주입 - 스프링 설정 파일(xml)에서 속성 주입 (2) | 2012.11.19 |
---|---|
002. 스프링을 통한 의존성 주입 - XML 파일 사용 (24) | 2012.11.19 |
001_02. 스프링 없이 의존성 주입 1 - 생성자를 통한 의존성 주입 (22) | 2012.11.18 |
001_01. 프로그래밍에서 의존성이란? (11) | 2012.11.16 |
000. STS 를 이용한 Spring MVC Project 생성 (34) | 2012.11.13 |