이전 시간에 작성한 코드의 결과는 잘 출력되기는 하나 실질적인 값이 들어가 있지 않아 의미없는 결과를 출력하였다.
따라서 클래스에 getter와 setter를 추가한 뒤, setting.xml 파일을 다음과 같이 수정해주었다.
태그를 사용해 NewlecExam 클래스 안에 있는 getter, setter 함수를 이용한 것이다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam">
<property name="kor" value="10"/>
<property name="eng" value="10"/>
<property name="math" value="10"/>
<property name="com" value="10"/>
</bean>
<!-- ExamConsole console = new GridExamConsole(); -->
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- console.setExam(exam); -->
<property name="exam" ref="exam"/>
</bean>
</beans>
위와 다른 방법으로 생성자를 이용하는 방법이 있다.
우선 NewlecExam 클래스의 생성자는 다음과 같다.
public NewlecExam(int kor, int eng, int math, int com) {
this.kor = kor;
this.eng = eng;
this.math = math;
this.com = com;
}
위의 생성자를 이용해서 DI 값을 지정하기 위해서는 지시서를 아래와 같이 변경할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam">
<constructor-arg value = "10" />
<constructor-arg value = "10" />
<constructor-arg value = "10" />
<constructor-arg value = "10" />
</bean>
<!-- ExamConsole console = new GridExamConsole(); -->
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- console.setExam(exam); -->
<property name="exam" ref="exam"/>
</bean>
</beans>
<constructor-arg> 태그를 이용한 것인데, 위 처럼 사용할 경우 생성자에 매개변수로 들어가는 순서가 모호하므로 버그를 양성할 가능성이 있다. 따라서 다음과 같이 index 속성을 사용하여 순서를 명시해 줄 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam">
<constructor-arg index="0" value = "10" />
<constructor-arg index="1" value = "20" />
<constructor-arg index="3" value = "30" />
<constructor-arg index="2" value = "40" />
</bean>
<!-- ExamConsole console = new GridExamConsole(); -->
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- console.setExam(exam); -->
<property name="exam" ref="exam"/>
</bean>
</beans>
값이 순서에 따라 잘 들어가는지 확인하기 위해 NewlecExam 클래스에 toString 함수를 추가하고 결과를 출력하였다.
ApplicationContext context = new ClassPathXmlApplicationContext("spring/di/setting.xml");
Exam exam = context.getBean(Exam.class);
System.out.println(exam.toString());
다만 위처럼 순서만으로는 각 변수에 어떤 값이 들어가는지 정확하게 표현할 수 없기 때문에 다음과 같이 name 속성을 사용하여 이름을 지정해줄 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam">
<constructor-arg name="kor" value = "10" />
<constructor-arg name="eng" value = "20" />
<constructor-arg name="com" value = "30" />
<constructor-arg name="math" value = "40" />
</bean>
<!-- ExamConsole console = new GridExamConsole(); -->
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- console.setExam(exam); -->
<property name="exam" ref="exam"/>
</bean>
</beans>
만약 생성자 오버로딩으로 인해 생성자가 여러 개일 경우 생성자 호출이 모호해질 수 있다. 따라서 type 속성을 사용하면 이러한 현상을 방지할 수 있다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam">
<constructor-arg name="kor" type="int" value = "10" />
<constructor-arg name="eng" type="int" value = "20" />
<constructor-arg name="com" type="int" value = "30" />
<constructor-arg name="math" type="int" value = "40" />
</bean>
<!-- ExamConsole console = new GridExamConsole(); -->
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- console.setExam(exam); -->
<property name="exam" ref="exam"/>
</bean>
</beans>
헌데 위처럼 속성이 많아지다 보면 코드가 복잡해지는 경우가 발생한다. 따라서 코드의 길이를 줄이고 속성을 단순하게 표현하는 방법이 있는데, 그 방법은 다음과 같다.
먼저 setting.xml에서 Namespaces 탭으로 가서 p를 체크해준다.
이제 다시 Source 탭으로 가보면 p라는 namespace가 추가된 것을 확인할 수 있다.
여기서 namespace는 크게 두 가지의 의미를 갖는데, 첫 번째는 해당 태그가 특정한 처리기에 의해서 실행될 수 있도록 특정 짓기 위한 용도이고, 두 번째는 태그의 이름을 식별하기 위함이다.
즉, 다음과 같이 사용할 수 있다.
<?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">
<!-- Exam exam = new NewlecExam(); -->
<bean id="exam" class="spring.di.entity.NewlecExam" p:kor="10" p:eng="20" p:math="40" p:com="30"/>
<!-- <bean id="exam" class="spring.di.entity.NewlecExam">
<constructor-arg name="kor" value = "10" />
<constructor-arg name="eng" value = "20" />
<constructor-arg name="com" value = "30" />
<constructor-arg name="math" value = "40" />
</bean> -->
<!-- ExamConsole console = new GridExamConsole(); -->
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- console.setExam(exam); -->
<property name="exam" ref="exam"/>
</bean>
</beans>
'🍃 Spring, Spring Boot > 스프링 프레임워크 기초' 카테고리의 다른 글
[Java / Spring] 6. XML Configuration을 Java Configuration으로 변경하기 (0) | 2022.04.11 |
---|---|
[Java / Spring] 5. 어노테이션을 이용한 객체 생성 (0) | 2022.04.11 |
[Java / Spring] 4. 어노테이션을 이용할 때의 장점과 @Autowired를 이용한 DI 해보기 (0) | 2022.04.11 |
[Java / Spring] 3. 콜렉션 생성과 목록 DI (0) | 2022.04.11 |
[JAVA / Spring] 1. 스프링을 통해 DI 설정 (0) | 2022.04.10 |