SpringFramework/XML

커넥션풀 [ Spring-JDBC ] DriverManagerDataSource / JdbcTemplate , SqlSessionTemplate , MapperInterface 빈 등록 및 의존성 주입 / root-context.xml

유혁스쿨 2020. 9. 1. 19:24
728x90
반응형

 Spring-JDBC

 

root-context.xml에 다음 코드를등록합니다.

    <!-- [Spring-jdbc] -->
    <!-- [DriverManagerDataSource] 객체 dataSource 빈등록 -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<!--  mybatis에 DataSource객체 의존성주입을 하기 위해 setter()를 통한 주입 - dataSource의 필드 초기화 --> 
        <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:HostIp주소:포트번호:DB명"/>
        <property name="username" value="유저이름"/>
        <property name="password" value="비밀번호"/>
    </bean>
    
    <!--Spring-JDBC 쿼리문 수행객체 / hikaricp에서도 호환가능-->
    <!-- [JdbcTemplate] 객체 jdbcTemplate 빈 등록 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- jdbcTemplate에 dataSource객체 의존성 주입 - setter()를 통한 의존성 주입 -->
        <property name="dataSource" ref="ds"/>	
    </bean>
    
    <!-- MyBatis 핵심객체 SqlSessionFactory 빈 등록 / 데이터소스를 주입해야합니다. -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    	<property name="dataSource" ref="ds"/>
    	<property name="configLocation" value="classpath:/mybatis-config.xml"/>
    	<property name="mapperLocations" value="classpath:/mappers/**/*.xml" />
    </bean>
    	
    <!-- mybatis쿼리문 수행객체를 설정 / SqlSessionTemplate방식-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
    	<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
    
    <!-- 매퍼의 인터페이스를 스캔하는 설정 / MapperInterface방식 -->
    <mybatis-spring:scan base-package="com.spring.mvc.board.repository"/>

 

천천히 코드를 살펴보며 각각의 기능과 의존성관계를 설명하겠습니다.

 

 

Spring-Jdbc 공통 빈 등록

 

[ DriverManagerDataSource ]

 

◎DriverManagerDataSource를 dataSource라는 bean id로 스프링 컨테이너에 빈등록합니다.

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:HostIp주소:포트번호:DB명"/>
        <property name="username" value="유저이름"/>
        <property name="password" value="비밀번호"/>
    </bean>

 DriverManagerDataSource의 각 필드에 setter()로 속성값을 주입합니다.

DriverManagerDataSource의 dataSource 빈은 기본적으로 DataBase의 정보를 담아주는 그릇 역할을 합니다.

sqlSessionFactory가 dataSource에 의존성을 갖게 되는데, 만약 필드에 값이 없다면 의존성이 주입을 하더라도 빈 객체를 받기 때문에 NullPointerException에러가  발생합니다.

그러므로 각 필드에 꼭 DB정보에 대한 데이터를 주입해야합니다.

※ property name속성이 url인 value속성에는 HostIp, 포트번호, DB명은 각각 자신의 DB정보로 등록해야합니다.

 

 

 

[ SqlSessionTemplate ]

 

SqlSessionFactoryBean을 sqlSessionFactory라는 bean id로 스프링 컨테이너에 빈등록합니다.

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:/mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:/org/zerock/mappers/*/*.xml"/>
    </bean>

SqlSessionFactoryBean클래스는 sql문을 담아내는 빈이 있으며 그러한 빈을 만들어내는 공장 같은 클래스라고 보시면 됩니다.

이 클래스는 DB정보가 담긴 dataSource가 있어야만 작동을 수행할 수 있습니다.

따라서 SqlSessionFactoryBean은 DB정보가 담긴 dataSource에게 의존적이다 라고 합니다.

SqlSessionFactoryBean과 dataSource는 서로 의존관계입니다.

property태그로 setter()를 통해 SqlSessionFactoryBean의 필드에 dataSource 빈의 의존성주입과, 필드에 속성값을 주입합니다.

property name속성이 configLocation인 maybatis-config.xml은  데이터 저장빈 클래스 객체 별칭을 지정,관리합니다.

property name속성이 mapperLocations인 value속성에 등록된 해당 경로의 모든 xml파일은 mybatis 매퍼 xml태그로 쿼리문을 다루는 매퍼태그의 위치를 조정합니다.   

 만약 dataSource객체를 의존성 주입하지 않거나 SqlSessionFactory의 필드에 데이터를 주입해주지 않는다면 정보가 Null인 객체를 주입받기때문에 NullPointerException이 발생하게됩니다.

 

 

 

 

[ JdbcTemplate ]

 

 JdbcTemplate를 jdbcTemplate라는 bean id로 스프링 컨테이너에 빈등록합니다.

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <!-- jdbcTemplate에 dataSource객체 의존성 주입 - setter()를 통한 의존성 주입 -->
        <property name="dataSource" ref="ds"/>	
    </bean>

기존에 사용하던 JDBC로직을 템플릿화 시켜놓은것이 JDBC Template입니다.  
구현하는 기능들을 미리 따로 선언해놓고 통합 메서드로 구현해놓은것입니다. 
메서드를 호출만해주면 가볍게 JDBC로직을 자동으로 처리되게 할수있고, close()도 자동으로 해줍니다.

스프링 JDBC 라이브러리이며, 입력,수정,삭제,조회 의 쿼리문을 수행해주는 메서드를 제공하는 JdbcTemplate입니다

JDBC의 장점을 유지하면서, 전통적 방식의 JDBC단점을 극복하여, 간결한 형태의 API사용법을 제공하며 기존방식에서 지원하지 않는 편리한 기능을 제공합니다.

 

 

 

[ SqlSessionTemplate ]

 

◎SqlSessionTemplate를 sqlSession이라는 bean id로 스프링 컨테이너에 빈등록합니다. 

    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
    	<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

MyBatis에서 쿼리문을 수행해주는 수행객체입니다. clearCache속성으로 임시메모리를 깨끗이 지워줍니다.

전통적인 JDBC방식에서는 PreparedStatement와 같은기능을 수행해주지 않을까 생각합니다. 

SqlSessionTemplate의 sqlSession객체가 쿼리문을 수행하려고 할 때 DB정보를 담고있는 DataSourece, DataSource를 담고있는 sqlSessionFactory가 필요합니다.

따라서 SqlSessionTemplate는 sqlSessionFactory에 의존적이다 라고 합니다.

sqlSessionTemplate와 sqlSessionFactory는 의존관계입니다.

따라서 constructor-arg 태그로 생성자를 통해 의존성을 주입해 줘야 합니다.

 만약 sqlSession객체를 의존성 주입하지 않는다면 정보가 Null인 객체를 주입받기때문에 NullPointerException이 발생하게됩니다.

 

컨트롤러로 부터의 명령 수행에 있어 가장 우선순위에 위치하는 클래스는 SqlSessionTemplate클래스 입니다.

순차적으로 sqlSessionTemplate 은 sqlSessionFactory에 의존적이며 sqlSessionFactory는 dataSource객체에 의존적이고

dataSource객체가 sqlSessionFactory에게 의존적 객체이기 때문에 정보가 들어있지 않으면 의존성주입이 정상적으로 되지 않습니다.

따라서 역순으로 DB정보를 dataSource에 주입해줘야하며 dataSource를 sqlSessionFactory에 주입해주고 DB정보가 들어있는 dataSource를 주입받은 sqlSessionFactory를 SqlSessionTemplate에 주입시켜줘야만 마이바티스로 인한 쿼리문이 정상적으로 수행됩니다.

 

 

 

[ MapperInterface ]

 

@mybatis Mapperxml파일을 빈으로 등록하기 위한 스캔 설정

    <mybatis-spring:scan base-package="com.spring.mvc.board.repository"/>

Mapper xml을 빈등록 하기 위해서는 DAO 로 인식되어야하는데 그 기준을 인터페이스로 합니다.

우리가 JdbcTemplate나 SqlSessionTemplate를 사용할때에는 서비스 인터페이스의 구현을 받는 DAO 클래스가 있었습니다.

MapperInterface방식은 DAO클래스의 역할을 Mapper xml에서 대신해주기때문에 Mapper xml을 자체적으로 빈등록해야합니다.

이때 Mapper xml의 namespace 속성에 인터페이스를 등록하여 연결하는데 이는 인터페이스와 클래스가 서로 구현관계인것과 같습니다.

그러므로 먼저 인터페이스를 찾아서 해당 인터페이스를 namespace속성으로 등록한 Mapperxml 파일을 자동으로 찾아 컨테이너에 빈 등록 해주는 것이 바로 이 코드입니다.


▶정리

 

[수행순서]

sqlSessionTemplatesqlSessionFactory dataSource ← DB정보

 

[주입순서]

DriverManagerDataSource필드 DB정보 주입 dataSource sqlSessionFactory → sqlSessionTemplate

 

[정의순서]

1. DriverManagerDataSource dataSource 객체 생성 및 필드 주입

2. SqlSessionFactory sqlSessionFactory 객체 생성 및 dataSource객체 주입

3. SqlSessionTemplate sqlSessionTemplate 객채 생성 및 sqlSessionFactory객체 주입 

728x90
반응형