티스토리 뷰

Spring

DI - 의존성주입

엔꾸꾸 2019. 4. 28. 18:42

의존성이란 ?

  • 객체를 생성 및 사용함에 있어서 의존관계에 있는경우 를 말한다.
  • 간단한 예제를 통해 알아보자.

class Character {
  Sword sword;

  public Character() {
    sword = new Sword();
  }

  public void attack() {
    this.sword.attack();
  }
}

class Sword {
  public void attack() {
    System.out.println("10 의 데미지로 공격 !");
  }
}

class Main {
  public static void main(String[] args) {
    Character swordMan = new Character();
    swordMan.attack();
  }
}

Character를 생성하는데 해당 캐릭터의 무기는 Sword이다.
해당 캐릭터는 Sword를 사용하며 , Sword가 없다면 공격을 할 수 없다
Sword에 의존하고있다고 볼 수 있다.

문제점 ?

  • 무엇이 문제일까 ?
  1. Character를 생성하는데 있어서 해당 Character는 Sword에 대해 정확히 알고있어야한다.
  2. Character의 무기를 변경하고싶다면 ?
    • 해당 Character class를 수정하거나, 새로운 무기를 가지는 class를 정의해주어야한다.

해결방법

  • 먼저 Sword를 Interface를 사용해 추상화하고 , 관계를 느슨하게 설정해보도록 하자.
class Character {
  Weapon weapon;

  public Character() {
    weapon = new Sword();
  }

  public void attack() {
    this.weapon.attack();
  }
}

interface Weapon {
  void attack();
}

class Sword implements Weapon {
  public void attack() {
    System.out.println("10 의 데미지로 공격 !");
  }
}

class Main {
  public static void main(String[] args) {
    Character swordMan = new Character();
    swordMan.attack();
  }
}

Sword를 Weapon 인터페이스를 활용하여 추상화 해주었다.
추후에 Sword 이외에 Bow , Gun 등 다양한 무기가 추가되어도 구현체만 바꾸어준다면 해당 무기를 사용하는 방법은 변경이 필요없다.

Sword를 추상화 하여 느슨한 관계를 만들어 주었지만 여전히 문제점이 존재한다.
‘어떤무기를 사용할것인지’ 를 Character ‘내부에서 결정하고 있다는것’ 이다.

게임 진행중에 캐릭터의 무기를 바꾸고싶다면 ?

  • 현재 상황에서는 불가능하다.

해당 부분을 DI (dependency Injection) 을 활용하여 해결해보자.

class Character {
  Weapon weapon;

  public Character(Weapon weapon) {
    this.weapon = weapon;
  }

  public void attack() {
    this.weapon.attack();
  }
}

interface Weapon {
  void attack();
}

class Sword implements Weapon {
  public void attack() {
    System.out.println("10 의 데미지로 근거리 공격 !");
  }
}

class Bow implements Weapon {
  public void attack() {
    System.out.println("7의 데미지로 원거리 공격! ");
  }
}
class Main {
  public static void main(String[] args) {
    Weapon sword = new Sword();
    Character swordMan = new Character(sword);
    swordMan.attack();
    // 10의 데미지로 근거리공격

    Weapon bow = new Bow();
    Character bowMain = new Character(bow);
    bowMan.attack();
    // 7의 데미지로 원거리공격
  }
}
  • 무기 생성을 캐릭터 내부에서 하지않고 무기를 외부로부터 주입받는다.
  • 또한 무기를 추상화한 interface를 사용하기 때문에 외부에서 Weapon을 구현하는 어떠한 무기가 들어오더라도 캐릭터는 해당 무기를 사용할뿐 무기를 생성하는데는 관여하지 않는다.

정리

  • DI (의존성 주입) 이란 ?
    • 내부적으로 객체를 생성하는 의존 관계의 경우 객체생성을 내부가 아닌 외부로 부터 주입받는것을 말한다.
    • 의존관계에 있는 객체를 외부로 부터 주입받음 으로써 관계가 느슨해지고 , 확장성이 좋아진다.

'Spring' 카테고리의 다른 글

Spring - PSA  (0) 2019.05.19
스프링 AOP - 2  (0) 2019.05.12
스프링 AOP -1  (0) 2019.05.04
스프링을 활용한 의존성주입 - 2  (0) 2019.05.01
스프링을 활용한 의존성주입 - 1  (0) 2019.04.28
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함