본문 바로가기
Web Programming/Spring

[Spring] MyBatis Data Access

by Classic! 2020. 8. 4.

[Data Access/Integration]

DB와 DAO를 연결하는 단계로, JDBC, ORM, JMS 및 트랜잭션 모듈로 구성된다.

여기서 JDBC 모듈은 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API로, 데이터베이스에서 자료를 쿼리 하거나 업데이트하도록 돕는 역할을 한다. JDBC는 SQL Mapper인 MyBatis로 대체 가능하며, 본 포스팅에서는 JDBC 대신 MyBatis를 활용한다.

 

 Service Layer : DAO에서 전달 받은 데이터를 가공하는 Layer

 

 

- interface인 DAO가 session을 hasing하여 Persistence Layer와 MyBatis Framework를 연결

- 전반적인 흐름은 sqlMapConfig.xml > SqlSessionFactory > SqlSession > UserDAO > DAOImpl

 

[MyBatis]

MyBatis는 개발자가 지정한 SQL, 저장 프로시저, 고급 매핑을 지원하는 persistence framework이다. MyBatis는 JDBC 코드, 수동으로 세팅하는 파라미터, 결과 매핑을 제거한다. MyBatis는 데이터베이스 레코드에 원시 타입과 Map 인터페이스 그리고 자바 POJO를 설정하고 매핑하기 위해 XML과 annotation을 사용할 수 있다. 

출처 : MyBatis-3-User-Guide_ko.pdf

 

 

 

[MyBatis 구조와 작동 과정]

1. vo, mapping.xml(sql query), dbconn.properties(db정보)를 sqlMapConfig.xml파일로 연결

2. 모든 정보를 가진 sqlMapConfig.xml을 SqlSessionFactory로 넘겨주고, SqlSessionFactory로 SqlSession불러들여 sql 함수 생성

My Batis

 

 

1. SqlMapConfig.xml

- 연결 DB서버 정보를 담은 Properties, SQL 쿼리 파일, VO 등 파일과 연결하여 MyBatis가 작업 수행하는데 필요한 세부 사항을 포함한다. 

<?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>
	<!-- 1. properties 파일 연결 (config 폴더에 있는 dbconn.properties 파일 연결하기)-->
	<properties resource="config/dbconn.properties"/>
	
	<!-- 2. VO Alias -->
	<typeAliases>
		<typeAlias type="ibatis.services.domain.User" alias="user"/>
	</typeAliases>
	
	<!-- 3. DB 정보 -->
	<environments default="development">
		<environment id="development">
			<!-- transactionManager : JDBC --> 
            <transactionManager type="JDBC"></transactionManager>
			<!-- dataSource type="UNPOOLED" : driver 연동하여 connection 가져오기
                 dataSource type="POOLED" : data Source에서 connection 가져오기 --> 
            <dataSource type="UNPOOLED">
            	<!-- properties의 정보를 키:밸류의 EL형식 ${}으로 불러오기 --> 
				<property name="driver" value="${jdbc.mysql.driver}"/>
				<property name="url" value="${jdbc.mysql.url}"/>
				<property name="username" value="${jdbc.mysql.username}"/>
				<property name="password" value="${jdbc.mysql.password}"/>			
			</dataSource>
		</environment>
	</environments>
	
	<!-- 4. mapper 연결 -->
	<mappers>
		<mapper resource="sql/mybatis-userservice-mapping.xml"/>
	</mappers>
</configuration>

 

 

1) Properties (dbconn.properties) : db 정보가 담긴 설정문서

## DB서버 정보를 포함
### dbconn.properties file....dbServer Information Storing
jdbc.mysql.driver=com.mysql.cj.jdbc.Driver
jdbc.mysql.url=jdbc:mysql://127.0.0.1:3306/scott?characterEncoding=UTF-8&serverTimezone=UTC
jdbc.mysql.username=root
jdbc.mysql.password=1234

 

2) Mapping XML (mysawon_mapping.xml) : sql 정보가 담긴 설정 문서

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

<mapper namespace="UserMapper">
	<select id="getUserList" resultType="user">
		select 
		user_id as userId,
		user_name as userName,
		password as password,
		age as age,
		grade as grade,
		reg_date as regDate
		from users
	</select>	
</mapper>

 

3) VO (MySawon) : DB 테이블 vo정보

package com.encore.mybatis.vo;
/*
 * Framework에서는 반드시 기본 생성자 넣아야 함
 * MyBatis에서는 setter/getter로 값 주입. 생성자 없으면 기본 값 들어감
 */
public class MySawon {
	private int num, age;
	private String id,pwd,name,hiredate;

	public MySawon() {
	}
	
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getHiredate() {
		return hiredate;
	}

	public void setHiredate(String hiredate) {
		this.hiredate = hiredate;
	}

	@Override
	public String toString() {
		return "MySawon [num=" + num + ", age=" + age + ", id=" + id + ", pwd=" + pwd + ", name=" + name + ", hiredate="
				+ hiredate + "]";
	}
}

 

 

2. SqlSession

- SQLSession의 함수로 SQL 쿼리를 실행한다.

- SqlSession 불러오는 방법

   1) SqlMapConfig.xml 읽어 들이기

   2) SqlSessionFactoryBuilder 불러들이기

   3) SqlSessionFactoryBuilder로부터 SqlSessionFactory 불러들이기

   4) SqlSessionFactory로부터 SqlSession 불러들이기

- session.insert(namespace.id, 조건)

Ex) session.insert("mysawonMapper.sawonAdd", vo);

 : namespace가 "mysawonMapper"인 mapper에서 id가 "sawonAdd"인 쿼리 문의 조건으로 쓸 데이터를 vo 넘기기.

package com.mabatis.test;

import java.io.Reader;
import java.util.Scanner;

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 com.mybatis.vo.MySawon;

/* Scanner를 통해서 값을 입력 (화면을 대신)
 * 입력받은 값을 MyBatis 라이브러리를 사용해서 DB에 Access하는 로직 작성
 */
public class SimpleMyBatisAppTest {

	public static void main(String[] args) {
	Scanner sc= new Scanner(System.in);
	//받은 값을 vo에 setter로 주입
	MySawon vo=new MySawon();
	System.out.println("id 입력");
	vo.setId(sc.next());
	System.out.println("비밀번호 입력");
	vo.setPwd(sc.next());
	System.out.println("이름 입력");
	vo.setName(sc.next());
	System.out.println("나이 입력");
	vo.setAge(sc.nextInt());
	
	// MyBatis 라이브러리 사용
	try {
		//1.SqlMapConfig.xml을 읽어들인다
		Reader r=Resources.getResourceAsReader("config/sqlMapConfig.xml");
		
		//2.sqlSessionFactory 리턴
		SqlSessionFactory factory =new SqlSessionFactoryBuilder().build(r);
		
		//3. sqlSession 리턴
		SqlSession session=factory.openSession();
		
		//4. Query문을 실행하는 모든 기능이 session에 있다.
		// insert,delete,select,update,selectList,selectOne
		session.insert("mysawonMapper.sawonAdd",vo);
		session.commit();//dml일때는 반드시
		session.close();
		
		System.out.println(vo.getName()+" 님 정보 입력 성공^^");
	}catch (Exception e) {
		System.out.println(vo.getName()+" 님 정보 입력 실패^^");	
		}
	}
}

 

- session.insert("mysawonMapper.sawonAdd", vo)에서 사용한 namespace와 id 매칭

- vo객체를 조건으로 넘길 경우, 데이터를 받을 때 vo의 Alias를 parameterType으로 지정하고 객체의 필드는 #{}로 받는다.

<mapper namespace="mysawonMapper">
	<insert id="sawonAdd" parameterType="MySawon">
	<!-- MySawon.getId=#{} : #이 getter와 같음 -->
		insert into mysawon (id,pwd,name,age,hiredate) values(#{id},#{pwd},#{name},#{age},curDate())
	</insert>
</mapper>

 

>> 실행 결과

'Web Programming > Spring' 카테고리의 다른 글

[Spring] BeanNameViewResolver  (0) 2020.08.10
[Spring] Annotation  (0) 2020.08.06
[Spring] Bean 설정문서  (0) 2020.08.06
[Spring] My Batis - SQL  (1) 2020.08.05
[Spring] Core Container  (1) 2020.08.03

댓글