Spring

[Spring] DataSource 의존성 주입

behonestar 2016. 7. 12. 23:20




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



참고


'Spring' 카테고리의 다른 글

[spring] session 만료되었으나 제거되지 않는 문제  (0) 2016.05.04