[스프링] DI & IOC

대원·2023년 4월 4일
0

스프링

목록 보기
1/5

DI & IOC

DI

  • Dependancy Injection(의존성 주입)

    • 어떤 A라는 객체가 의존하는 다른 B라는 객체를 A 객체 내부에서 직접 생성하는 것이 아니라,
      생성자 또는 메서드를 통하여 외부로부터 매개변수를 통하여 의존하는 객체를 전달하는 방식
  • DI 발생 시점

    • 한 객체가 자신의 책임을 다하기 위해 다른 객체와의 협력을 위해 다른 객체의 메서드 등을
      호출할때 발생.
  • 의존 관계 연결은 어떻게?

    • 위의 설명의 예에서 B를 추상화한 인터페이스와 의존관계를 맺는것이 좋다.
    • Why? 🙋
      • 구현체인 B객체가 변경되어도 의존관계에 놓여있는 A는 영향을 덜 받는다.
      • A가 의존하는 것은 B를 추상화한 인터페이스이기 때문
  • Ex

    • BurgerChef는 BurgerRecipe에 의존.

      class BurgerChef {
          private BurgerRecipe burgerRecipe;
      
          public BurgerChef() {
              burgerRecipe = new HamBurgerRecipe();
              //burgerRecipe = new CheeseBurgerRecipe();
              //burgerRecipe = new ChickenBurgerRecipe();
          }
      }
      
      interface BugerRecipe {
          newBurger();
          // 이외의 다양한 메소드
      } 
      
      class HamBurgerRecipe implements BurgerRecipe {
          public Burger newBurger() {
              return new HamBerger();
          }
          // ...
      }
  • 생성자를 통해 주입

    class BurgerChef {
        private BurgerRecipe burgerRecipe;
    
        public BurgerChef(BurgerRecipe burgerRecipe) {
            this.burgerRecipe = burgerRecipe;
        }
    }
    
    class BurgerRestaurantOwner {
        private BurgerChef burgerChef = new BurgerChef(new HamburgerRecipe());
    
        public void changeMenu() {
            burgerChef = new BurgerChef(new CheeseBurgerRecipe());
        }
    }
  • 메소드를 통해 주입

    class BurgerChef {
        private BurgerRecipe burgerRecipe = new HamburgerRecipe();
    
        public void setBurgerRecipe(BurgerRecipe burgerRecipe) {
            this.burgerRecipe = burgerRecipe;
        }
    }
    
    class BurgerRestaurantOwner {
        private BurgerChef burgerChef = new BurgerChef();
    
        public void changeMenu() {
            burgerChef.setBurgerRecipe(new CheeseBurgerRecipe());
        }
    }
  • DI의 장점

    1. 의존성이 줄어든다.
    2. 재사용성이 높은 코드가 된다.
    3. 테스트하기 좋은 코드가 된다.
    4. 가독성이 높아진다.

IOC

  • Inversion of Control(제어의 역전)
  • 스프링 → 빈 객체(Bean)의 생성, 의존관계 설정, 사용, 제거 등의 작업을 스프링 컨테이너가 담당.
    - 💡 스프링 컨테이너란?
    - IOC 컨테이너, 빈 팩토리, DI 컨테이너, ApplicationContext 등 수많은 이름이 존재.
    (모두 같은 이름)
    - 객체를 생성하고 객체 사이의 런타임 의존관계를 설정.
    - DI 작업보다 많은 일을 한다.
    - DI + 여러가지 기능 추가 → ApplicationContext

    참고
    의존관계 주입
    Spring IoC와 DI란?
    의존관계 주입(Dependency Injection) 쉽게 이해하기

profile
고민하고 공부하는 사람

0개의 댓글