[ 제어의 역행 ]
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 파일에서 오버워치의 객체생성이 아래에 있지만
아이폰객체를 만들기 위해서 인자로 필요한 오버워치가 먼저 생성되는 것을 알 수 있다
'Spring' 카테고리의 다른 글
[ 제어의 역행 ] 어노테이션을 이용한 Model 관리 (0) | 2022.09.14 |
---|---|
[ 제어의 역행 ] IoC - 어노테이션 (0) | 2022.09.14 |
[ 제어의 역핵 ] IoC - Setter 인젝션 (0) | 2022.09.14 |
스프링 쓰는 이유 및 간단 개요 (0) | 2022.09.13 |
스프링 설치 및 설정 (0) | 2022.09.13 |