ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링퀵스타트 의존성주입
    Spring/Spring Quick Start 2019. 5. 21. 08:49

    스프링 프레임워크의 가장 중요한 특징은 객체의 생성과  의존관계를 컨테이너가 자동으로 관리한다는 점이다. 이것이 바로 스프링 IoC(Inversion of Control, 제어의 역행)의 핷미 원리이기도 하다. 스프링은 IoC를 다음 두 가지 형태로 지원한다. 

     

     

    Inversion of Control

    1. Dependency Lookup(의존성 요청)

    2. Dependency Injection(의존성 주입)

    >>> a. Setter Injection

    >>> b. Constructor Injection

     

    |Dependency Lookup

    컨테이너가 애플리케이션을 운용할 때 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 검색(Lookup)하여 사용하는 방식이다. 하지만 이 방식은 실제 애플리케이션 개발 과정에서는 사용하지 않는다.

     

    |Dependency Injection

    객체 사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리해준다. 따라서, 의존성 설정을 바구고 싶을 때 프로그램 코드를 수정하지 않고 스프링 설정 파일 수정만으로 변경사항을 적용할 수 있어서 유지보수가 향상된다. 

     

    컨테이너가 직접 객체들 사이에 의존관계를 처리하는것을 의미하며, 이것을 다시 Setter 메소드를 기반으로 하는 세터 인젝션(Setter Injection)과 생성자를 기반으로 하는 생성자 인젝션(Constructor Injection)으로 나뉜다.

     

    |의존성관계

    의존성관계란 객체와 객체간의 결합 관계이다. 즉, 하나의 객체에서 다른 객체의 변수나 메소드를 이용해야 한다면 이용하려는 객체에 대한 객체 생성과 생성된 객체의 레퍼런스 정보가 필요하다.

     

    <construcvtor-arg>엘리먼트에는 ref/value/index/name/type속성이 있다.

     

    ref와 value 속성을 사용하여 생성자 매개변수로 전달할 값을 지정할 수 있다.

     

    이 때 인자로 전달될 데이터가 <bean>으로 등록된 다른 객체일 때는 ref속성을 이용하여 해당 객체의 아이디(id)나 이름(name)을 참조하지만,

     

    고정된 문자열이나 정수 같은 기본형 데이터일 때는 value 속성을 사용한다. 따라서 SonySpeaker 객체를 생성자 인자로 전달할 때는 ref속성을 이용했지만, 270000이라는 정수값을 전달할 때는 value 속성을 사용하였다.

     

    ref id, name 참조
    value 고정된 문자열, 기본형 데이터 참조

     

    생성자가 여러개 오버로딩 되어있다면 어떤 생성자를 호출해야 할지 분명하지 않을 수 있다. 이를 위해 index 속성을 지원하며 index 속성을 이용하면 어떤값이 몇 번째 매개변수로 매핑되는지 지정할 수 있다. index는 0부터 시작한다.

    index="0"

     

     

    ApplicationContext를 이용하여 bean을 관리한다.

    이번에는 인터페이스 Speaker와 SonySpeaker 클래스, AppleSpeaker클래스를 생성한다.

    이렇게해서 ApplicationContext를 이용하여 소스 수정없이 간단하게 관리할 수 있다.

     

    추가적으로 위에서 학습한 lazy-init="true"를 활용하면 사용하지 않는 객체를 생성하느라 메모리를 낭비하지않게하여 메모리 관리에 유용하게 쓰일 수 있다.

     

     

    |Setter 인젝션 이용하기

    Setter 인젝션을 이용하려면 스프링 설정파일에 <constructor-arg> 엘리먼트 대신에 <property>엘리먼트를 사용해야 한다. name 속성값이 호추랗고자 하는 메소드 이름이다. 즉, name 속성값이 "speaker"라고 설정되어 있으면 호출되는 메소드는 setSpeaker()dlek. 변수이름에서 첫글자를 대문자로 바꾸고 앞에 있는 "set"을 붙인 것이 호출할 메소드 이름이다.

     

    Setter 메소드 이름 name 속성값
    setSpeaker( ) name="speaker"
    setAddressList( ) name="addressList"
    setBoardDAO( ) name="boardDAO"

    생성자 인젝션과 마찬가지로 Setter 메소드를 호출하면서 다른 bean 객체를 인자로 넘기면 ref속성을 사용하고 기본형 데이터를 넘기려면 value속성을 사용한다.

     

    |p 네임스페이스

    Setter 인젝션을 설정할 때, p 네임스페이스를 이용하면 좀 더 효율적으로 의존성 주입을 처리할 수 있다. p 네임스페이스는 네임스페이스에 대한 별도의 schemaLocation이 없다. 따라서 네임스페이스만 적절히 선언하고 사용할 수 있다.

     

    applicaitonContext에 "xmlns:p="http:www.springframework.org/schema/p"를 추가하면 된다.

     

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:p="http:www.springframework.org/schema/p"
              xsi:schemaLocation="http://www.springframework.org/schema/beans 
                                          http://www.springframework.org/schema/beans/spring-beans.xsd">

    </beans>
     

    STS기능으로 p 네임스페이스 추가하면 훨씬 편하게 추가할 수 있고, aop/beans/c/cache/context/jee/lang/mvc/p/task/util을 선택해서 추가할 수 있다.

     

     

    p네임스페이스를 선언했으면 다음과 같이 참조형 변수에 참조할 객체를 할당할 수 있다.

    p:변수명-ref="참조할 객체의 이름이나 아이디"

     

    기본형이나 문자형 변수에 직접 값을 설정할 때는 다음과 같이 사용한다.

    p:변수명="설정할 값"

     

     

    |컬렉션

    프로그램을 개발하다보면 배열이나 List 같은 컬렉션(Collection) 객체를 이용하여 데이터 집합을 사용해야 하는 경우가 있다. 이때 객체를 의존성 주입하면 되는데, 스프링에서는 이를 위해 컬렉션 매핑과 관련된 엘리먼트를 지원한다.

    컬렉션 유형 엘리먼트
    java.util.List, 배열 <list>
    java.util.Set <set>
    java.util.Map <map>
    java.util.Properties <props>

     

    1. List 타입매핑

     

    -applicationContext.xml-

    <bean id="collectionBean" class="com.springbook.ioc.injection.CollectionBean">
        <property name="addressList">

                  <list>

                          <value>서울시 강남구 역삼동 </value>
                          <value>서울시 성동구 행당동 </value>
                  </list>

         </property>

    </bean>

     

    -CollectionBean.java-

    package com.springbook.ioc.injection;

    import java.util.List;

    public class CollectionBean {
    private List addressList;

    public List getAddressList() {
    return addressList;
    }

    public void setAddressList(List addressList) {
    this.addressList = addressList;
    }


    }

     

    -CollectionBeanClient.java-

    package com.springbook.ioc.injection;

    import java.util.List;

    import org.springframework.context.support.AbstractApplicationContext;
    import org.springframework.context.support.GenericXmlApplicationContext;

    public class CollectionBeanClient {

    public static void main(String[] args) {
    AbstractApplicationContext factory =
    new GenericXmlApplicationContext("applicationContext.xml");

    CollectionBean bean = (CollectionBean)factory.getBean("collectionBean");
    List addressList = bean.getAddressList();
    for(String address : addressList) {
    System.out.println(address.toString());
    }
    factory.close();
    }

    }

    두 개의 문자열 주소가 저장된 List 객체를 CollectionBean 객체의 setAddressList( ) 메소드를 호출할 때, 인자로 전달하여 addressList 멤버변수를 초기화하는 설정이다.

     

     

     

     

    2. Set 타입 매핑

    중복값을 허용하지 않는 집합 객체를 사용할때는 java.util.Set이라는 컬렉션을 사용한다. 컬렉션 객체는 <set>태그를 사용하여 설정할 수 있다.

    private Set addressList;
    public void setAddressList(Set addressList) {
    this.addressList = addressList;
    }

     

    <set value-type="java.lang.String">


    서울시 강남구 역삼동
    서울시 성동구 행당동 
    서울시 성동구 성수동

     

    </set>

     

    3. Map 타입 매핑

    특정 key로 데이터를 등록하고 사용할 때는 java.util.Map 컬렉션을 사용하며, <map> 태그를 사용하여 설정할 수 있다.

     

    4. Properties 타입 매핑

    key=value 형태의 데이터를 등록하고 사용할 때는 java.util.Properties라는 컬렉션을 사용하며 <props>엘리먼트를 사용하여 설정한다.

     

     

     

    댓글

© 2018 T-Story. All right reserved.