Spring

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

주니홍 2022. 9. 14. 10:48

 

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 컬렉션형 멤버변수 -->