ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 의존성 주입 Dependency Injection. DI
    Java/SpringBoot 2021. 2. 24. 16:12

    클래스 의존 관계란?

     

    한 클래스의 객체가 다른 클래스 객체의 서비스를 필요로 하는 관계.

     

    Driver 가 Car를 운전한다.

     

     

    Driver.java

    public class Driver{
        Car car;
        
        public Driver(){
            car = new Car();
        }

    public void drive(){
        car.engineOn();
        car.go();
        car.engineOff();
       }
    }

     

    Car.java

    public class Car{

        public void engineOn(){
        
        System.out.println("car: engine on");
        }

        public void go(){
        System.out.println("car: brrrr");
        }

        public void engineOff(){
        System.out.println("car: engine off");
        }
    }

     

    위의 경우에 Car가 Plane으로 바뀌면 모든 코드를 수정해야 한다.

     

     

    클래스간의 의존성을 줄이기 위해서 Movable이라는 interface를 사용했다.

    public interface movable{
        public void engineOn();
        public void drive();
        public void engineOff();
    }

     

    의존성 주입(Dependency Injection)

     

    이제 이동수단(Car, Plane)에 따라 변경해야 하는 코드가 훨씬 줄어든다.

    하지만 외부에서 생성한 객체를 주입해줘야 한다.

     

    의존성 주입은 1) 생성자를 통해서 2) setter를 통해서 할 수 있다.

     

     

    1. 생성자를 통한 의존성 주입

    public class Driver{
        private Movable m;

        public Driver(Movable m){
            this.m=m;
        }
       
        public void drive(){
            m.engineOn();
            m.drive();
            m.engineOff();
        }
    }

     

    2. setter를 통한 의존성 주입

    public class Driver{
        private Movable m;

        public void setMovable(Movable m){
            this.m = m;
        }

        public void drive(){
            m.engineOn();
            m.drive();
            m.engineOff();
        }
    }

    코드에서의 객체 생성, 주입

     

    Main.java

    public class Main{
        public static void main(String[] args){
            Driver d = new Driver();
            Movable m = new Car();
            d.setMovable(m);
            d.drive();
        }
    }
    public class Main{
        public static void main(String[] args){
            Driver d = new Driver();
            Movable m = new Plane();    //변경
            d.setMovable(m);
            d.drive();
        }
    }

    코드에서 객체를 주입하는 경우에는 Car에서 Plane으로 바뀔 경우 코드도 바뀌어야 한다.

     

     

     

    IoC

    어플리케이션 스스로가 자신이 사용할 객체의 생성 및 주입에 전혀 관여하지 않고 프레임워크가 대신 해주는 것을 IoC(Inversion of Control) 이라고 한다.

     

    다음 시간엔 스프링에서의 IoC에 대해 알아보자

     

     

    'Java > SpringBoot' 카테고리의 다른 글

    API 예외 처리  (0) 2022.08.18
    파일 업로드  (0) 2022.08.18
    타입 컨버터  (0) 2022.08.18
    예외 처리와 오류 페이지  (0) 2022.08.18
    [Thymeleaf] 문법 정리  (0) 2021.01.18
Designed by Tistory.