본문 바로가기

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로 빈들을 관리하면 프로그램 실행중에 빈을 변경해서 의존성을 변경해줄 수 있다는 장점이 있다.

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

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

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