⭐ Programming/Backend

DI와 IOC와 DIP (feat. 프레임워크와 라이브러리)

김 진 하 2023. 5. 7. 22:14

1. DI란?

  • Dependency Injection으로 의존성 주입이라는 뜻
  • 객체의 의존 관계를 외부에서 주입하는 방법
    • 의존 관계란?
      • 네모 그림과 그림 그리는 함수가 예로 있다.
      • 네모 그림에 김 그림을 그리는 함수를 넣으면 네모는 김이 되고, 스마트폰을 그리는 함수를 넣으면 네모는 폰이 된다.
      • 네모 그림을 그리는 함수 A는 김을 그리거나 폰을 그리는 함수 B, C에 의해 무엇이든 될 수 있고, 이 관계를 의존 관계라 한다.
  • 이같은 의존성을 외부에서 주입하는 것을 의존성 주입 DI 라고 한다.

 

2. 클래스 간의 관계

  • 연관 관계
class A {
	private B b;
}
  • 의존 관계
class A {
	public B method(B b){
    	return new B();
    }
}
  • 상속 관계
class A extends B {
}
  • 실체화 관계
class A implements B {
}

 

3. 의존성 주입 방법

public class SquarePic {
    private final Phone phone;

    public SquarePic(Phone phone) {
        this.phone = phone;
    }
}
  • Setter 주입
public class SquarePic {
    private Phone phone;

    public void setCpu(Phone phone) {
        this.phone = phone;
    }
}
  • Field 주입
public class SquarePic {
    @Autowired
    private Phone phone;
}
  • 인터페이스 주입
public class SquarePic implements Drawing{
    private Phone phone;
 
    @Override
    public void drawPhone(Phone phone) {
        this.phone = phone;
    }
}
 
interface Drawing {
    void drawPhone(Phone phone);
}

4. IoC란?

  • Inversion Of Control로 제어의 역전이라는 뜻
  • 일반적으로 객체의 생명 주기 및 변수, 메소드 등을 내부에서 주입해서 코드를 제어한다.
  • 그러나, 외부에서 의존성을 주입하여 컨트롤하는 것으로 제어권을 넘겨주게 된다.
  • 이것을 한국어 그대로 제어의 역전이라고 한다.
  • 그리고 이것의 예시로 Strategy Pattern, DI, Abstract Factory 등 을 들 수 있다.
  • 의존 관계로 조립된 빈을 모아둔 그릇을 스프링 IoC 컨테이너라고 한다.
  • 의존성의 결합도(Coupling)가 낮아져서 유연성이 높아진다.
    • Loose Coupling일 수록 더 다양한 모습의 객체가 될 수 있다.

 

5. DIP란?

  • Dependency Inversion Principle로 의존성 주입 원칙이라는 뜻
  • 상위 모듈은 하위 모듈에 의존하지 않는다.
  • 추상화에 의존해야한다.
  • 네모 그리기가 폰 그리기, 버스 그리기 등으로 완성되기 때문에 의존하는 관계였다면 추상화를 통해 구현에서 자유를 주고 하위 객체로 부터 독립시켜주었다.
public interface Drawing {
    void draw();
}

public class SquarePic implements Drawing {
    private Drawing phone;
    private Drawing bus;

    public SquarePic(Drawing phone, Drawing bus) {
        this.phone = phone;
        this.bus = bus;
    }

    @Override
    public void draw() {
        phone.draw();
        bus.draw();
    }
}

public class Phone implements Drawing {
    @Override
    public void draw() {

    }
}

public class Bus implements Drawing {
    @Override
    public void draw() {

    }
}

6. 프레임워크와 라이브러리 차이

  • 소프트웨어 개발에 사용되는 도구라는 공통점이 있다.
  • 프레임워크
    • 소프트웨어의 구조와 흐름을 결정하는 것으로 프레임워크의 규칙과 패턴에 따라 코드를 작성
    • 코드가 프레임워크에서 제공하는 규칙과 기능에 밀접하게 의존
    • 개발자에게 제공하는 실행 환경, 기능
  • 라이브러리
    • 재사용 가능한 메소드, 클래스 등의 집합체
    • 개발자가 필요에 의해 선택적으로 사용할 수 있음
    • 필요한 라이브러리를 코드에서 호출하여 사용
    • 코드가 라이브러리에 선택적으로 의존

 

7. 목적

: 이 모든 복잡한 이론의 목적은 결국!!!!! 유지보수의 용이성! 유연성!

 

cf) 참고: https://velog.io/@gillog/Spring-DIDependency-Injection