먼저, XML 설정부터 볼까나..

<bean id="userDao" class="chapter06.exercise.aop12.UserDaoJdbc">
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven />

<bean id="userService" class="chapter06.exercise.aop12.UserServiceImpl">
    <property name="userDao" ref="userDao" />
    <property name="mailSender" ref="mailSender" />
</bean>

<bean id="testUserService"
    class="chapter06.exercise.aop12.UserServiceTest$TestUserServiceImpl"
    parent="userService" />

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

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

<bean id="mailSender" class="chapter06.exercise.aop12.DummyMailSender" />

이 설정은 내가 강의할 때 사용하는 예제 코드에 들어있는 코드로, 토스3에 있는 코드를 기반으로 작성한 샘플 코드다. jdbc:embedded를 사용하는 등, 실습하기 손쉽게 조금 고친 부분이 있다.

이 설정을 스프링 3.1 자바 설정으로 다음과 같이 변경할 수 있다.

@Configuration
@EnableTransactionManagement
public class TestDaoConfg {
   
    @Bean
    public UserDao userDao(DataSource dataSource) {
        UserDaoJdbc userDaoJdbc = new UserDaoJdbc();
        userDaoJdbc.setDataSource(dataSource);
        return userDaoJdbc;
    }
   
    @Bean
    public UserService userService(UserDao userDao, MailSender mailSender){
        UserServiceImpl userServiceImpl = new UserServiceImpl();
        userServiceImpl.setUserDao(userDao);
        userServiceImpl.setMailSender(mailSender);
        return userServiceImpl;
    }
   
    @Bean
    public UserService testUserService(UserDao userDao, MailSender mailSender){
        TestUserServiceImpl userServiceImpl = new TestUserServiceImpl();
        userServiceImpl.setUserDao(userDao);
        userServiceImpl.setMailSender(mailSender);
        return userServiceImpl;
    }
   
    @Bean
    public MailSender mailSender(){
        return new DummyMailSender();
    }
   
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }
   
    @Bean(destroyMethod="shutdown")
    public DataSource dataSource(){
        EmbeddedDatabaseFactory factory = new EmbeddedDatabaseFactory();
        factory.setDatabaseName("sample");
        factory.setDatabaseType(EmbeddedDatabaseType.HSQL);
        ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
        populator.addScript(new ClassPathResource("member_table_1.sql"));
        factory.setDatabasePopulator(populator);
        return factory.getDatabase();
    }
   

}

뭐 대부분은 문제가 아닌데… jdbc 네임스페이스를 대체하는 코드는 도무지 외울 수가 없다.. XML이 더 편하게 느껴진다. 잘못해서 destroyMethod라도 설정하지 않으면 어쩔것인가…

@EnableXxx과 TestContext 연동으로 XML에서 자바 설정으로 넘어가지 위해 열심히 코딩해준 건 고맙지만.. 아직 2% 부족하게 느껴진다.