DI(의존성 주입)

유동현·2022년 11월 10일
0
post-thumbnail

DI

  • Dependency :의존 객체
  • Injection :주입

하나의 객체를 사용하기 위해 필요한 객체(의존객체)가 필요할때

객체 A 가 사용되기 위해 B 객체가 반드시 필요하다고 가정하면,
A 객체 입장에서 B 객체는 의존 객체가 된다.

클래스 A 가 다음과 같은 상황이고,

public class A
{
    private B b;

    public A()
    {
    	b = new B();
    }
}
  • 『A a = new A();』 라는 구문을 통해 A 객체 생성을 하는 과정이 있다면,
    A의 의존 객체인 B 객체 생성 과정은 여기에 없으므로 A 객체 내부 생성자에 의존 객체인 B 를 생성하는 과정이 포함되어 있는 것이다.

  • 이는 의존성이 강한 결합에 속하고
    사용자가 B 객체를 바꾸고 싶어도 A 클래스의 내부 소스 코드를 바꾸지 않고서는
    다른 객체로 바꿀 수 없는 상황이 된다.

  • 허나 어떤 웹프로젝트를 배포시 배포된것은 .java가 아닌 .class로써 배포후에는 수정할 수 없다. 그러므로
    B b = new B();
    A a = new A(b);
    이와 같이 수정하여 B의 생성과정을 드러낸다면

  • 의존 객체인 B 객체에 대한 생성 권한이 사용자에게 주어진다.
    B 객체를 별도로 생성하고 A 객체에 이를 전달해 주는 것이다.

  • 필요할 경우 B 객체 대신 다른 객체로 변경하는 것도 가능하다.
    단 이때 다른 객체 또한 A로 업캐스팅될수 있도록 A를 implement한 상태여야 한다.
    이 때, B 객체를 의존 객체(Dependency)라고 하고,
    A 객체에 전달해 주는 과정을 주입(Injection)이라고 한다.
    즉 A라는 업무를 실행하기 위해서는 B가 필요한 상황이므로 주입해주는것

  • 이와같은것은 자바에서의 has a 관계와는 완전히 반대이며 이를 IoC(역제어) 라고 한다.

  • 스프링은 환경 설정 파일인 XML 파일을 통해서
    소스 코드 변경 없이 객체 생성과
    객체 간의 의존 관계(DI)를 설정, 조정, 변경할 수 있다.

※ DI 설정은 ① 생성자를 이용하는 방법과, ② setter 를 이용하는 방법
두 가지가 있다.
일반적으로 setter 메소드를 이용한 DI 방법을 사용하게 된다.
스프링에서는 XML 환경 설정 파일에서 객체 생성 및 DI 설정을 한다.

※ IoC(Inversion of Control)
DI 패턴을 적용하게 되면
객체 생성 과정 및 의존성 주입은 일반적인 객체 생성과는 다른 방식으로 진행된다.
작은 부품 객체인 C 를 만들고,
그 부품 객체인 C 를 중간 부품 객체인 B 에 주입(injection)
최종 완제품인 A 객체에 주입(Injection)하게 되면
객체 조립이 완성되는 구조... 이 과정... 또는 여기에 대한 관리...
를 모두 종합하여 IoC 라고 표현한다.
이 행위를 하는 주체 즉, IoC Container 를 대상으로 IoC 라고 표현하기도 하 고,
이 행위가 일어나는 장소를 IoC 라고 표현하기도 한다.

0개의 댓글