24.08.16

윤지현·2024년 8월 16일

TIL

목록 보기
43/75

오늘의 루틴

  • Spring 강의 최소 4개는 듣기 (O)
  • 개인과제 제출 및 해설 확인 (O)
  • 저번에 배운 Spring 복습 (△)

IoC(제어의 역전), DI(의존성 주입) 이해하기

-------------------------------------------------------
🔻 SpringIoC와 DI
   -  IoC와 DI는 좋은 코드 작성을 위한 Spring의 핵심 기술 중 하나
   - ‘DI 패턴을 사용하여 IoC 설계 원칙을 구현’ 
-------------------------------------------------------
🔻 의존성이란?
   - Interface 다형성의 원리를 사용하여 구현하면 강한 결합에 쉽게 대처 
   - 약한 결합 및 약한 의존성 
   -------------------------------------------------------
   public class Consumer {

    void eat(Food food) {
        food.eat();
    }

    public static void main(String[] args) {
        Consumer consumer = new Consumer();
        consumer.eat(new Chicken());
        consumer.eat(new Pizza());
      }
  }

  interface Food {
      void eat();
  }

  class Chicken implements Food{
      @Override
      public void eat() {
          System.out.println("치킨을 먹는다.");
      }
  }

class Pizza implements Food{
    @Override
    public void eat() {
        System.out.println("피자를 먹는다.");
    }
}
-------------------------------------------------------
🔻 주입이란?
   - SpringframeWorkclass들을 Bean 객체로 등록을 해서 가지고 있다가 의존성 주입이 필요할 때 주입
        - 그 방법은 Autowired Annotation에 달아서 알려준다
        - 생성자가 하나만 있을 때는 Autowired가 생략이 가능하다.
   - 주입 방법
   		- 필드 주입, 생성자 주입, 메서드 주입
        - 생성자 주입을 가장 추천(객체의 불변성을 지켜 줄 수 있기 때문에)
   -------------------------------------------------------
    - 생성자 주입
    public class Consumer {

    Food food;

    public Consumer(Food food) {
        this.food = food;
    }

    void eat() {
        this.food.eat();
    }

    public static void main(String[] args) {
        Consumer consumer = new Consumer(new Chicken());
        consumer.eat();

        consumer = new Consumer(new Pizza());
        consumer.eat();
    }
}
   -------------------------------------------------------
    - 필드 주입
public class Consumer {

    Food food;

    void eat() {
        this.food.eat();
    }

    public static void main(String[] args) {
        Consumer consumer = new Consumer();
        consumer.food = new Chicken();
        consumer.eat();

        consumer.food = new Pizza();
        consumer.eat();
    }
}
   -------------------------------------------------------
    - 메서드 주입
public class Consumer {

    Food food;

    void eat() {
        this.food.eat();
    }

    public void setFood(Food food) {
        this.food = food;
    }

    public static void main(String[] args) {
        Consumer consumer = new Consumer();
        consumer.setFood(new Chicken());
        consumer.eat();

        consumer.setFood(new Pizza());
        consumer.eat();
    }
}
-------------------------------------------------------
🔻 제어의 역전이란?
   - Consumer가 직접 Food를 만들어 먹었기 때문에 새로운 Food를 만들려면 추가적인 요리준비(코드변경)가 불가피
   		- 이때는 제어의 흐름이 ConsumerFood
   - Consumer는 추가적인 요리준비(코드변경) 없이 어느 Food가 되었든지 전부 먹을 수 있음
        - 제어의 흐름이 FoodConsumer 로 역전
   
-------------------------------------------------------
profile
첫 시작

0개의 댓글