Back-end/Spring

[Spring] XML을 이용한 DI 의존관계 설정정보

 

지금까지 DI 의존관계 설정정보를 자바 코드를 이용해 만들어왔다.

 

스프링에서는 다양한 방법을 통해 DI 의존관계 설정정보를 만들 수 있는데,

대표적으로 XML이 있다.

 

 

✏️XML의 장점

 

  • 단순한 텍스트 파일이기 때문에 다루기 쉽다.
  • 쉽게 이해할 수 있으며 컴파일과 같은 별도의 빌드 작업이 없다
  • 환경이 달라져서 오브젝트 관계가 바뀌는 경우에도 빠르게 변경사항을 반영 할 수 있다.
  • 스키마나 DTD를 이용해서 정해진 포맷을 따라 작성됐는지 손쉽게 확인할 수 있다.

 

✏️ XML을 이용한 설정

 

애플리케이션 컨텍스트는 XML에 담긴 DI 정보를 활용 할 수 있다.

 

XML 설정은 @Configuration과 @Bean이 붙은 자바 클래스로 만든 설정과 내용이 동일한데

아래와 같이 만들 수 있다.

  자바 코드 설정정보 XML 설정정보
빈 설정파일 @Configuration <beans>
빈의 이름 @Bean methodName() <bean id="methodName"
빈의 클래스 return new BeanClass(); class="a.b.c... BeanClass">

 

주의할 점 

 

  • <bean> 태그의 class 애트리뷰트에 지정하는 것은 자바 메소드에서의 클래스 이름
  • 메소드의 리턴 타입을 class 애트리뷰트에 사용하지 말자
  • XML에서는 리턴타입을 지정하지 않아도 된다.

✏️ 구현 ( ConnectionMaker 메소드 전환 ) 

@Bean
    public ConnectionMaker 
    connectionMaker(){
        return new NConnectionMaker();
    }
<bean id="connectionMaker" class="springbook...NConnectionMaker" />

 

✏️ 구현 ( userDao 메소드 전환 )

 

userDao에는 DI 정보의 세가지 요소가 모두 들어 있다.

 

DI 정보의 요소

빈의 이름, 빈의 클래스, 빈의 의존 오브젝트

 

또한 수정자 메소드를 사용해 의존관계를 주입해주었는데,

수정자 메소드는 XML로 의존관계 정보를 만들 때 정말 편리하다.

 

XML에서는 <property> 태그를 사용해 의존 오브젝트 관계를 정의한다

<property> 태그는 name ref, 두 개의 애트리뷰트를 갖는데

name은 프로퍼티의 이름, ref는 수정자 메소드를 통해 주입해줄 오브젝트의 빈 이름이다.

 

userDao.setConnectionMaker(connectionMaker());
<property name="connectionMaker" ref="connectionMaker" />

위와 같이 전환이 가능하며 <bean> 태그 안에 넣어주면 완성된다.

<bean id="userDao" class="springbook.dao.userDao">
	<property name="connectionMaker" ref="connectionMaker" />
</bean>

이렇게 하면 DaoFactory에서 XML로의 전환 작업이 끝난 것이다.

 

만약 connectionMaker 빈의 이름을 myConnectionMaker라고 바꿨다면, 아래와 같이 ref 부분을 바꿔야 한다.

<bean id="myConnectionMaker" class="springbook...NConnectionMaker" />
<bean id="userDao" class="springbook.dao.userDao">
	<property name="connectionMaker" ref="myConnectionMaker" />
</bean>

 

✏️ XML을 위한 애플리케이션 컨텍스트

 

우선 XML 설정파일을 애플리케이션 컨텍스트가 사용할 수 있도록 만들어주자.

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframwork.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-3.0.xsd">
    <bean id="connectionMaker" class="springbook.user.dao.NConnectionMaker" />
    
    <bean id="userDao" class="springbook.user.dao.UserDao">
    	<property name="ConnectionMaker" ref="connectionMaker" />
    </bean>
</beans>

이후 main() 함수 또는 UserDaoTest에서 ApplicationContext 오브젝트를 만들어줘야하는데,

 

이때, 즉 XML에서 빈의 의존관계 정보를 이용할 때 AnnotationConfigApplicationContext 대신

GenericXmlApplicationContext, ClassPathXmlApplicationContext를 사용해준다.

 

이 둘의 차이점은 Generic은 상대경로를 사용 할 수 없는데 반해 ClassPath는 상대경로를 사용해 쉽게 표현 할 수 있다.

 

  • GenericXmlApplicationContext
new GenericXmlApplicationContext("springbook/user/dao/daoContext.xml");

 

  • ClassPathXmlApplicationContext
new ClassPathXmlApplicationContext("daoContext.xml", UserDao.class);

 

이렇게 해주면 XML을 사용하지 않았을 때의 결과와 같은 값이 나올 것이다.

 

 

참고 문서 : 

토비의 스프링3 (이일민)

 

반응형