본문 바로가기

Dev-/Spring

스프링을 쓰는 이유 - 1. DI(의존 주입) + IOC(제어의 역전)

- DI(의존 주입)

- IOC(제어의 역전)

아무 스프링 책을 펼치시면 가장 먼저 나오는 단어들입니다. 


- DI: '의존관계에 있는 객체를 생성하지 않아도, 그 종속객체를 사용할 수 있는 것'

여기서 의존관계란 쉽게,, 하나의 객체에서 다른 하나의 객체를 사용하는 관계를 말합니다.

뭐.. 예를 들어 A 클래스 내에서 B 클래스를 사용한다면,,

A와 B는 의존관계에 있다고 할 수 있습니다. (엄밀히는 'A가 B에 의존'B가 변한다면 A가 변하기 때문입니다.)



보통 클래스 내에서 객체를 사용하기 위해서는 

아래와 같이 객체를 생성해주어야합니다.

public class A {

/**
* new B();와 같이 객체를 생성해주어야 함
*/
B b = new B();

b.method1();
}


스프링에서는 아래와 같이 사용할 수 있죠.

public class A {

@Autowired
B b;

b.method1();
}


어떻게 객체를 생서하지 않고 사용할 수 있나?라고 한다면..


- IoC (Inversion of Control, 제어의 역전)

본래 B클래스의 new B();(생성자 호출) 의 제어권한은 B에게 있습니다. 능동적이죠.

B의 제어권한을 수동적으로 바꾸어, 프레임워크(컨테이너)에게 그 제어권한을 주는 것이 바로 IoC의 개념입니다.


결국,, 이렇게 하는 가장 큰 이유


생성자 호출 뿐만 아니라, 생성된 객체의 생명주기 '전체'에 대한 권한, 관리를 프레임워크(컨테이너)에게 주어

개발자가 비즈니스 로직에만 신경 쓸수 있게 해주죠.

(IoC 개념은 스프링 이전부터 활용되어져 왔는데,, 스프링에서 그 개념을 차용한 것이라고 하네요.)





아래 코드를 보시면 이해가 조금 더 수월할 듯 합니다.



그 이유는..??

아래와 같이 설정 파일을 세팅해주었기 때문입니다.



이렇게 xml 파일에 의존 관계에 있는 클래스들을 컨테이너으로 미리 등록(혹은 어노테이션을 사용)해 둠으로써

컴파일 시점 이전에 의존 관계를 주입해 주는 것을 의존주입이라고 합니다.

(따라서 컴파일 없이 설정 정보를 변경할 수 있다는 장점을 가지고 있습니다.)


(참고. : Ioc 컨테이너가 관리하는 객체)