PLOD

[spring] spring 과 MyBatis 연동 본문

개발 공부/Spring framework

[spring] spring 과 MyBatis 연동

훌룽이 2023. 8. 19. 11:35

객체지향언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크이다. JDBC를 통해 데이터베이스에 엑세스하는 작업을 갭슐화하고 일반 SQL 쿼리, 저장 프로 시저 및 고급 매핑을 지원하며 모든  JDBC 코드 및 매개 변수의 중복 작업을 제거한다.  spring framework와 MyBatis를 연동해서 좀 더 쿼리를 좀 더 빠르게 SQL을 처리할 수 있다.

전통적인 JDBC  MyBatis
직접 Connection을 맺고 마지막에 close()
UPDATE, INSERT, DELETE 문 실행 시 ,PrepareStatement를 직접 생성 및 처리
PrepareStatement의 setVO() 등에 대한 모든 작업을 개발자가 처리
SELECT문의 경우 직접 ResultSet 처리
자동으로  Connection close() 가능
MyBatis 내부적으로 PrepareStatement 가능
#{}와 같이 속성을 지정하면 내부적으로 자동 처리
리턴 타입을 지정하는 경우 자동으로 객체 생성 및 ResultSet 처리

MyBatis의 장점은 다음과 같다.

Ⅰ. 복잡한 쿼리나 다이나믹한 쿼리에 강하다. (but, 비슷한 쿼리는 남발하게 되는 단점이 있다.)
Ⅱ. 프로그램 코드와 SQL  쿼리의 분리로 코드가 간결해지고 유지보수성이 향상된다.
Ⅲ. JDBC의 resultType, resultClass등 VO를 사용하지 않고 조회결과를 사용하는 사용자 정의 DAO로 맵핑하여 사용할 수 있다. 
Ⅳ. XML 파일로 인해 빠른 개발이 가능하여 생산성이 향상된다.

Oracle Database와 Spring 연동

OracleDatabase 동작 원리

. SQL문 syntax check

- library cache에서 일치하는 sql 검색
- 실행문맥 정보로 실행
- DB Buffer Cache에서 검색
- 메모리에서만 read해서 fetch하므로 soft parsing

. SQL문 semantic checking
- Data Dictionary Cache(Row Cache)를 사용
- logical, physical read 추가 발생

. optimizer - SQL 실행 경로 탐색, 비용 계산
- logical , physical read 추가 발생, cpu 사용 
- Data Dictionary Cache 사용

. library cache에 SQL context로 cache함

V . 실행 buffer cache에서 data block 검색 data file 읽어와서 buffer cache에 cache하고 fetch함

 

Oracle Database를 사용하기 위해서는 Oracle Express(Oracle XE)를 설치해야 한다.

앞서 설명한 Mybatis 프레임워크를 사용해서 오라클 데이터베이스에 연동하기 위해 쿼리문을 사용한다.

Spring 프레임워크에서 다음과 같은 쿼리로 CRUD 게시판을 구현할 수 있다.

<?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="org.zerock.mapper.BoardMapper">
  <select id="getList" resultType="org.zerock.domain.BoardVO">
  <![CDATA[select * from tbl_board where bno>0]]>
  </select>
  
  <insert id="insert">
  <!-- 쿼리문을 규칙에 맞게 지정삽입 필드와 필드값을 쌍으로 맞춘다. -->
  insert into tbl_board (bno,title,content,writer)
      values (seq_board.nextval, #{title}, #{content}, #{writer})
  </insert>
  
  
  <insert id="insertSelectKey">
     <selectKey keyProperty="bno" order="BEFORE"   resultType="long">
     	<![CDATA[ select seq_board.nextval from dual]]>
    </selectKey>
 
    insert into tbl_board (bno,title,content, writer)
    values (#{bno}, #{title}, #{content}, #{writer})
  </insert>
  
  
  <select id="read" resultType="org.zerock.domain.BoardVO">
   select * from tbl_board where bno=#{bno}
  </select>
  
  <delete id="delete">
  delete tbl_board where bno=#{bno}
  </delete>
  
  <update id="update">
    update tbl_board
    set title= #{title},
    content=#{content},
    writer = #{writer},
    updateDate = sysdate
    where bno = #{bno}
  </update>
  
  <!-- 각 문자열을 이용해 검색 조건을 결합하는 형태로 하면 3개의 동적 SQL 구문처리  -->
   		<sql id="criteria">
			<trim prefix="(" suffix=") AND " prefixOverrides="OR">
   				<foreach item='type' collection="typeArr">
   					<trim prefix="OR">
   						<choose>
   							<when test="type == 'T'.toString()">
   								title like '%' || #{keyword} || '%'
   							</when>
   							<when test="type == 'C'.toString()">
   								content like '%' || #{keyword} || '%'
   							</when>
   							<when test="type == 'W'.toString()">
   								writer like '%' || #{keyword} || '%'
   							</when>
   						</choose>
   					</trim>
   				</foreach>
   			</trim>
   			</sql>
  <select id="getListWithPaging" resultType="org.zerock.domain.BoardVO">
	<![CDATA[
		select
			 bno, title, content, writer, regdate, updateDate, replycnt
		from 
		(
 		   select /*+ INDEX_DESC(tbl_board pk_board) */
 		   	rownum rn, bno, title, content, writer, regdate, updateDate, replycnt
	
  		  from
   		 	tbl_board
   		       where 
   		]]>
   		<include refid="criteria"></include>
   		<![CDATA[		
   			rownum<= #{pageNum} * #{amount}
   			
   			)
   			
   			where rn>(#{pageNum}-1) * #{amount}
   			]]>
   			
</select>

   <select id="getTotalCount" resultType="int">
  select count(*) from tbl_board where
     		<include refid="criteria"></include>
   		 bno > 0
  </select>
  
  	<update id="updateReplyCnt">
		update tbl_board set replycnt = replycnt + #{amount} where bno = #{bno}
	</update>
  
  
  </mapper>

 

참고)

[ORACLE] DB 구조 (garimoo.github.io)

 

MOVED TO MEDIUM

moved to medium

garimoo.github.io

 

Comments