본문 바로가기
BackEnd/Spring

[Spring] Spring DI 지시서 작성하기 (Spring Bean Configuration)

by summer_light 2021. 8. 26.

Spring DI 지시서 작성하기

Spring DI 지시서, Spring Bean Configuration이다. (※Configuration: 환경 설정)

Spring이 이해할 수 있는 형식에는 1) XML, 2) annotation 이 있다. (XML - 자바config - boot 순으로 발전되었다.)

따라서 Spring에게 DI를 해달라고 요청할 때에는 위와 같은 형식으로 지시서를 작성해야 한다.  

 

XML 파일을 통해 지시서를 작성할 때에는, Spring이 제시하고 있는 양식에 따라 지시해야 한다.

이클립스의 Market Place에서 Spring 플러그인을 설치한 후 Spring Bean Configuration File(XML 파일) 을 생성하면, 직접 타이핑 하지 않아도 기본 양식이 작성되어 있어 편리하다.

 

원본의 코드가 아래와 같다고 했을 때, 

public class Program {

	public staic void main(String[] args) {
    
        //생성
        Exam exam = new NewlecExam();
        ExamConsole console = new GridExamConsole();
        
        //결합
        console.setExam(exam);
        
        //출력
        console.print();
    
    }

}

 

다음과 같이 메인 함수에서 생성+결합 부분을 생략하는 것이 Spring을 사용하는 목적이다.

public class Program {

	public staic void main(String[] args) {
    
    	/* Spring에게 지시하는 방법으로 코드 변경
        //생성
        Exam exam = new NewlecExam();
        ExamConsole console = new GridExamConsole();
        
        //결합
        console.setExam(exam);
        */
        
        
        //출력
        console.print();
    
    }

}

 

Spring은 <bean>이라고 하는 태그를 이용해서, 생성할 객체를 지시해달라고 한다.

자바에서 객체를 만들 때 아래와 같았던 표현은,

Exam exam = new NewlecExam();

 

Spring의 XML에서는 다음과 같이 표현된다. 

<bean id="exam" class="spring.di.entity.NewlecExam"/>

 

XML에서 DI하기 

XML 파일에서 DI를 하는 방법은 두 가지가 있다.

  1. 세터(Setter)를 사용하는 방법
  2. 생성자(Constructor)를 사용하는 방법

 

1. 세터(setter) 이용하여 DI 

자바에서 객체에서 Injection을 하는 다음과 같은 표현은,

console.setExam(exam);

 

Spring의 XML에서는 다음과 같이 console의 bean 태그 사이에서 <property> 태그에 표현된다.

<bean id="console" class="spring.di.ui.GridExamConsole">
	<property name="exam" ref="exam"></property>
</bean>

setExam의 set은 생략한 후, Exam의 e를 소문자로 바꾸어 name=" " 사이에 넣는다.

주의해야할 것은 <property name="exam">이라고 해서 직접 속성명을 지정해주는 것이 아니라, 단순히 setExam 과 같은 역할을 한다는 것이다. 그래서 console이 setExam( )메소드를 가지고 있지 않으면 오류가 발생된다. (속성 Exam exam이 아니다!)

 

.setExam(exam) 의 괄호 안의 exam이 ref=" " 사이에 들어간다.

(만약 exam이 객체가 아닌 단순 값이었다면 ref=" "가 아닌 value=" " 안에 들어가야 한다.)

<bean id="console" class="spring.di.ui.GridExamConsole">
    <property name="kor" value="10"></property>
    <property name="eng" value="30"></property>
    <property name="com" value="50"></property>
</bean>

 

 

 

2. 생성자(Constructor) 이용하여 DI

index, name 모두 없으면 생성자가 정의된 순서대로 값이 입력된다.

 

1) index

<bean id="console" class="spring.di.ui.GridExamConsole">
	<constructor-arg index="1" value="30"/>
	<constructor-arg index="2" value="50"/>
	<constructor-arg index="0" value="10"/>
</bean>

 

2) name

<bean id="console" class="spring.di.ui.GridExamConsole">
	<constructor-arg name="eng" value="30"/>
	<constructor-arg name="com" value="50"/>
	<constructor-arg name="kor" value="10"/>
</bean>

 

※ 필요시 type 도 함께 지정해줄 수 있기는 하다.

<bean id="console" class="spring.di.ui.GridExamConsole">
	<constructor-arg name="eng" type="float" value="30"/>
	<constructor-arg name="com" type="float" value="50"/>
	<constructor-arg name="kor" type="float" value="10"/>
</bean>

 

그리고 위의 코드는

xmlns:p="http://www.springframework.org/schema/p"

 

위 코드를 추가하면 다음과 같이 간단하게 표현할 수 있다. (Namespace - p 체크하면 자동으로 추가된다)

<bean id="console" class="spring.di.ui.GridExamConsole" p:kor="10" p:eng="30" p:com="50"/>

 

(아래의 원래 코드와 비교하면 훨씬 더 간략하게 표현할 수 있게 되었다.)

<bean id="console" class="spring.di.ui.GridExamConsole">
	<constructor-arg name="eng" value="30"/>
	<constructor-arg name="com" value="50"/>
	<constructor-arg name="kor" value="10"/>
</bean>

 

이제, 이렇게 정의해 둔 XML의 bean을 가져와서 쓰고 싶다면 다음과 같이 표현하면 된다. 

<ref bean="exam"/>

 

EX01. exams bean에서 exam bean 가져와 사용하기

bean에도 ArrayList를 담을 수 있다. 

위에서 정의해 둔 exam bean을 가져와 사용했다.

이 exams 라는 ArrayList에는, 이제 새로 만든 kor=1, eng=2, com=3 의 값을 가지는 bean과 위에 만들어 둔 exam이 들어간다.

<bean id="exams" class="java.util.ArrayList">
	<constructor-arg>
		<list>
			<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="2" p:com="3"/>
			<ref bean="exam"/>
		</list>
	</constructor-arg>
</bean>

 

([Namespace] - [util] 을 선택하면 아래와 같이 간단하게 표현할 수 있다.)

<util:list>
	<bean class="spring.di.entity.NewlecExam" p:kor="1" p:eng="2" p:com="3"/>
	<ref bean="exam"/>
</util:list>

 

댓글