Spring

Mybatis 프레임워크

Clearing 2022. 10. 4. 13:00
728x90

Mybatis는 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는

개발 프레임 워크로서 JDBC를 통해 데이터베이스에 액세스 하는 작업을 캡슐화하고 일반 SQL 쿼리,

저장 프로 시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복작업을 제거한다. 한다.

Mybatis에서는 프로그램에 있는 SQL 쿼리들을 한 구성 파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는

장점을 가지고 있다.

 

즉, Mybatis를 사용하는 이유로는

 1) DB연동을 담당하는 JAVA 코드를 1~2줄로 줄일 수 있어 가독성이 증대된다.

 2) SQL문을 JAVA 코드에서 분리하여  XML 파일로 별로 관리하여 응집도를 높일 수 있다.

따라서 기존의 일반 자바 JDBC와 Service의 2 layerd 아키텍처를 이용하던 스프링 JDBCTemplate 등

여러 가지 버전의 DAO를 교체하며 사용 가능하다.

 

※ 동작방법
 1) XML 파일에 저장된 SQL 문을 실행
 2) 실행의 결과를 VO(JAVA객체)에 자동으로 매핑까지 수행

 

※설정 
 1) 마켓플레이스에서 아래 2개의 플러그인 설치


 2) pom.xml에 2개의 라이브러리 파일 추가

		<!-- Mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.3.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.ibatis</groupId>
			<artifactId>ibatis-core</artifactId>
			<version>3.0</version>
		</dependency>


 3) DB 연동에 필요한 SQL 문을 XML 파일에 저장
src/main/resources 하위 -> mappings 패키지 -> board-mapping.xml
  => SQL문을 작성한 XML 파일

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

	<insert id="insertBoard">
		INSERT INTO BOARD(BID,TITLE,WRITER,CONTENT) VALUES((SELECT NVL(MAX(BID),0)+1 FROM BOARD),#{title},#{writer},#{content})
	</insert>
	
	<update id="updateBoard">
		UPDATE BOARD SET TITLE=#{title}, WRITER=#{writer} WHERE BID=#{bid}
	</update>
	
	<delete id="deleteBoard">
		DELETE BOARD WHERE BID=#{bid}
	</delete>
	
	<select id="selectOneBoard" resultType="board">
		SELECT * FROM BOARD WHERE BID=#{bid}
	</select>
	
	<select id="selectAllBoard" resultType="board">
		SELECT * FROM BOARD WHERE TITLE LIKE '%'||#{searchContent}||'%' ORDER BY BID DESC
	</select>

</mapper>


 4) sql-map-config.xml 작성 (src/main/resources 하위)
Spring 연동 없이 사용하기 위해서는 직접 DB 연동정보를 작성해야 한다.
연동 정보를 db.properties에 작성

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:xe
jdbc.username=kim
jdbc.password=1234

Spring과 연동할 때에는 DB 연동 정보가 있기 때문에 별도 작성 필요 없음

 

<?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>
      <!-- DB연동정보 파일과 연결 -->
   <properties resource="db.properties" />

    <!-- 별칭(Alias) 설정 -->
    <typeAliases>
      <typeAlias type="com.kim.biz.board.BoardVO" alias="board" />
   </typeAliases>



     <!-- DataSource 설정 -->
   <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="mappings/board-mapping.xml" />
    </mappers>
</configuration>

 

DAO에 의존성을 주입해주기 위한 class 파일

package com.kim.biz.common;

import java.io.Reader;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SqlSessionBean {
	// Mybatis로 DAO 클래스의 CRUD 메서드를 사용하려면,
	// Mybatis에서 제공하는 SqlSession 객체를 사용해야한다!
	//  -> Factory 패턴
	private static SqlSessionFactory sessionFactory=null;
	static {
		try {
			if(sessionFactory==null) {
				// 이곳의 작업은 스트림을 사용한다.
				// 외부요인으로 인한 에러가 자주 발생하기때문에 예외처리.
				
				// builder는 Mybatis 설정파일(sql-map-config.xml)을 로딩하면서
				// SSF 객체를 생성함
				
				// 설정파일 로딩을 위해 입력스트림(Reader)을 사용
				Reader reader=Resources.getResourceAsReader("sql-map-config.xml");
				sessionFactory=new SqlSessionFactoryBuilder().build(reader);
			}
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public static SqlSession getSqlSessionInstance() {
		return sessionFactory.openSession();
	}
}

 

위의 설정들을 사용하는 DAO

package com.kim.biz.board.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.kim.biz.board.BoardVO;
import com.kim.biz.common.SqlSessionBean;

public class BoardDAO3 {
	private SqlSession mybatis;
	public BoardDAO3() {
		mybatis=SqlSessionBean.getSqlSessionInstance();
	}
	
	public void insertBoard(BoardVO vo) {
		mybatis.insert("BoardDAO.insertBoard",vo);
		mybatis.commit();
	}
	void updateBoard(BoardVO vo) {
		mybatis.update("BoardDAO.updateBoard",vo);
		mybatis.commit();
	}
	void deleteBoard(BoardVO vo) {
		mybatis.delete("BoardDAO.deleteBoard",vo);
		mybatis.commit();
	}
	BoardVO selectOneBoard(BoardVO vo) {
		return mybatis.selectOne("BoardDAO.selectOneBoard",vo);
	}
	public List<BoardVO> selectAllBoard(BoardVO vo) {
		return mybatis.selectList("BoardDAO.selectAllBoard",vo);
	}
}

 

resultMap 속성 예시

	<resultMap type="board" id="boardResult">
		<id property="bid" column="BID" />
		<result property="title" column="TITLE" />
		<result property="writer" column="WRITER" />
		<result property="content" column="CONTENT" />
	</resultMap>
    
	<select id="selectAllBoard" resultMap="boardResult">
		SELECT * FROM BOARD WHERE TITLE LIKE '%'||#{searchContent}||'%' ORDER BY BID DESC
	</select>

 

CDATA (문자데이터) -> XML 문법으로
XML 파서는 해석을 통해 설정을 이해하며 CDATA 영역을 설정하면, 그 영역은 XML 파서가 해석하지 않는다.
<![CDATA[SQL문]]>


ex) <![CDATA[SQL문DELETE BOARD WHERE BID<=#{bid}]]>

 

+) 가독성을 위해서라도 SQL문은 대문자로 작성하는 것을 권장한다.

728x90

'Spring' 카테고리의 다른 글

Spring Ajax를 사용한 정렬  (1) 2022.10.07
Mybatis 프레임워크 스프링 연동  (0) 2022.10.05
Spring 다국어 처리  (0) 2022.09.29
Spring 예외 페이지 설정  (0) 2022.09.28
Spring 이미지 업로드  (0) 2022.09.27