독도갈매기의 개발 블로그

[Spring] DI ( Dependency Injection : 의존성 주입 ) 본문

Java

[Spring] DI ( Dependency Injection : 의존성 주입 )

독도갈매기 2021. 9. 29. 18:00

DI

DI ( 의존성 주입 ) 이란?

외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴( IoC 구현 기법 )으로, 인터페이스를 사이에 둬서 클래스 레벨에는 의존관계가 고정되지 않도록 하고 런타임 시에 관계를 다이나믹하게 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다.

의존성이란?

한 객체가 다른 객체를 사용할 때 의존성이 있다고 함.

DI를 쓰는 이유 - 장점

  • 재사용성을 높여줌.
  • 테스트 용이.
  • 코드 단순화.
  • 종속적 코드 수 감소.
  • 종속성 감소.
  • 코드 가독성 향상.
  • 결합도 감소, 유연성과 확장성 향상
  • 객체간 의존관계 설정
  • 객체간 의존관계를 없애거나 줄일 수 있음.

DI를 사용하지 않는다면

// 커피 클래스
class Coffee {
    public void drink() {
     커피를 마신다
     ...
  }
}
// 커피 인터페이스로도 가능
interface Coffee {
    public void drink()
}

// 커피 클래스를 상속
class Cappuccino extends Coffee {...}
class Americano extends Coffee {...}

// 회사원 클래스
class SalaryMan {
    private Coffee coffee;

    public SalaryMan() {
        this.coffee = new Coffee();
        // 커피가 바뀌거나 추가 될 때마다 지속적으로 코드를 수정해야함.
        this.coffee = new Cappuccino(); 
        this.coffee = new Americano(); 
  }

  public startWorking() {
    this.coffee.drink();
  }
}

DI를 사용한다면 ( Constructor Injection : 생성자 주입 ← DI 기법 중 하나 )

// 커피 클래스
class Coffee {
    public void drink() {
     커피를 마신다
     ...
  }
}

// 커피 클래스를 상속
class Cappuccino extends Coffee {...}
class Americano extends Coffee {...}

// 회사원 클래스
class SalaryMan {
    private Coffee coffee;

    // 클래스에서 직접 생성하는 것이 아닌 외부에서 사용할 때 주입해줌으로서, 
  // 객체 간의 결함도를 줄이고 좀 더 유연한 코드를 작성할 수 있음.
    public SalaryMan(Coffee coffee) {
        this.coffee = coffee;
  }

  public startWorking() {
    this.coffee.drink();
  }
}

// 회사 클래스 - 일반적인 생성자 주입
class Company {
    public pickUpEmployee() {
        Coffee myCoffee = new Americano();
        // 클래스에서 관계를 수정하는 것이 아닌 사용하는 외부에서 클래스를 주입해줌.
    SalaryMan Jun = new SalaryMan(myCoffee);
    }
}

마지막

극단적인 예시로 마지막 정리를 끝내겠습니다.

만약 위와 같이 'Coffee' 클래스가 1, 2 개가 아닌 수백개가 된다면 코드를 직접 수정하다보면

거기서 발생하는 시간, 인력, 비용 등등 모든 것들이 손해입니다.

이와같이 DI ( Dependency Injection : 의존성 주입 ← IoC 구현 기법 )을 잘 이용하면 많은 이점을 가져 올 수 있습니다.

Comments