컴퓨터 공학/프로그래밍 과외 기록

[스프링 프레임워크 과외] 4. 의존성 주입

ITISIK 2021. 10. 9. 22:37
반응형

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>

 

 

 

반응형