본문 바로가기
IT_Developers/JAVA

Spring - 의존성 주입(DI) 이란? / 제어의 역전(IoC) 이란?

by 고코더 2020. 3. 19.

Dependency Injection , Inversion of Control 를 알아보자


안녕하세요.
고코더 입니다.



오늘은 의존성 주입(Dependency Injection)을 다뤄봅니다. 스프링의 핵심 개념중에 하나 입니다. 스프링에서 가장 중요한 핵심입니다. 이 부분때메 자바 서블릿을 하다. 스프링을 만나면 헤매게 되는 이유입니다. 100프로 이해하려면 현업에서 장점을 마주칠때 이해가 조금씩 되나 머리속에 잘들어오지 않는 개념입니다. 그러므로 그냥 얘는 원래 이러구나라고 생각하면 될거 같습니다.



 1. DI를 한줄로 요약하면


"객체간의 의존성을 외부에서 주입하는 개념"


 2. 비유



최근에 생긴 오락실을 가니깐 동전 넣는 부분이 없습니다. 그래서 물어보니 목에 매는 카드를 하나 줍니다. 이걸 가지고 게임을 원하는 만큼하고 계산대에서 카드로 계산하면 되는 방식이었습니다. 덕분에 동전 흘리고 다니지 않으면서 게임을 할 수 있었습니다. 여기서 나온 목에 매는 결제를 대신하게 하는 카드는 주입된 객체입니다. 철권이 한판에 500원이었습니다. 그런데 마진이 안남아 주인은 한판에 1000원을 올립니다. 기존 오락실이라면 각 오락기마다 가서 옵션을 수정해줘야 하지만 이 오락실은 사무실 컴퓨터에서 옵션을 변경하면 카드를 찍을때 1,000원 으로 찍히게 하면 됩니다.  그리고 19세 이상만 할 수 있는 게임이라면 게임카드에 조건을 걸어서 특정 카드는 성인게임을 못하게 막을 수도 있습니다. 외부에서 모든 게임 설정을 주입합니다.


외부에서 오락기에 가격을 통제하는 이 방식이 의존성 주입입니다. 


 3. DI 아주 단순한 예제


가장 단순하고 직감적으로 소스를 보여드리겠습니다.

1. beans.xml 
해당 XML 파일에 의존성을 주입합니다. Gocoder라는 클래스를 GC라고 id를 부여합니다. 그러면 해당 주입된 객체는 이제 사용이 가능합니다.

1
<bean id="GC" class="bean.GoCoder" />
cs

2. hi.java
gc라고 명명한 객체를 생성하여 소스에서 사용합니다. 이렇게 XML이라는 외부에서 주입하는것이 바로 의존성 주입입니다.

1
2
3
jGC gc;
    public HI (Printer printer){
}
cs


 4. IoC 제어의 역전


스프링하면 가장 먼저 떠올라야 하는 단어가 IoC입니다. 번역하면 제어의 역전이라는 뜻입니다. 기존의 제어권은 개발자가 결정하였지만 이를 역전하여 스프링에서 하겠다는 말입니다. 프레임워크 내부에서 결정된 사항대로 개발이 흘러가는걸 제어의 역전이라고 합니다. 

객체의 생성애서 생명주기의 관리 객체에 대한 모든 제어권이 바뀌었다는 뜻입니다.

개발자가 라이브러리를 불러와서 직접 개발했던 행위에서 프레임워크 내에 라이브러리가 구성되고 개발자는 프레임워크에서 작성된 방식대로 코드를 호출하기 때문에 주도권이 스프링에게 있게 됩니다.


마무리


어렵죠? 저도 맨날 까먹어요


댓글