[ 제어의 역핵 ] IoC - Setter 인젝션

IoC의 기본적인 개념 및 흐름은 IoC 생성자 인젝션에서 확인!
https://hongjuni.tistory.com/58
[ 제어의 역행 ] IoC - 생성자 인젝션
[ 제어의 역행 ] Inversion of Control 기존 MVC2 패턴에서 insert.do 요청 >> new InsertAction() (FC에서 작성됨) 를 실행하게 되었는데 new InsertAction(req,res); => 인자를 추가하는 순간 FC에서 오류..
hongjuni.tistory.com
Setter 인젝션
생성자 인젝션 보다 자주 사용할 인젝션이며
기본적으로 자바를 사용하며 클래스의 멤버변수를 이용할 때 자주 사용한 기억이 있을 것이다
마찬가지로 Setter인젝션은 자주 쓰일 인젝션인 것이다
생성자 인젝션에선 생성자를 만들때 인자를 xml에서 줬다면
Setter 인젝션에선 멤버변수를 Setter 해주는 기능을 xml에서 해줄 것이다
생성자 인젝션
<constructor-arg ref="Awatch"> 를 <bean> 태그 바디에 넣었다면
Setter 인젝션
<property name="watch" ref="Awatch"/> 를 <bean> 태그 바디에 넣어준다
** Awatch는 <bean id="Awatch" class="test.AppleWatch"/> 에서 온 것이다
생성자 인젝션을 만들기 위해선 해당 객체(인자)를 가지고잇는 생성자를 생성해야하는 것과 같이
Setter 인젝션도 마찬가지로 해당 객체를 Setter 할수있는 메서드를 생성해야한다
( Galaxy 클래스)

( Client 메인메소드 )

( applicationContext.xml 내부 )

( 객체 생성 순서 ** )

Setter 인젝션 객체 생성 순서
1. 갤럭시 객체 생성 ( initMethod 와 Setter 가 존재 )
2. 필요한 세터관련 객체생성
3. 세터에 적용
4. initMethod 사용
5. 이후 객체생성
** 세터가 필요한 객체라면
해당 세터의 객체를 먼저 생성을 하게된다
생성자 인젝션과 Setter 인젝션 의미는 크게 다르지 않다
생성자 인젝션 Setter 인젝션 은 해당 인자(객체)가 필요할 경우의 설정 하는 것인데
생성자를 이용하여 해당 객체를 받아오는 방법
Setter를 이용하여 해당 객체를 받아오는 방법
2가지의 종류를 가지고 있을 뿐이지 개념 자체는 같다고 볼 수 있다
중요 포인트는 해당 프로젝트(앱)을 배포를 받을때 구분할 수 있어야 한다의 개념
>> 어떤 객체는 생성자 인젝션, 어떤 객체는 Setter 인젝션 섞여있다면 좋지 않을 것이기 때문
+ 0914 수업 내용추가
Setter 인젝션을 자주 사용하기 때문에
Setter 인젝션을 기준으로 여러가지 상황을 사용해 보자
컬렉션 프레임워크를 Setter 인젝션으로 이용해 보자
( applicationContext.xml 내부 )

( TestBean 클래스 )

( Client 메인메소드 )

값을 저장하는 <property> 태그를 이용하여
<property name="멤버변수 명"> 으로 타겟하고
해당 변수 (컬렉션) 의 값을 주입해 주는 것
컬렉션에 맞게 <list> <set> <map> 태그를 이용하며
List와 Set 처럼 <value> 태그하나로 이용하지 않고
Map 컬렉션은 키값 + 값을 저장하는 컬렉션 프레임 워크이므로
<entry>
<key><value>
<value>
</entry>
엔트리 구조로 한개의 Map 값을 주입한다
( Client 메인메소드 결과 )

** Set 프레임워크의 특성으로 바나나가 중복되어 하나만 출력 된것을 볼 수있다
[ 추가공부 ]
워치 3종류를 List 컬렉션에 담아보자



Xml 에서의 name = "wList" 못찾는 에러 발생
name 속성은 멤버변수를 타겟하는 것이 아닌 Setter 의 이름을 타겟 하는 것이였다
Setter의 생성방식으로는 앞자리의 소문자를 대문자로 바꾸는 형식으로
setWList() 로 되었어야했는데
setwList()로 생성되었다
그래서 name 속성에서 wList를 찾지 못하여 빨간줄로 에러가 발생하였다
오류 해결방법
1) setwList() 를 setWList() 로 변경한다
2) 멤버변수명을 watchDatas로 만들어
자동 게터세터를 생성시 setWatchDatas() 로 만들어지게끔 만든다
** 멤버변수를 만들때 wList와 같이 애매한 변수가 아닌
watchDatas 처럼 확실한 변수명을 만들어주는 것이 중요하다
** 멤버변수명으로 List 라는 이름을 넣으면 컬렉션같으므로 Datas로 만드는 것이 좋다
중요하다고 생각하는 점
1번
<property> 태그속성 중
name 속성의 역할
멤버변수 ( 정확하게는 Setter ) 를 타겟 한다는 점
2번
<property> name속성에 맞는 멤버변수를 타겟 했다면
멤버변수에 맞는 값을 줘야한다는 점
<!-- applicationContext.xml 내부 -->
객체라면
ref = "객체 id명"
>> 이 경우에 객체화 해줄 <bean>이 필요하고 해당 id값을 ref에 넣는다
<bean id="iphone" class="test.IPhone">
<property name="watch" ref="Gwatch"/>
</bean>
<!-- name = "watch" 는 tets.IPhone의 Watch 인터페이스객체형 멤버변수-->
<bean id="Gwatch" class="test.GalaxyWatch"/>
데이터타입의 값이라면
value = "멤버 변수의 데이터 타입에 맞는 값"
<bean id="iphone" class="test.IPhone">
<property name="number" value="9890"/>
</bean>
<!-- number는 tets.IPhone의 int타입 멤버변수-->
컬렉션 프레임워크라면
<bean id="td" class="test.TestBean" >
<property name="set">
<set>
<value>바나나</value>
<value>바나나</value>
<value>사과</value>
</set>
</property>
</bean>
<!-- name="set"은 test.TestBean의 Set 컬렉션형 멤버변수 -->