본문 바로가기

WEB/SPRING

토비의 스프링 7.6 스프링 3.1의 DI

이전에는 XML코드로 빈들을 관리했다. 이제는 스프링 3.1을 이용하여 자바코드로 빈들을 관리하려고 한다.

 

applicationContext.xml

<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="org.mariadb.jdbc.Driver"/>
        <property name="url" value="jdbc:mariadb://localhost:3307/bootex"/>
        <property name="username" value="bootuser"/>
        <property name="password" value="bootuser"/>
    </bean>

    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>


    <!--  application components -->

    <!-- sql service -->

    <bean id="sqlRegistry"
          class="spring.sql.updatable.EmbeddedDbSqlRegistry">
        <property name="dataSource" ref="embeddedDatabase"></property>

    </bean>

    <bean id="sqlService" class="spring.sql.OxmSqlService">
        <property name="unmarshaller" ref="unmarshaller"/>
        <property name="sqlRegistry" ref="sqlRegistry" />
    </bean>



    <jdbc:embedded-database id="embeddedDatabase" type="HSQL">
        <jdbc:script location="sqlRegistrySchema.sql"/>
    </jdbc:embedded-database>



    <bean id="unmarshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
        <property name="contextPath" value="/jaxb"/>
    </bean>

    <tx:annotation-driven />

    <bean id="userDao" class="spring.dao.UserDaoJdbc">
        <property name="dataSource" ref="dataSource"/>
        <property name="sqlService" ref="sqlService"/>

    </bean>



    <bean id="userService" class="spring.service.UserServiceImpl">
        <property name="userDao" ref="userDao" />

    </bean>

    <bean id="testUserService" class="spring.service.UserServiceTest$TestUserService" parent="userService" />




</beans>

 

@Configuration

빈들을 등록하기 위한 클래스라는 것을 알리는 애노테이션이다. @Configuration이 붙은 클래스 자체도 빈으로 등록된다.

 

@Import

빈 설정을 위한 @Configuration클래스를 포함하기 위해서 사용한다.

 

@PropertySource

database.properties 파일의 property정보를 가져온다.

@Value 애노테이션을 이용해서 변수에 넣어주고 db에 적용하기 위해서 사용한다.

 

AppContext

@Configuration
@EnableTransactionManagement
@Import({SqlServiceContext.class })
@EnableSqlService
@PropertySource("/database.properties")
public class AppContext implements SqlMapConfig{
    /**
     * DB연결과 트랜잭션
     */

    @Autowired
    Environment env;

    @Value("${db.driverClass}") Class<? extends Driver> driverClass;
    @Value("${db.url}") String url;
    @Value("${db.username}") String username;
    @Value("${db.password}") String password;


    @Override
    public Resource getSqlMapResource()
    {
        return new ClassPathResource("sqlmap.xml", UserDao.class);
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer()
    {
        return new PropertySourcesPlaceholderConfigurer();
    }

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


        ds.setDriverClass(this.driverClass);
        ds.setUrl(this.url);
        ds.setUsername(this.username);
        ds.setPassword(this.password);

        return ds;
    }

    @Bean
    public PlatformTransactionManager transactionManager() {
        DataSourceTransactionManager tm = new DataSourceTransactionManager();
        tm.setDataSource((javax.sql.DataSource) dataSource());
        return tm;
    }

    /**
     * 애플리케이션 로직 & 테스트용 빈
     */

    @Autowired
    SqlService sqlService;

    @Bean
    public UserDao userDao() {
        UserDaoJdbc dao = new UserDaoJdbc();
        dao.setDataSource((javax.sql.DataSource) dataSource());
        dao.setSqlService(this.sqlService);
        return dao;
    }

    @Bean
    public UserService userService() {
        UserServiceImpl service = new UserServiceImpl();
        service.setUserDao(userDao());

        return service;
    }

 

database.properties 

db.driverClass=org.mariadb.jdbc.Driver
db.url=jdbc:mariadb://localhost:3307/bootex?useUnicode=true&characterEncoding=utf8mb4"
db.username=bootuser
db.password=bootuser

 

@EnableTransactionManagement

@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement {
}

 

@EnableSqlService

@Import(value= SqlServiceContext.class)
public @interface EnableSqlService {
}

 

 

xml과 자바코드로 빈을 관리하는 방법 비교

 

xml로 빈들을 관리하면 프로그램 실행중에 빈을 변경해서 의존성을 변경해줄 수 있다는 장점이 있다.

하지만 최근에는 개발과 배포의 주기가 빨라졌기 때문에 자바코드로 작성하는 편이

가독성 측면에서는 장점이 있다고 생각한다.

두 가지 방법을 알아두고 상황에 맞게 사용하면 될 것이다.