WebServer/Spring

[Spring] 컬렉션 의존성 주입

gangintheremark 2023. 9. 4. 15:55
728x90
태그 컬렉션 타입
<list> java.util.List 나 배열
<set> java.util.Set
<map> java.util.Map
<props> java.util.Properties
  • 컬렉션 원소가 기본타입인 경우에는 <value> 태그 이용
  • 컬렉션 원소가 객체인 경우에 <ref> 태그 이용

스프링에서 namespace를 이용해 컬렉션 타입의 프로퍼티를 설정할 때, 반드시 util 체크 필수

 

List 주입

순서 있고, 중복 허용

<!-- ① 기본 -->
<bean id="" class="">
    <property name="">
        <list>
            <ref bean="" />
            <ref bean="" />
            ...
        </list>
    </property>
 </bean>

<!-- ② util namespace -->
<util:list id="xxx">
    <ref bean="" />
    <ref bean="" />
    ...
</util:list>

<bean id="" class="">
    <property name="" ref="xxx" />
</bean>
💻 List 실습
  • 자바코드 : List<Cat> catList;
    <bean id="c1" class="com.dto.Cat">
        <property name="username" value="애옹이" />
        <property name="age" value="2" />
    </bean>
    <bean id="c2" class="com.dto.Cat">
        <property name="username" value="떼껄룩" />
        <property name="age" value="1" />
    </bean>

    <!-- 기본 -->
    <bean id="service" class="com.service.UserService">
        <property name="catList">
            <list>
                <ref bean="c1" />
                <ref bean="c2" />
                <ref bean="c1" />
            </list>
        </property>
    </bean>

    <!-- util namespace -->
    <util:list id="xxx">
        <ref bean="c1" />
        <ref bean="c2" />
        <ref bean="c1" />
    </util:list>

    <bean id="service2" class="com.service.UserService">
        <property name="catList" ref="xxx"></property>
    </bean>
실행결과 : 순서, 중복O

Set 주입

순서 없고, 중복 불가

<!-- ① 기본 -->
<bean id="" class="">
    <property name="">
        <set>
            <ref bean="" />
            <ref bean="" />
            ...
        </set>
    </property>
 </bean>

<!-- ② util namespace -->
<util:set id="xxx">
    <ref bean="" />
    <ref bean="" />
    ...
</util:list>

<bean id="" class="">
    <property name="" ref="xxx" />
</bean>
💻 Set 실습
  • 자바코드 : Set<Cat> catSet;
    <!-- c1, c2 빈은 List에서 작성한 것과 동일 -->
    <!--  기본  -->
    <bean id="service" class="com.service.UserService">
        <property name="catSet">
            <set>
                <ref bean="c1" />
                <ref bean="c2" />
                <ref bean="c1" />
            </set>
        </property>
    </bean>

    <!-- util namespace -->
    <util:set id="xxx">
        <ref bean="c1" />
        <ref bean="c2" />
        <ref bean="c1" />
    </util:set>

    <bean id="service2" class="com.service.UserService">
        <property name="catSet" ref="xxx" />
    </bean>
실행결과 : 순서X, 중복X

Map 주입

key/vale 쌍으로 저장

<!-- ① 기본 -->
<bean id="" class="">
    <property name="">
        <map>
            <entry key="" value-ref="" />
            <entry key="">
                <ref bean="">
            </entry>
            ...
        </map>
    </property>
 </bean>

<!-- ② util namespace -->
<util:map id="xxx">
    <entry key="" value-ref="" />
    <entry key="">
        <ref bean="">
        ...
    </entry>
</util:map>

<bean id="" class="">
    <property name="" ref="xxx" />
</bean>
💻 Map 실습
  • 자바코드 : Map<Cat> catMap;
    <!-- c1, c2 빈은 List에서 작성한 것과 동일 -->
    <!--  기본  -->
    <bean id="service" class="com.service.UserService">
        <property name="catSet">
        <map>
            <entry key="pet1" value-ref="c1" />
            <entry key="pet2">
                <ref bean="c2">
            </entry>
        </map>
        </property>
    </bean>

    <!-- util namespace -->
    <util:map id="xxx">
            <entry key="pet01" value-ref="c1" />
            <entry key="pet02">
                <ref bean="c2">
            </entry>
    </util:map>

    <bean id="service" class="com.service.UserService">
        <property name="catMap" ref="xxx" />
    </bean>
// 메인함수

public class UserMain {
    public static void main(String[] args) {

        // IoC Container 생성
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/config/user.xml");

        // 빈 얻기
        UserService service = ctx.getBean("service", UserService.class);

        Map<String, Cat> m = service.getCatMap();
        Set<String> keys = m.keySet();
        for (String key : keys) {
            System.out.println(key + "\t" + m.get(key));
        }
    }
}
실행결과: key값 - value 값

props 주입

key/value 쌍으로 저장. 단, value값은 무조건 문자열 !!

<!-- ① 기본 -->
<bean id="" class="">
    <property name="">
        <props>
            <prop key="키">문자열 값</prop>
            ...
        </props>
    </property>
 </bean>

<!-- ② util namespace -->
<util:properties id="xxx">
    <prop key="">문자열 값</prop>
    ...
</util:properties>

<bean id="" class="">
    <property name="" ref="xxx" />
</bean>
💻 Properties 실습
  • 자바코드 : Properties phones;
    <!--  기본  -->
    <bean id="service" class="com.service.UserService">
        <property name="phones">
            <props>
                <prop key="phone1">01032145698</prop>
                <prop key="phone2">01098765432</prop>
            </props>
        </property>
    </bean>

    <!-- util namespace -->
    <util:properties id="xxx">
        <prop key="phone1">01012345678</prop>
        <prop key="phone2">01022223333</prop>
    </util:properties>

    <bean id="service2" class="com.service.UserService">
        <property name="phones" ref="xxx"></property>
    </bean>
// 메인함수

public class UserMain {
    public static void main(String[] args) {

        // IoC Container 생성
        ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/config/user.xml");

        // 빈 얻기
        UserService service = ctx.getBean("service", UserService.class);

        Properties phones = service.getPhones();
        Set<String> keys = phones.stringPropertyNames(); // map의 keySet()과 동일
        for (String key : keys) {
            System.out.println(key + "\t" + phones.getProperty(key)); // map의 get(key)과 동일
        }
    }
}
실행결과 : key값 value값

key-value 속성

  • Map은 저장하는 value 값에 제한이 없다
  • Properties는 저장하는 value값이 무조건 문자열이다.
💡 Map의 key-value값 얻어오는 함수
Map<String, XXX> m = service.getXXX();
Set<String> keys = m.keySet();
m.get(key);

💡 Properties의 key-value값 얻어오는 함수
Properties p = service.getXXX(); 
Set<String> keys = p.stringPropertyNames();
p.getProperty(key);
728x90