리셋 되지 말자

스프링 없이 의존성 주입하기 2 - 속성을 통한 의존성 주입 본문

Java(폐지)/spring 책

스프링 없이 의존성 주입하기 2 - 속성을 통한 의존성 주입

kyeongjun-dev 2020. 8. 6. 16:56

의사 코드

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

앞의 코드의 문제점은 차를 만들고나면, 타이어를 교체 못하는다는 것이다.
Tire tire1 = new KoreaTier();
Car car1 = new Car(tire1);
현실적인 방법은, 차 주인이 타이어를 교체하고 싶을 때 교체할 수 있도록 하는것!
이를 구현하기 위해서는 생성자가 아닌 속성을 통한 의존성 주입이 필요

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

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

시퀀스 다이어그램

클래스 다이어그램

소스코드

  • Car.java
package expert001_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
package expert001_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());

        Tire tire2 = new AmericaTire();
        car.setTire(tire2);
        System.out.println(car.getTireBrand());
    }
}
  • 실행결과
장착된 타이어: 코리아 타이어
장착된 타이어: 아메리카 타이어

타이어를 바꾸기 위해 Car를 새롭게 만들지 않아도 됨.

  • JUnit test 코드
package expert001_03;

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

import org.junit.jupiter.api.Test;

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());
    }

}
  • 실행 결과

Comments