지금까지 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 (이일민)
'Back-end > Spring' 카테고리의 다른 글
[Spring] JUnit - 예외조건에 대한 테스트 (0) | 2020.08.07 |
---|---|
[Spring] 테스트 자동화 - JUnit 도구 활용 (0) | 2020.08.06 |
[Spring] 의존성 주입 - DI (0) | 2020.08.02 |
[Spring] 싱글톤 레지스트리 (0) | 2020.08.02 |
[Spring] 스프링의 IoC (0) | 2020.07.31 |