purplely88's home

시작에 앞서

5장을 완료해주세요.

 

주입

의존성 다음에는 주입에 대해서 이해를 해보도록 하겠습니다.

계속해서 5장의 자동차를 예를 들어, 이번에는 자동차를 대량 생산해보겠습니다.

 

대량생산에 맞춘 코드는 다음과 같습니다.

 

메인 클래스 (기본 생략)

 

// 엔진 생성

Engine hyundaiEngine1 = new HyundaiEngine();

Engine hyundaiEngine2 = new HyundaiEngine();

Engine kiaEngine1 = new KiaEngine();

 

// 자동차 생산

Car car1 = new Car(hyundaiEngine1);

Car car1 = new Car(hyundaiEngine2);

Car car1 = new Car(kiaEngine1);

 

여기서는 하나하나 생성한 인스턴스를 Engine인터페이스형의 변수에 넣고 있습니다.

이와 같이 인터페이스형 변수에 인스턴스를 넣는 것을 주입이라고 합니다.

 

이것으로 주입 설명은 끝...이라고 보이시겠지만, 실제로는 조금 문제가 있어 보입니다.

예를 들어 현대가 새로운 엔진을 만들고 거기에 맞춰 자동차를 생산하다고 생각해봅시다.

그러면 현대의 새로운 엔진 클래스를 준비하고, 메인 클래스를 수정해야 할 필요가 있습니다.

 

엔진 클래스 (현대 버전2)

public class HyundaiEngineVer2 extends HyundaiEngine {

 

  // 생성자

  public HyundaiEngineVer2() {

    super();

  }

 

  // 기동 메서드

  @Override

  public void boot() {

    System.out.println("현대 엔진 기동 (버전 2)");

 

  // 정지 메서드

  @Override

  public void stop() {

    System.out.println("현대 엔진 정지 (버전 2)");

  }

}

 

버전 2 클래스는 버전1 클래스를 상속합니다.

 

메인 클래스 (기본 생략)

 

// 엔진 생성

Engine hyundaiEngine1 = new HyundaiEngineVer2();

Engine hyundaiEngine2 = new HyundaiEngineVer2();

Engine kiaEngine1 = new KiaEngine();

 

// 자동차 생산

Car car1 = new Car(hyundaiEngine1);

Car car1 = new Car(hyundaiEngine2);

Car car1 = new Car(kiaEngine1);

 

엔진을 생성하는 부분에 버전2 엔진 클래스로 변경한 게 보이실 겁니다.

지금 하고 있는 건 새로운 엔진 클래스를 추가하는 처리와 같습니다.

하지만 엔진 생성하는 코드가 늘면 늘 수록 자칫하면 코드 수정이 대량으로 많아지는 의미로 볼 수 있습니다.

 

이 문제는 간단하게 해결할 수 있습니다. 그건 바로 Factory 클래스를 만드는 것입니다. 오호!

Factory 클래스란 인스턴스를 생산하는 클래스를 뜻합니다. 이건 자바에서 자주 사용되는 기법 중 하나입니다.

 

Factory 클래스

public class EngineFactory {

  

  // 현대 엔진 클래스를 생산하여 반환

  public static Engine createHyundaiEngine() {

    return new HyundaiEngineVer2();

  }

 

  // 기아 엔진 클래스를 생산하여 반환

  public static Engine createKiaEngine() {

    return new KiaEngine();

  }

}

 

메서드를 static으로 함으로써 Factory 클래스를 생성하지 않아도 메서드 호출이 가능해졌습니다.

 

메인 클래스 (기본 생략)

 

// 엔진 생성

Engine hyundaiEngine1 = EngineFactory.createHyundaiEngine();

Engine hyundaiEngine2 = EngineFactory.createHyundaiEngine();

Engine kiaEngine1 = EngineFactory.createKiaEngine();

 

// 자동차 생산

Car car1 = new Car(hyundaiEngine1);

Car car1 = new Car(hyundaiEngine2);

Car car1 = new Car(kiaEngine1);

 

Factory 클래스를 사용함으로써, 인스턴스를 생성하는 클래스가 변경될 시 메서드의 내용물만 바꾸는 것으로 마무리 지을 수 있습니다. 

즉, 변경에 강한 애플리케이션이 되었습니다. 얏호!

 

여기까지가 주입의 이야기입니다. 

여기까지 이해하셨다면 이것으로 DI를 이해하는데 충분한 기반이 완성되었습니다.

 

다음 포스트에서는 DI에 대해서 구체적으로 알아보겠습니다.

 

 

'프로그래밍 > 스프링 부트' 카테고리의 다른 글

8. DI (4/4)  (0) 2020.06.18
7. DI (3/4)  (0) 2020.06.16
5. DI (1/4)  (0) 2020.06.14
4. 웹 애플리케이션 작성 (데이터 베이스로부터 값 취득)  (0) 2020.06.14
3. 웹 애플리케이션 작성 (파라미터 전달)  (0) 2020.06.14