Spring | Dependency Injection(DI)와 Bean | 다른 Bean 추가


이것으로 의존성 주입의 기본적인 구조는 알았다. 한 걸음 더 전진하여 다른 Bean을 만들어 이용해 보기로 하자.

아래와 같이 간단한 샘플을 작성해 보겠다. 이번에는 “SomeBean"라는 클래스를 만들어 보자. 역시 SampleBeanInterface을 implements해서 message 속성을 가진다. 그러나 실제로는 String 타입의 message라는 필드는 존재하지 않는다. 내부에는 Date 및 SimpleDateFormat를 필드로 보관해 두었다가, 일시적으로 텍스트를 message로 교환 할 수 있도록 하고 있다.

package com.devkuma.spring;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class SomeBean implements SampleBeanInterface {
  private Date date;
  private SimpleDateFormat format;

  public SomeBean() {
   date = Calendar.getInstance().getTime();
    format = new SimpleDateFormat("yyyy/MM/dd");
  }

 public String getMessage() {
    return format.format(date);
 }

 public void setMessage(String message) {
    try {
     date = format.parse(message);
   } catch (ParseException e) {
      e.printStackTrace();
      date = null;
    }
 }

 @Override
 public String toString() {
    return "SomeBean [date=" + format.format(date) + "]";
 }
}

클래스가 준비되면 bean.xml을 열고 먼저 기술한 <bean> 태그 부분을 아래와 같이 고쳐보자.

<bean id="bean1" class="com.devkuma.string.SomeBean">
    <property name="message" value="2017/9/3"/>
</bean>

이제 실행하면 출력되는 텍스트가 “SomeBean [date=2017/09/03]” 바뀐다. SomeBean 인스턴스가 생성되어 사용할 수 있도록 되어있는 것을 알 수 있을 것이다. App 소스 코드에는 일절 손대지 않았는데 말이다.

9월 03, 2017 4:56:10 오후 org.springframework.context.support.AbstractApplicationContext prepareRefresh
정보: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5ce65a89: startup date [Sun Sep 03 16:56:10 KST 2017]; root of context hierarchy
9월 03, 2017 4:56:10 오후 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
정보: Loading XML bean definitions from class path resource [bean.xml]
9월 03, 2017 4:56:10 오후 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
정보: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@79b4d0f: defining beans [bean1]; root of factory hierarchy
SomeBean [date=2017/09/03]

이 예제와 같이 인터페이스를 정의하고 구현 클래스를 여러 준비해두면 간단히 속성 값을 설정할 뿐만 아니라, 그 속성의 처리 방법 등을 자유롭게 변경할 수 있게 되었다. 사용하는 클래스 및 속성 값은 코드를 전혀 건드리지 않고 변경할 수 있다. 이제 “Bean 인스턴스를 설정 파일에서 자동으로 생성한다"는 방식의 장점을 알게 되었다.