강좌/Spring 3.0

001_01. 프로그래밍에서 의존성이란?

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

000 ~ 005 STS 프로젝트 파일:

ExpertSpring30.zip


Spring DI (스프링 의존성 주입)을 알아보기 전에 의존성이란? 특히 프로그래밍에서 의존성이란? 무엇인지 알아보도록 하겠습니다. Java 에서의 의존성은 또 무엇인지도 알아보도록 하겠습니다.

의사 코드

운전자가 자동차를 생산한다.
자동차는 내부적으로 타이어를 생산한다.

Java 로 표현

new Car();
Car 객체 생성자에서 new Tire();

그리고 단순 무식하게 의존성이란?

의존성은 new 이다.
new 를 실행하는 Car 와 Tire 사이에서 Car 가 Tire 에 의존한다고 합니다.

결론적으로 전체가 부분에 의존한다고 표현할 수 있습니다. 더 깊이 들어가면 의존하는 객체(전체)와 의존되는 객체(부분) 사이에 집합 관계(Aggregation)와 구성 관계(Composition)로 구분할 수도 있지만 지금은 그저 전체와 부분이라고 받아들이시면 되고 전체가 부분에 의존한다고 기억해 주세요.

"프로그래밍에서 의존 관계는 new 로 표현된다!" 기억해 주세요.

참고
집합관계: 부분이 전체와 다른 생명 주기를 가질 수 있다. : vs 냉장고
구성관계: 부분은 전체와 같은 생명 주기를 갖는다. : 사람 vs 심장 

그럼 이제 본격적인 강좌로 들어갑니다.

이번 강좌는 Spring 으로 변화해가기 이전에 기존 방식으로 자바 코드를 작성해 보도록 하겠습니다. 강좌가 진행될수록 점점 Spring Annotation 으로 진화하게 됩니다. 프로그래머는 코드로 말한다고 하지만 모니터에 헤딩하기 전에 우리가 하고자 하는 것을 좀 더 확실히 이해하기 위해서 만국 공통어인 UML 을 통해 정적 구조인 클래스 다이어그램, 객체가 실행 시에 어떻게 통신하는 지를 보여주는 동적 구조인 시퀀스 다이어그램을 먼저 살펴보도록 하겠습니다.

이 강좌에서는 Eclipse 가 내장된 STS(Spring Tool Suite)를 활용합니다.
배포한 ExpertSpring30 프로젝트 내의 cld, sqd 파일을 보시려면 http://sourceforge.jp/projects/amateras/releases/ 에서 AmaterasUML.zip 파일을 다운로드, 압축 해제 후 jar 파일들을 STS 의 plugin 폴더에 복사, STS 를 (재)실행하시면 클래스 다이어그램(cld), 시퀀스 다이어그램(sqd)을 STS GUI 환경에서 보실 수 있습니다.

먼저 클래스 다이어그램입니다. 

강좌의 편의를 위해서 src/main/java 밑에 expert001_01 패키지를 만들고 거기서 구체(Concrete) 클래스로 Car.java, KoreaTire.java, AmericaTire.java 그리고 인터페이스로 Tire.java 그리고 이를 테스트해 볼 수 있는 Driver.java 로 구성되어 있습니다.

그럼 이번에는 시퀀스 다이어그램입니다.

이해를 돕기 위해서 실제 메서드를 호출하는 부분은 의사 코드로 바꾸어 보았습니다.  오른쪽 마지막에 KoreaTire 는 Interface 를 사용했기에 AmericaTire 로 쉽게 교체가 가능하겠죠.

그럼 이제 실제 코드로 표현해 볼까요.

먼저 인터페이스인 Tire.java 의 코드 입니다.

package expert001_01;

interface Tire {
     String getBrand();
}

아래는 위의 Tire 인터페이스를 구현(implements)한 KoreaTire.java 와 AmericaTire.java 입니다.

package expert001_01;

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

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

이어서 이 Tire 를 생산(new)할 Car.java 입니다.

package expert001_01;

public class Car {
    Tire tire;

    public Car() {
        tire = new KoreaTire();
        //tire = new AmericaTire();
    }

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

그리고 만들어진 코드를 테스트해 볼 Driver.java 입니다.

package expert001_01;

public class Driver {
    public static void main(String[] args) {
        Car car = new Car();

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

가장 주의 깊게 볼 부분은 Car.java 의 new KoreaTire() 하는 부분입니다.  바로 자동차가 타이어를 생산(new)하는 부분, 즉 의존 관계가 일어나고 있는 부분이죠.

new KoreaTire() - 타이어 생산

지난 강좌에서 만든 ExpertSpring30 프로젝트를 그대로 따라오셨다면 STS 상의 Package Explorer 에 보이는 구조는 아래 그림과 같을 겁니다.

다음 강좌 준비를 위해 작업하던 다른 패키지들도 보이네요.  정리해서 올려야 하는데 귀차니즘.. ^^;
그리고 src/test/java 에 보니 expert001_01 이라는 동일한 패키지 안에 JUnit Test Class 가 하나 있는데요.  코드는 아래와 같습니다.

package expert001_01;

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

public class CarTest {
    @Test
    public void 자동차_장착_타이어브랜드_테스트() {
        Car car = new Car();

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

테스트 메서드 이름이 한글인데요.  실제 배포용 소스(src/main/java)에서는 권장하지 않지만 배포 되지 않는 테스트 소스(src/test/java)에서는 영어 보다는 위와 같이 한글로 정확히 무슨 테스트를 하고 있는지 적어주는 것을 권장합니다.

자 그럼 src/main/java/expert001_01/Driver.java 의 context menu(마우스 오른쪽 버튼 클릭 후 나타나는 메뉴)에서 Run As > Java Application 을 선택해 줍니다.

오타가 없다면 위와 같은 결과 화면이 STS Console 창에 보입니다.

JUnit Test Class 도 작성했으니 한번 실행해 봐야겠죠.
src/test/java/expert001_01/CarTest.java 의 context menu 에서 Run as > JUnit Test 를 선택해 줍니다. 

역시 STS JUnit 창에 테스트 성공을 의미하는 예쁜 초록 바를 보실 수 있습니다.


자 우리가 했던 작업을 한번 돌아보도록 하겠습니다.

자동차는 타이어에 의존한다.
운전자는 자동차를 사용한다(운전자가 자동차에 의존하다고 봐도 되겠지요)

자동차의 생성자 코드에서 tire 속성에 새로운 타이어를 생성해서 참조할 수 있도록 해준다.

만들어진 java 코드와 바로 위 노란 박스를 천천히 비교해 보세요.

이번 강좌에서는 의존이 일어나고 있는 두 객체 사이에 직접 의존성을 해결하는 코드를 작성해 보았는데요.  다음 시간에는 의존성을 주입하는 코드를 작성해 보도록 하겠습니다.

그럼 마라나타.....

혹시나 궁금하실까봐 STS 전체 화면을 올려봅니다.
 

반응형