0. 도입
스프링 프레임워크의 특징 중 하나는, 객체의 생성과 의존관계를 컨테이너가 자동으로 관리한다는 점이다. 이것이 바로 제어의 역행(IoC)의 핵심 원리인데, 스프링은 IoC를 다음 두 가지 형태로 지원한다.
- Dependency lookup : 지금까지 실시했던 방식으로, 컨테이너를 통해서 bean을 찾아오는 방식이다.
- Dependency Injection : 이번 포스트에서 배울 방식으로, 스프링 설정 파일(xml)을 수정함으로써 의존성 설정을 변경할 수 있다. 이러한 의존성 주입 방식은 Setter 메서드를 기반으로 하는 Setter Injection과 생성자를 기반으로 하는 Constructor Injection으로 나뉜다. 두 방식 모두 멤버변수를 원하는 값으로 설정하는 것에 목적이 있다는 점은 동일하다.
1. 생성자 인젝션(Constructor Injection) => <constructor-arg> 태그 활용
스프링 컨테이너는 기본적으로 객체를 생성할 때 기본 생성자만을 호출하지만, 매개변수가 존재하는 다른 생성자를 호출하도록 설정을 변경할 수 있는데 이를 활용한 인젝션 기법이다.
우선 생성하고자 하는 객체의 클래스 파일에 특정 객체를 매개변수로 하는 생성자를 만들어 준다. 이후 xml 설정 파일에서 해당 객체의 <bean>태그 안에 <constructor-arg ref="[특정 객체 bean 태그의 id]"></constructor-arg>를 포함시켜준다.
만약 객체가 아닌 단순 값을 매개변수로서 전달하고자 한다면 <constructor-arg value="[임의의 초기값]"></constructor-arg>를 포함시키면 된다. 다만, 여러 생성자가 오버로딩 되어 있는 경우라면 <constructor-arg> 태그를 어느 매개변수에 대입해야하는지 혼돈이 올 수 있는데 이때에는 다음과 같이 index 옵션을 설정함으로써 혼돈을 막을 수 있다.
<constructor-arg index="0" ref="[특정 객체 bean 태그의 id]"></constructor-arg>
<constructor-arg index="1" value="[임의의 초기값]"></constructor-arg>
혹시 <constructor-arg> 태그에 의해 전달되는 객체가 자주 Switch되는 상황이라면, 해당 객체들이 동일한 클래스를 implements하도록 만든 뒤 xml 파일의 변경만으로 이를 변경할 수 있어 편리하다.
2. 세터 인젝션(Setter Injection) => <property> 태그 활용
이름에서 알 수 있듯이 작성된 클래스 소스에 setter 메소드가 존재해야 이 방식을 취할 수 있다. setter 메서드는 스프링 컨테이너가 자동으로 호출하며, 호출하는 시점은 <bean> 객체를 인스턴스화 시킨 직후이다. 즉 <bean> 객체를 인스턴스화 시키기 위한 (기본)생성자가 필수로 필요하다는 말이 된다.
setter 인젝션을 사용하기 위해서는 <property> 태그를 사용해야 하는데, name 속성의 값이 객체의 이름과 동일해야 한다. 예를들어, Phone 객체에 관련된 setter 메서드 이름이 setPhone()이듯이, setPhone() 메서드를 사용하기 위해서는 name 속성의 값이 "phone"이어야 한다는 것이다. 즉 아래와 같은 태그가 된다.
<property name="phone" ref="[특정 객체 bean 태그의 id]"></property>
<property name="volume" value="[임의의 초기값]"></property>
혹은 아예 p 네임스페이스를 활용한 방법이 있다. applicationContext.xml 파일의 <beans> 태그의 속성으로 xmlns:"http://www.springframework.org/schema/p"를 넣어주고, <bean>태그에 아래와 같이 속성을 적어주면 된다.
<bean id="p" class="com.itisik.Phone" p:phone-ref="speaker" p:volume="10"/>
3. 컬렉션 객체 의존성 주입
1) List 객체
<bean> 태그의 내부에 아래와 같이 작성해준다.
<property name="myList">
<list>
<value>목록1</value>
<value>목록2</value>
</list>
</property>
2) Map 객체
<bean> 태그의 내부에 아래와 같이 작성해준다.
<property name="myMap">
<map>
<entry>
<key><value>키1</value></key>
<value>값1</value>
</entry>
<entry>
<key><value>키2</value></key>
<value>값2</value>
</entry>
</map>
</property>
3) Set 객체
<bean> 태그의 내부에 아래와 같이 작성해준다.
<property name="mySet">
<set value-type="java.lang.String">
<value>스페이드2</value>
<value>스페이드3</value>
<value>스페이드3</value>
</set>
</property>
4) Properties 객체
<bean> 태그의 내부에 아래와 같이 작성해준다.
<property name="myProperties">
<props>
<prop key="키1">값1</prop>
<prop key="키2">값2</prop>
</props>
</property>
'컴퓨터 공학 > 프로그래밍 과외 기록' 카테고리의 다른 글
[Django 프레임 워크] 1. Django 프레임 워크를 위한 설정 (0) | 2021.10.17 |
---|---|
[스프링 프레임워크 과외] 5. 어노테이션 설정 (0) | 2021.10.09 |
[스프링 프레임워크 과외] 3. 컨테이너 및 설정 파일(applicationContext.xml) (0) | 2021.10.04 |
[스프링 프레임워크 과외] 2. 프레임 워크 개요 (0) | 2021.10.04 |
[스프링 프레임워크 과외] 1. 실습(개발) 환경 구축 (0) | 2021.10.04 |