차근차근 개발자 되기

Spring

92일차: Mybatis와 Spring으로 DB 연동_2021.10.28

wellow 2021. 10. 28. 22:37

 

목차

1.      Mybatis로 DB 연동

2.      Spring으로 DB 연동

 

 

1. Mybatis로 DB 연동         

 

- 스프링에서 DB 연동하는 방법 중 하나는 mybatis의 환경설정 파일(ex. configuration.xml)에서 연동하는 것이다.

- DB 연동을 mybatis의 환경설정에서 할 경우, 스프링의 환경설정 파일 중 하나인 root-context.xml 파일에는 DB 연동과 관련된 내용이 없다.

- mybatis의 환경설정 파일에는 1) alias를 설정 2) DB 연동 3) mapper 파일 지정과 관련된 내용이 들어간다.

- mybatis의 환경설정에서 DB 연동을 할 경우, DAO 클래스에서 @Autowired로 SqlSession 객체를 주입하는 것은 안되기 때문에, 직접 SqlSession 객체를 구해주어야 한다.

 

• mabatis 환경설정 파일 예시

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <properties resource="jdbc.properties" />
    <typeAliases>
        <typeAlias alias="dept" type="myBatis1.model.Dept" />
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="Dept.xml" />
    </mappers>
</configuration>
cs

 

 

• DAO 구현 클래스 예시

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package myBatis1.dao;
 
import java.io.IOException;
import java.io.Reader;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.springframework.stereotype.Repository;
 
import myBatis1.model.Dept;
 
@Repository
public class DeptDaoImpl implements DeptDao {
    private static SqlSession session;
    static {
        try { 
            Reader reader = Resources.getResourceAsReader("configuration.xml");
              SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
              session = ssf.openSession(true);    // true : auto commit
              reader.close(); 
        } catch (IOException e) {
          System.out.println("read file error : "+e.getMessage());
        }
    }
    public List<Dept> list() {
        return session.selectList("deptns.list");        // 돌려줄 때 Object형이지만 자동으로 다운 캐스팅 함
    }                                                    // 원래는 return (Object) session.selectList("deptns.list");
    public Dept select(int deptno) {
        return session.selectOne("deptns.select",deptno);
    }
    public int update(Dept dept) {
        return session.update("deptns.update",dept);
    }
    public int delete(int deptno) {
        return session.delete("deptns.delete",deptno);
    }
}
cs

 

 

• namespace 속성

mapper 파일의 <mapper> 태그에서 namespace 속성을 쓰는 이유는, mapper 파일이 많은 경우 sql문 태그의 id 값이 중복될 수 있기 때문에 구분을 위해 사용한다.

- ex)

mapper 파일

<mapper namespace="deptns">

 

<select id="select" parameterType="int" resultType="dept">

     select * from dept where deptno=#{deptno}

</select>

 

DAO 클래스

public Dept select(int deptno) {

     return session.selectOne("deptns.select",deptno);        // namespace.id

}

 

2. Spring으로 DB 연동: 환경설정   

 

- 스프링의 환경설정 파일에서 DB 연동을 할 경우, mybatis의 환경설정 파일에는 DB 연동 관련된 내용이 빠지고 <typeAlias>만 남는다.

- 스프링의 환경설정 파일(root-context.xml)에는 DB 연동을 위한 세 가지 <bean> 태그가 추가된다.

 

 스프링 환경설정 파일(root-context.xml)

- DB 연동을 하기 위해서는 스프링의 환경설정 파일인 root-context.xml에 세 가지 <bean>이 등록되어야 한다.

 

① Data Source 설정

- 스프링에서 jdbc를 통해 오라클에 접속하기 위해서는 Data Source를 구해야 하는데, ComboPooledDataSource 클래스, SimpleDriverDataSource 클래스 등의 클래스로 구할 수 있다.

 

② SqlSessionFactoryBean 클래스 객체 등록

- SqlSessionFactoryBean 객체로부터 DB 연동 구현에 사용할 SqlSession 객체를 얻기 위해, SqlSessionFactory 클래스를 bean에 등록해야 한다.

- SqlSession 객체를 생성하려면, Data Source와 SQL Mapper 정보가 필요하다. 따라서 앞서 등록된 DataSource를 setter 인젝션으로 참조하고, SQL Mapper가 등록된 Mapper 파일들을 setter 인젝션으로 설정해야 한다.

- 1) Data Source 2) Mybatis의 환경설정 파일(DTO 객체의 alias) 3) Mapper 파일

- DTO 클래스가 2개 이상이어서 Mapper 파일도 2개 이상일 경우, *.xml 형식으로 적어준다.

 

③ SqlSessionTemplate 클래스 객체 등록

- SqlSessionTemplate이 내부적으로 SqlSession을 구현한다.

- SqlSessionTemplate 클래스는 setter 메소드가 없기 때문에 Setter 인젝션으로 주입이 불가능하다. 따라서 생성자 메소드를 이용하는 Constructor 주입으로 처리해야 한다.

- SqlSessionTemplate 클래스의 객체가 스프링의 환경설정 파일에 등록되어야 DAO 클래스에서 @Autowired로 SqlSession 객체 주입이 가능하다.

 

예시

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
    
    <!-- <context:property-placeholder location="classpath:jdbc.properties" /> -->
    
    <!-- dataSource -->
    <!-- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}" />
    </bean> -->
    
    <!-- Data Source -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
        <property name="username" value="scott" />
        <property name="password" value="tiger" />
    </bean>
    
    <!-- 스프링 jdbc 즉 스프링으로 oracle 디비 연결 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:configuration.xml" />      <!-- Mybatis 환경설정 파일 불러옴 -->
        <property name="mapperLocations" value="classpath:sql/*.xml" />                <!-- Mybatis의 Mapper 파일 불러옴 -->
    </bean>
    
    <bean id="session" class="org.mybatis.spring.SqlSessionTemplate">                <!-- DAO 클래스에서 @Autowired로 SqlSession 객체 주입 가능 -->
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>    
    
</beans>
 
 
 
cs