Spring & Boot

의존성 주입 방법 3가지 - 필드 주입, 메소드 주입, 생성자 주입

린예라 2023. 9. 2. 22:16

제어역전의 설계 원칙을 위한 의존성 주입 방법에는 3가지가 있다.

필드 주입, 메소드 주입, 생성자 주입이다.

 

필드를 통한 주입 

public class Consumer {

    Food food;

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

    public static void main(String[] args) {
        Consumer consumer = new Consumer();
        consumer.food = new Pizza();
        consumer.eat();
    }
}
    interface Food{
        void eat();
    }
 class Pizza implements Food{
        @Override
        public void eat(){
            System.out.println("피자를 먹어요");
        }
}

Consumer 의 필드인 food 필드에 객체를 전달함으로 의존성을 주입하였다.  Spring에서는 일반적으로 권장되지 않는 듯 하다.

왜? : 객체의 불변성을 해칠 수 있기 때문이다. 자바에서 클래스의 필드에 직접적으로 접근하지 않고 메소드를 통해서 접근하는 이유와 비슷하다.

 

 

생성자를 통한 주입

public class Consumer {

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

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

    public static void main(String[] args) {
        Consumer consumer = new Consumer(new Pizza());
        consumer.eat();
    }
}
    interface Food{
        void eat();
    }
 class Pizza implements Food{
        @Override
        public void eat(){
            System.out.println("피자를 먹어요");
        }
}

Consumer클래스의 생성자를 통하여 객체를 전달하여 의존성을 주입하였다.

final과 함께 사용하면 객체의 불변성을 지킬 수 있기 때문에 일반적으로 많이 사용된다.(final로 선언되면 생성자로 초기화 하는 방법 이외에는 값이 변하지 않는다.) 

 

메소드를 통한 주입

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 Pizza());
        consumer.eat();
    }
}
    interface Food{
        void eat();
    }
 class Pizza implements Food{
        @Override
        public void eat(){
            System.out.println("피자를 먹어요");
        }
}

Consumer의 메소드인 setFood를 통하여 객체를 전달하여 의존성을 주입하였다. Food 인터페이스 자체가 수정되거나 할 거 같을 때 메소드를 통한 의존성 주입을 사용 할 수 있다.

'Spring & Boot' 카테고리의 다른 글

컴포넌트스캔 @Autowired  (0) 2024.03.30
스프링 부트 큰 그림  (0) 2024.03.21
ORM 그리고 객체지향  (0) 2023.09.10
IoC, DI  (0) 2023.09.01
MVC패턴  (0) 2023.08.29