티스토리 뷰

반응형

DI , 의존성 주입을 알기 위해서는 의존성이 뭔지부터 알아야겠다

 

Object Dependencies(객체 의존성)

현재 객체가 다른 객체와 상호작용을 하고 있다면 현재 객체는 다른 객체에 의존성을 가진다

public class A {
    private B b = new B();
}

간단하게 말하자면 한 객체에서 다른 객체를 가지고 와서 쓰면 그게 바로 의존성이다

이 의존성에는 단점이 있는데, A 객체는 B객체의 생성을 제어하기 때문에 두 객체 간에는 긴밀한 결합이 생기고 이에 따라 A 객체를 변경하면 B의 객체도 변경된다 즉 A 객체가 변경되면 B 객체도 변경된다는 것이다 또한 이렇게 두 객체 사이에 의존성이 존재하면 단위 테스트 작성이 어려워진다

 

 

DI(Dependency Injection) 의존성 주입

필요한 자원을 외부에서 생성자를 통해 넣어주는게 바로 의존성 주입이다

쉽게 말해서 A 클래스의 b라는 객체 자체가 아니라 Constructor(생성자) 또는 Setter 같은 Framework를 사용하여 b에게 의존성을 주입한다

public class A {
    private B b;
    
    public void anyMethod() {
    	b.~
    }
}

토비스프링에서 정의한 의존관계 주입에 조건은 다음과 같다

• 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다 그러기 위해서는 인터페이스만 의존하고 있어야 한다

• 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다

• 의존관계는 사용할 객체에 대한 레퍼런스를 외부에서 주입해줌으로써 만들어진다

 

이렇게 되면 외부로부터 수많은 인터페이스 타입으로 교체되어 주입할 수 있으니 코드가 유연해지고

의존성 제어로 인해 수많은 객체들에 의존관계를 맺어 개발자는 편하게 비즈니스 로직에 집중할 수 있다

간단하게 풀어보자면 객체에 무언가를 주입하는 것은 프로그램이 알아서 하니 개발자는 로직에만 집중할 수 있다는 것이다

이러한 DI 즉 의존성 주입을 잘 녹인 프레임워크(Framework)가 바로 스프링이다

 

IoC(Inversion of Control) 제어의 역전

제어의 역전을 정말 간단하게 풀어보자면 개발자가 직접 객체를 생성하고 주입하던 것을 Framework가 대신해주는 것이다

public class A {

    @Autowired
    private B b;
    
}

스프링 프레임워크를 사용한다고 하면 B 라는 객체에 어노테이션으로 표시를 해놓고

컨테이너가 알아서 두 객체를 생성하고 의존성 까지 주입시키는 것이다

이는 개발자가 제어의 중심이지만 코드 전체에 대한 제어를 Framework가 대신한다고 이해해도 될 것이다

 

Spring Container

스프링의 핵심이라고 할 수 있는 스프링 컨테이너는 DI를 사용하여 응용프로그램을 구성하는 bean(객체)을 관리한다

스프링 컨테이너에는 두가지 유형이 있다

 

1.BeanFactory

말 그대로 빈(bean) 공장인데, bean 객체를 생성하고 관리하는 클래스이다.

빈을 등록하고 생성하고 조회하고 돌려주고, 그 외에 부가적인 빈을 관리하는 기능을 담당한다

빈 팩토리는 빈의 정의를 즉시 로딩하는 반면, 빈 자체를 호출하기 전까지는 인스턴스화 하지 않는다

getBean()이 호출되면 그때서야 팩토가 의존성 주입(DI)을 사용하여 빈은 인스턴스화 하고 빈의 특성을 설정한다

BeanFactory factory = new XmlBeanFactory(new FileInputStream("bean.xml"));

MyBean myBean = (Mybean) factory.getBean("myBean");

2.ApplicationContext

BeanFactory와 유사하지만 향상된 형태의 컨테이너다, 추가적으로 국제화 지원 텍스트 메시지 관리, 이미지 파일 로드, 리스너로 등록된 빈에게 이벤트 발생 통보등의 기능을 추가로 제공한다

ApplicationContext context = new ClassPathXmlApplicationContext("conf/bean.xml");

MyBean bean = context.getBean("myBean");

 

이 둘의 가장 큰 차이점은 BeanFactory의 경우 호출된 시점에서야 빈을 생성하지만

ApplicationContext같은 경우는 Context 초기화 시점에 모든 싱글톤 빈을 생성해 놓고 바로 호출할 수 있도록 보장한다는 것이다

 

 

반응형
댓글