포스트

05. Mybatis

1) 개요

1
2
3
데이터의 입력, 조회, 수정, 삭제 (CRUD)를 보다 편하게 하기 위해 xml로 구조화한 Mapper 설정 파일을 통해서 JDBC를 구현한 영속성 프레임워크

기존의 JDBC에서 사용하던 부분들을 xml 설정을 통해 쉽게 할 수 있게 해준다

https://mybatis.org/mybatis-3/ko/

2) Mybatis의 흐름

3) 라이브러리 추가

🔸JDBC 드라이버 (ojdbc11)
https://mvnrepository.com/artifact/com.oracle.database.jdbc/ojdbc11

🔸Spring에서 JDBC 지원하는 모듈 (spring-jdbc)
https://mvnrepository.com/artifact/org.springframework/spring-jdbc

🔸Mybatis 라이브러리 (mybatis)
https://mvnrepository.com/artifact/org.mybatis/mybatis

🔸Spring에서 쉽게 Mybatis를 사용 가능하게 만드는 모듈 (spring-mybatis)
https://mvnrepository.com/artifact/org.mybatis/mybatis-spring

🔸DataBase Connection Pool 사용을 위한 라이브러리 (commons-dbcp2)
https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2

pom.xml의 <dependencies></dependencies> 안에 코드 추가

4) Mybatis의 동작 구조

5) mybatis-config 설정하기

1
2
3
4
5
6
7
8
9
- Config
Location : http://mybatis.org/dtd/mybatis-3-config.dtd
Key type : Public ID
Key : -//mybatis.org//DTD Config 3.0//EN

- Mapper
Location : http://mybatis.org/dtd/mybatis-3-mapper.dtd
Key type : Public ID
Key : -//mybatis.org//DTD Mapper 3.0//EN

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
<?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>

  <!-- SqlSessionTemplate 생성 시 적용될 설정 작성 부분 -->
  <settings>
    <!-- insert 또는 update에 사용되는 값 중 null이 있을 경우에 대한 설정
    해당 설정이 없을 경우 -> SQL 구문에 null 포함되어 있다는 오류 발생.
    해상 설정이 있을 경우 -> 오류를 발생 시키지 않고 NULL 값을 컬럼에 대입
    단, NOT NULL 제약조건이 없는 컬럼에만 가능함.
    
    ** value 설정 시 NULL 은 반드시 대문자로 작성 (소문자 null은 오류가 발생함) -->
    <setting name="jdbcTypeForNull" value="NULL"/>
  </settings>
  
  <!-- 별칭 작성 부분  -->
  <!-- VO클래스의 패키지명 + 클래스명 작성하는 것이 불편하기 때문에 짧은 별칭 부여 -->
  <typeAliases>
    <typeAlias type="edu.kh.fin.member.model.vo.Member" alias="Member"/>
  </typeAliases>
  
  <!-- mapper 파일(SQL 작성되는파일) 위치 등록 부분 -->
  <!-- <mapper resource="mapper 파일 경로"/> 
    경로를 작성하는 기준(시작지점)은 src/main/resources 폴더 -->
  <mappers>
    <mapper resource="/mappers/member-mapper.xml"/>
  </mappers>

</configuration>

⭐ 위의 코드 순서는 반드시 지켜져야 한다 ⭐

6) root-context.xml 설정하기

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
<!--
  root-context.xml 파일
  - web.xml에서 가장 먼저 읽어 들이는 설정 파일
  - 프로젝트 전반적으로 사용되는 자원을 생성(bean 등록)하고 설정하는 파일
  - DB 연결 관련 정보, 트랜잭션 처리, 파일 업로드 등을 작성
-->

<!-- 1. DBCP 사용을 위한 DataSource를 bean으로 등록 -->

<!-- DataSource : java에서 Connection Pool을 지원하기 위한 인터페이스(Connection 상위호환) -->
<!-- destroy-method="close" : 주어진 세션을 자동으로 반환(close)하는 설정 -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
  <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
  <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
  <property name="username" value="community"/>
  <property name="password" value="1234"/>

  <!-- SQL이 수행된 후 자동으로 Commit 되는것을 지정 -->
  <property name="defaultAutoCommit" value="false"/>

  <!-- 커넥션 풀 설정 -->
  <property name="initialSize" value="10" /> <!-- 초기 커넥션 수, 기본 0 -->
  <property name="maxTotal" value="50" /> <!-- 최대 커넥션 수, 기본 8 -->
  <property name="maxIdle" value="20" /> <!-- 유휴 상태로 존재할 수 있는 커넥션 최대 수, 기본 8 -->
  <property name="minIdle" value="10" /> <!-- 유휴 상태로 존재할 수 있는 커넥션 최소 수, 기본 0 -->
  <property name="maxWaitMillis" value="-1" /> <!-- 예외 발생 전 커넥션이 반환 될 떄 까지 대기하는 최대 시간(ms), 기본 -1(무기한) -->

</bean>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- 
  SqlSession : sql구문을 DB에 전달, 실행하는 객체 
  SqlSessionFactory : SqlSession을 만드는 객체 
  sqlSessionFactoryBean : mybatis 설정 파일(mybatis-config.xml)과 Connection Pool 정보를 이용하여 SqlSessionFactory를 만드는 객체 
  sqlSessionTemplate : SqlSession 객체에 트랜잭션 처리 역할이 가능하도록 하는 객체 
-->

<!-- 마이바티스 SqlSession 등록하기 (xml 방식으로 bean 등록) -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
  <!-- mybatis-config.xml 설정 불러오기 -->
  <property name="configLocation" value="classpath:mybatis-config.xml" />
  <property name="dataSource" ref="dataSource" />
</bean>

<!-- SqlSessionTemplate : 기본 SQL 실행 + 트랜잭션 관리 역할을 하는 SqlSession을 생성할 수 있게 하는 객체(Spring bean으로 등록해야함.) -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
  <constructor-arg ref="sqlSessionFactoryBean" />
</bean>

<!-- 스프링에서 사용하는 proxy를 이용한 트랜잭션 제어가 안될 경우 추가적인 트랜잭션 매니저를 추가해서 문제 해결 -->
<bean id="transactionManager" 
  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <property name="dataSource" ref="dataSource" />
</bean>