[Spring] DataSource 의존성 주입

Spring 2016.07.12 23:20 Posted by 김한별 behonestar




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에 주입된 것입니다.



참고