PengTory

[Spring] 오브젝트와 의존관계 (5) _ XML 본문

Spring

[Spring] 오브젝트와 의존관계 (5) _ XML

펭토리 2022. 10. 14. 03:28

스프링은 DaoFactory와 같은 자바 클래스를 이용하는 것 외에도, 다양한 방법을 통해 DI 의존관계 설정정보를 만들 수 있는데 가장 대표적인 것이 바로 XML이다.

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

 

XML 설정

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

DI 정보가 담긴 XML 파일은 <beans>를 루트 엘리먼트로 사용한다. 하나의 @Bean 메소드를 통해 얻을 수 있는 빈의 DI  정보는 아래 세 가지다.

  • 빈의 이름: @Bean 메소드 이름이 빈의 이름이다. 이 이름은 getBean()에서 사용된다.
  • 빈의 클래스: 빈 오브젝트를 어떤 클래스를 이용해서 만들지를 정의한다.
  • 빈의 의존 오브젝트: 빈의 생성자나 수정자 메소드를 통해 의존 오브젝트를 넣어준다. 의존 오브젝트도 하나의 빈이므로 이름이 있을 것이고, 그 이름에 해당하는 메소드를 호출해서 의존 오브젝트를 가져온다. 의존 오브젝트는 하나 이상일 수도 있다
  자바 코드 설정 정보 XML 설정 정보
빈 설정 파일 @Configuration <beans>
빈의 이름 @Bean methodName() <bean id ="methodName"
빈의 클래스 return new BeanClass(); class="a.b.c... BeanClass">

아래는 완성된 XML 설정 정보이다.

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

 

XML을 이용하는 애플리케이션 컨텍스트

애플리케이션 컨텍스트가 DaoFactory 대신 XML 설정정보를 활용하도록 바꾸어 보겠다.

XML에서 빈의 의존관계 정보를 이용하는 IoC/DI 작업에는 GenericXmlApplicationContext를 사용한다. 따라서 GeneticXmlApplicationContext의 생성자 파라미터로 XML 파일의 클래스 패스를 지정해주면 된다.

<?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-3.0.xsd">

    <bean id="connectionMaker" class="springbook.user.dao.DConnectionMaker" />

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

설정을 완료하면 UserDaoTest의 애플리케이션 컨텍스트 생성 부분을 수정한다.

DaoFactory를 설정정보로 사용했을 때 썼던 AnnotationConfigApplicationContext 대신 GenericXmlApplicationContext를 이용해 애플리케이션 컨텍스트를 생성하게 만든다.

 

DataSource 인터페이스로 변환

DataSource 인터페이스 적용

사실 자바에는 DB 커넥션을 가져오는 오브젝트의 기능을 추상화해서 비슷한 용도로 사용할 수 있게 만들어진 DataSource라는 인터페이스가 이미 존재한다. 따라서 실전에서 ConnectionMaker과 같은 인터페이스를 만들어 사용할 일은 거의 없을 것이다.

DataSource 인터페이스와 다양한 DataSource 구현 클래스를 사용할 수 있도록 UserDao를 리팩토링해보자.

public class UserDao {
    private DataSource dataSource;
    
    public void setDataSource(DataSource dataSource){
        this.dataSource = dataSource;
    }
    
    public void add(User user) throws SQLException{
        Connection c = dataSource.getConnection();
        // ...
    }
    // ...
}

 

자바 코드 설정 방식

DaoFactory 설정 방식을 이용해보자

@Bean
public UserDao userDao(){
    UserDao userDao = new UserDao();
    userDao.setDataSoure(dataSource());
    return userDao;
}

@Bean
public DataSource dataSource(){
    SimpleDriverDataSource dataSource = new SimpleDriverDataSource();

    dataSource.setDriverClass(com.mysql.jdbc.Driver.class);
    dataSource.setUrl("jdbc:mysql://localhost/springbook");
    dataSource.setUsername("spring");
    dataSource.setPassword("book");

    return dataSource;
}

 

 XML 설정 방식

DataSource를 적용 완료한 applicationContext.xml이다.

<?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-3.0.xsd">

    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost/springbook"/>
        <property name="username" value="spring"/>
        <property name="password" value="book"/>
    </bean>

    <bean id="userDao" class="springbook.user.dao.UserDao">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

 

 

 

[참고자료] 토비의 스프링 3.1 Vol.1 스프링의 이해와 원리