스프링의 의존성 관리 방법

스프링의 의존성 관리 방법

  • 스프링 프레임워크의 가장 중요한 특징은 객체의 생성과 의존관계를 컨테이너가 자동으로 관리한다는 점이며, 이것이 스프링 IoC의 핵심원리이다.
  • 스프링은 두 가지 형태로 IoC를 지원한다.
    • Dependency Lookup
    • Dependency Injection

스프링 의존성 관리 방식

1. Dependency Lookup

  • 컨테이너가 객체들을 생성하여 로딩하면, 클라이언트는 컨테이너가 생성한 객체를 검색하여 사용하는 방식을 말한다.
  • 톰캣의 서블릿 컨테이너를 이용하여 서블릿을 사용하는 것과 같은 방식을 말한다.

2. Dependency Injection

  • 객체간의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리해주는 방식을 말한다.
  • 이 방식에는 Setter 메소드를 기반으로하는 세터 인젝션과 생성자를 기반으로 하는 생성자 인젝션으로 나뉜다.

생성자 인젝션

  • 스프링 컨테이너는 XML 파일을 이용해 빈을 생성할 때, 기본적으로 디폴트 생성자를 이용한다고 했다.
  • 하지만, 디폴트 생성자말고 매개변수가 있는 생성자를 호출할 수 있도록 설정할 수 있으며, 이 기능을 이용해 생성자 인젝션을 처리한다.
    • 매개변수로 의존관계에 있는 객체의 주소정보를 전달
  • 아래와 같이 설정할 수 있으며, 알아두어야 할점은 빈의 등록 순서이다.
    • 기본적으로 XML 설정파일에 등록된 순서대로 디폴트 생성자를 이용해 객체를 생성하지만, 생성자 인젝션을 사용하는 경우에는 의존 관계가 되는 객체를 먼저 생성하고 매개변수가 있는 생성자를 통해 최종적으로 빈등록을 마친다.
<bean id="samsungTv" class="TV">
    <constructor-arg ref="samsungSpeaker"></constructor-arg>
</bean>

<bean id="samsungSpeaker" class="Speaker" />
  • 추가적으로 <constructor-arg value="2000"></contructor-arg>와 같이 객체 참조가 아닌 값을 입력하여 생선자로 넘겨 줄수도 있으며, 오버로딩한 생성자가 많은 경우에는 헷갈리지 않도록 <constructor-arg index="0" ref="samsungTv"></contructor-arg>와 같이 매개변수 인덱스를 가리킬수도 있다.

세터 인젝션

  • 생성자 이외에 set 메소드를 이용하여 의존되는 객체를 주입하는 방법이다.
  • set 메소드의 호출 시점은 디폴트 생성자를 통해 객체가 생성된 직후이다.
  • XML 설정 방식은 약간의 규칙이 있을 뿐, 생성자 인젝션과 유사하다.
    • 엘리먼트를 이용하며 name 속성값으로 set메소드의 이름이 들어간다.(카멜표기법으로)
<bean id="samsungTv" class="TV">
    <property name="speaker" ref="samsungSpeaker" />
    <property name="price" value="2000" />
</bean>

<bean id="samsungSpeaker" class="Speaker" />
set 메소드 name 속성값
setSpeaker() name = “speaker”
setAddressList() name = “addressList”
setBoardDao() name = “boardDao”
  • 세터 인젝션은 p 네임스페이스라는 것을 사용하여 조금 다른 방법으로도 설정할 수 있다.
  • p 네임스페이스는 별도로 스프링 XML 스키마는 아니므로, 적절히 별도로 선언하여 사용하면 된다.
...
xmlns:p="http://~~"
...

<bean id="samsungTv" class="TV" p:speaker-ref="samsungSpeaker" p:price="2000" />

<bean id="samsungSpeaker" class="Speaker"></bean>
  • 이외에도 List나 Set 등의 타입의 객체의 의존관계를 처리하는 방법들도 있으며, 참조되는 객체의 선언 부분만 차이가 있을뿐 다 비슷하다.
    • <list>, <set>, <map> 등등
      • <set>의 경우 중복된 데이터를 저장하지 않으므로, XML 설정시에도 중복된 값은 하나로만 처리된다.

댓글