[Spring] MyBatis 연동

2020. 10. 14. 12:05개발공부/Spring

728x90

Spring 학원 강의도 이제 2강을 남겨두고 있습니다. 비대면으로 듣다보니 중간에 집중이 떨어지기도 했지만 중요한 부분은 정리해 업로드 하고 있습니다. 

MyBatis는 Spring에서 DB에 명령할 SQL문을 작성하고 관리하는데 있어 JDBC보다 효율적인 SW입니다.   

출처: https://mybatis.org/mybatis-3/

1) 기본 설정

 - mybatis-config .xml: MyBatis 동작 관련 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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>
    <!-- 마이바티스 동작관련 설정 -->
    <settings>
        <setting name="cacheEnabled" value="false"/>
        <setting name="useGeneratedKeys" value="false"/>
        <!-- settter 변수명 언더바 금지 camel -->
        <setting name="mapUnderscoreToCamelCase" value="true"/> 
    </settings>
    
    <typeAliases>
        <typeAlias type="spring.Member" alias="member"/>
    </typeAliases>
</configuration>
cs

- pom.xml : Spring Dependency 설정 파일에 MyBatis 설정도 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        <!-- 마이바티스를 위한 라이브러리 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.1.0.RELEASE</version>
        </dependency>
cs

2) member 예제

이전에 MemberDao로 JDBC 설정해줬었는데 MyBatis를 사용하면 xml 파일을 이용해줍니다. 그리고 DB연결 세션을 위해 sqlSessionFactoryBean과 sqlSessionFactoryTemplate을 spring-member.xml에 bean 등록해줘야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    <!-- 
        org.mybatis.spring.SqlSessionFactoryBean
            DataSource를 받아서 DB연결 세션을 생성 및 관리
            
        org.mybatis.spring.SqlSessionTemplate
            DAO에서 호출하는 SQL메서드와 연동(예외/세션/트랜잭션 등을 관리)
     -->
     <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- DB 연결에 필요한 정보 dataSource -->
<property name="dataSource" ref="dataSource"/>
        <!-- MyBatis 설정파일 -->
         <property name="configLocation" value="classpath:config/mybatis-config.xml"/>
         <property name="mapperLocations">
        <!-- MyBatis SQL 명령문 입력파일 -->
             <list>
                 <value>classpath:config/sqlmap-member.xml</value>
             </list>
         </property>
     </bean>
     
     <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"
     destroy-method="clearCache">
     <constructor-arg ref="sqlSessionFactoryBean"/>
     </bean>
cs

 - SQL 명령문을 입력해주는 sqlmap-member.xml 입니다.

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 mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<!-- 설정하고 있는 쿼리들의 대표 이름 memberDaoImpl 파일의 memberDao.[id]가 된다. -->
<mapper namespace="memberDao">
    <select id="selectByEmail" parameterType="String" resultType="member">
        select * from MEMBER where email=#{email}
    </select>
    
    <insert id="insert" parameterType="member">
        insert into MEMBER (ID, EMAIL, PASSWORD, NAME, REGDATE)
        values (MEMBER_SEQ.nextval, #{email}, #{password}, #{name}, #{regDate})
        <selectKey keyProperty="id" resultType="Long">
            select NVL(MAX(id), 0) from MEMBER
        </selectKey>
    </insert>
    
    <update id="update" parameterType="member">
        update MEMBER set NAME=#{name}, password=#{password} where email=#{email}
    </update>
</mapper>
 
cs

 - Interface MemberDao 

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
package spring;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;
 
import javax.sql.DataSource;
 
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
 
public interface MemberDao {
    
    
    //삽입
    public void insert(Member member);
    
    //조회(RowMapper 중복코드 처리 전)
    public Member selectByEmail(String email);
    
    //수정(비밀번호 수정)
    public void update(Member member);
 
}
 
cs

 - MemberDao 실행파일 

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
package spring;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.List;
 
import javax.sql.DataSource;
 
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;
 
public class MemberDaoImpl implements MemberDao {
    
    private SqlSessionTemplate sqlSessionTemplate;
    
    public MemberDaoImpl(SqlSessionTemplate sqlSessionTemplate) {
        this.sqlSessionTemplate = sqlSessionTemplate;
    }
 
    @Override
    public Member selectByEmail(String email) {
        return sqlSessionTemplate.selectOne("memberDao.selectByEmail", email);
    }
 
    @Override
    public void insert(Member member) {
        sqlSessionTemplate.insert("memberDao.insert", member);
    }
 
 
    @Override
    public void update(Member member) {
        sqlSessionTemplate.update("memberDao.update", member);
    }
    
    
}
 
cs

3) MyBatis 동작 원리

오늘 강의까지 듣고 정리하도록 하겠습니다!