주니 개발 도서관

Spring

[ 제어의 역행 ] IoC - 생성자 인젝션

주니홍 2022. 9. 14. 09:36

[ 제어의 역행 ]


Inversion of Control

 

기존 MVC2 패턴에서 

insert.do 요청 >> new InsertAction()  (FC에서 작성됨) 를 실행하게 되었는데

new InsertAction(req,res); => 인자를 추가하는 순간 FC에서 오류발생 (기존의 인자가없는 것이 있기 때문)

 

개발자가 직접 new 객체화 하다보니 실수가 많다 + 결합도가 높다

-> 컨테이너에게 객체화를 담당시키자!

자바 코드로 new 하는것이 아니라, 컨테이너가 객체화 처리
소스 코드에 new가 없음 >> 결합도가 낮아짐 >> 유지보수가 용이
( 소스코드에 new가 있다 >> 의존관계를 명시했다고 표현 )

 

결합도를 낮추는 방법중

1) 인터페이스
객체지향  -  다형성을 사용하여 "설계"에서 낮춰볼 수 있고

2) 디자인 패턴 : 팩토리(Factory) 패턴**
"Client 에서 직접적으로 new 하는 소스코드를 제거"
Factory의 역할 : 요청에 맞는 객체를 반환해줌

 

IoC와 관련된 설정을 applicationContext.xml로 작성
applicationContext.xml >> 스프링 설정 파일

// applicationContext.xml 파일 내부

<bean id="phone" class="test.IPhone"/>
 ==
test.Iphone phone = new test.IPhone();

동작 순서

 

1) 클라이언트가 컨테이너를 로딩

2) 이때, 스프링설정파일을 참고하여 로드
3) 스프링설정파일의 <bean> -> 객체화 == 즉시 로딩(pre-loading) 방식
4) "phone" 객체 요청 == Lookup 이라고 표현
5) 요청한 객체 반환

 


 

의존관계를 IoC하는 방법 == 의존성을 주입하는 방법

 

조건 - 생성자 주입(인젝션)

 

핸드폰은 하나가 존재하고, 여러 워치를 추가 해보자

>>  워치는 종류가 다양하게 많다 (애플워치, 갤럭시워치, 오버워치)
>>  인터페이스를 만든다 ( 워치의 틀 잡기 )
>>  워치를 2개이상 클래스 생성
>>  <bean>을 이용해서 기존의 워치를 변경하여 갈아끼워보세요

 

Point 어떤 워치를 주입하는지에 따라 주입한 워치의 아웃풋이 나와야 한다

 

( applicationContext. xml 파일 내부 )

( Client.java 메인메소드 내부 )

 

( Phone 인터페이스를 이용한 IPhone )

해당 위치에서 xml에서 인자로 넣어준 Watch의 맞춰 Watch가 들어온다

 

 

 

( 클라이언트의 결과 )

 

 

 

객체 생성 순서의 차이 **

주입을 할때 필요한 객체를 생성 후 주입되어 객체화 된다!!

xml 파일에서 오버워치의 객체생성이 아래에 있지만

아이폰객체를 만들기 위해서 인자로 필요한 오버워치가 먼저 생성되는 것을 알 수 있다