본문 바로가기
프레임워크 & 라이브러리/스프링 & 전자정부 프레임워크

[스프링/전자정부] xml을 이용한 스프링 프레임워크 설정

by 뒹굴거리는프로도 2018. 7. 23.
반응형

 


토비의 스프링 3.1

1.8 XML을 이용한 설정

1.8.1 XML 설정
1.8.2 XML을 이용하는 애플리케이션 컨텍스트
1.8.3 DataSource 인터페이스로 전환
1.8.4 프로퍼티 값의 주입

 

 

1.8 XML을 이용한 설정


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

 

1.8.1 XML 설정


*connectionMaker()의 전환

connectionMaker() 메소드의 <bean> 태그 전환

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

 

*userDao()의 전환 

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

userDao.setConnectionMaker(connectionMaker());

<property name="connectionMaker" ref="connectionMaker" />

 

*XML의 의존관계 주입 정보

빈의 이름을 바꾸는 경우, 그 이름을 참조하는 다른 빈의 <property> ref 애트리뷰트의 값도 함께 변경해줘야 한다.

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

</beans>

 

 

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


XML에서 빈의 의존관계 정보를 이용하는 IoC/DI 작업에는 GenericXmlApplicationContext를 사용한다. 이것의 생성자 파라미터로 XML 파일의 클래스 패스를 지정해주면 된다. 애플리케이션 컨텍스트가 사용하는 XML 설정파일의 이름은 관례를 따라 applicationContext.xml 이라고 만든다. 이제 애플리케이션 컨텍스트 생성 부분을 작성해보자.

ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml")
//클래스 패스를 시작하는 /는 넣을 수도 있고 생략할 수도 있다.
//클래스패스뿐 아니라, 다양한 소스로부터 설정파일을 읽어올 수 있다.

new GenericXmlApplicationContext("springbook/user/dao/daoContext.xml");
//하지만 패키지명을 전부 적어야 한다.

//xml 파일과 같은 클래스패스에 있는 클래스 오브젝트를 넘겨서, 클래스 패스에 대한 힌트를 제공할 수 있다.
new ClassPathXmlApplicationContext("daoContext.xml", UserDao.class);

 

 

1.8.3 DataSource 인터페이스로 전환


*DataSource 인터페이스 적용

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

package javax.sql

public interface DataSource extends CommonDataSource, Wrapper{
    Connection getConnction() throws SQLException;
}

//DataSource를 사용하는 UserDao
import javax.sql.DataSource;

public class UserDao{
    private DataSource dataSource;

    public void setDataSource(DataSource dataSource){
        this.dataSource = dataSource;
    }

    public void add(User user) throws SQLException{
        Connection c = dataSource.getConnction();
        ...
    }
    ...
}

 

DataSource의 구현 클래스가 필요하다. 스프링이 제공해주는 DataSource 구현 클래스 중에 테스트환경에서 간단히 사용할 수 있는 SimpleDriverDataSource라는 것이 있다. 이 클래스를 사용하도록 DI를 재구성하자.

 

*자바 코드 설정 방식


기존 connectionMaker() 메소드를 먼저 dataSource()로 변경하고, SimpleDriverDataSource의 오브젝트를 리턴하게 한다.

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

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

    return dataSource;
}

 

DataSource 타입의 빈을 DI 받는 userDao() 빈 정의 메소드

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

 

*XML 설정 방식

id가 connectionMaker인 빈을 없애고 새로 등록한다.

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.SimpleDriverDataSource" />

 

이제 xml에서 dataSource() 메소드에서처럼 DB 연결정보를 어떻게 넣는지 확인해보자.

 

1.8.4 프로퍼티 값의 주입


*값 주입

텍스트나 단순 오브젝트 등을 수정자 메소드에 넣어주는 것을 스프링에서는 '값을 주입한다'고 말한다. 일종의 DI라고 볼 수 있다. 사용할 오브젝트 자체를 바꾸지는 않지만, 오브젝트의 특성은 외부에서 변경할 수 있기 때문이다.

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

 

다른 빈 오브젝트의 레퍼런스(ref)가 아니라, 단순 값(value)를 주입해주는 것이기 때문에 ref 애트리뷰트 대신,  value 애트리뷰트를 사용한다.

<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc://localhost/springbook " />
<property name="username" value="spring" />
<property name="password" value="book" />

 

*value 값의 자동 변환

스프링은 프로퍼티의 값을, 수정자 메소드의 파라미터 타입을 참고해서 적절한 형태로 변환해 준다. 
setDiverClass() 메소드의 파라미터 타입이 Class 임을 확인하고, "cohttp://m.mysql.jdbc.Driver"라는 텍스트 값을 cohttp://m.mysql.jdbc.Driver라는 오브젝트로 자동 변경해주는 것이다.

Class driverClass = Class.forName("com.mysql.jdbc.Driver");
dataSource.setDriverClass(driverClass);

 

내부적으로 위와 같은 변환 작업이 일어나는 것이다.


또한 스프링은 value에 지정한 텍스트 값을 적절한 자바 타입으로 변환해 준다. Integer, Double, String, Boolean 같은 기본 타입은 물론이고, Class, URL, File, Charset 같은 오브젝트로 변환할 수도 있다. 또한 값이 여러 개라면, List, Map, Set, Properties나 배열 타입으로도 값의 주입이 가능하다.

 


 

반응형