Spring을 통해 MySQL에 접근하기 위해서 Bean 객체를 정의하고 DataSource에 주입하였습니다.
구체적은 소스코드는 다음과 같습니다.
pom.xml
MySQL 연결을 위해 maven 저장소에서 필요한 모듈을 내려받습니다.
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
root-context.xml
JDBC 드라이버를 사용하여 MySQL에 접근할 수 있는 Bean을 정의합니다.
<!-- Root Context: defines shared resources visible to all other web components -->
<bean id="myDS" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"></property>
<property name="username" value="ID"></property>
<property name="password" value="PW"></property>
</bean>
DataSourceTest.java
DataSource를 주입(@Inject)하면 root-context.xml에서 정의한 Bean을 사용하여 MySQL에 접근하게 됩니다.
...
import javax.inject.Inject;
import javax.sql.DataSource;
...
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"file:src/main/webapp/WEB-INF/spring/**/*.xml"})
public class DataSourceTest {
@Inject
private DataSource ds;
try(Connection con = ds.getConnection()){
System.out.println(con);
}catch(Exception e){
e.printStackTrace();
}
}
내가 정의한 Bean(MyDS)이 어떻게 DataSource(ds) 객체에 주입될 수 있었을까요?
겉으로는 둘 사이의 연결고리가 없어보이는데 말이죠.
연결고리는 바로 org.springframework.jdbc.datasource.DriverManagerDataSource에 있습니다.
DriverManagerDataSource는 AbstractDataSource를 상속받은 클래스입니다.
이 AbstractDataSource가 DataSource를 Impements(구현)하고 있습니다.
Spring은 Inject를 위해 가장 먼저 interface를 구현한 Bean이 있는지 검사합니다.
예제에서는 myDS Bean의 DriverManagerDataSource 클래스가 DataSource를 구현하고 있죠.
그래서 myDS Bean이 DataSource에 주입된 것입니다.
참고
- http://expert0226.tistory.com/195
- http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/DriverManagerDataSource.html
'Spring' 카테고리의 다른 글
[spring] session 만료되었으나 제거되지 않는 문제 (0) | 2016.05.04 |
---|