구리

TIL_210629_Spring Mybatis 프레임워크 시작 본문

SPRING FRAMEWORK

TIL_210629_Spring Mybatis 프레임워크 시작

guriguriguri 2021. 6. 29. 11:48

목차

MyBatis 프레임워크 특징
프로젝트를 통한 MyBatis 기초 설명(MybatisProject)
SQL Mapper XML 파일 작성
MyBatis 환경 설정
SqlSession 객체 생성
DAO 클래스 작성
테스트 클라이언트 작성 및 실행

 

 

 

MyBatis 프레임워크 특징

- 한두 줄의 자바 코드로 DB 연동을 처리

- SQL 명령어를 자바 코드에서 분리하여 XML 파일에 따로 관리

즉, XML 파일에 저장된 SQL 명령어를 대신 실행하고 실행 결과를 VO 같은 자바 객체에 자동으로 매핑까지 해주기에 데이터 맵퍼(Data Mapper)라고 부릅니다.

 

예시

<?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="inserBoard">
		insert into board(seq,title, writer, content)
		values ((select nvl(max(seq), 0)+1 from board),#{title},#{writer},#{content})
	</insert>
</mapper>

 

프로젝트를 통한 MyBatis 기초 설명(MybatisProject)

(Spring Legact Projects - Simple Projects - Simple Spring Maven)

프로젝트 소스 구성 및 위치

 

 

SQL Mapper XML 파일 작성

- DB 연동에 필요한 SQL 명령어들이 저장되는 파일

- <mapper>를 루트 엘리먼트로 사용하며 속성인 namespace 값은 프로젝트 전체에서 유일한 값을 가져야 합니다.

- <select>, <insert>, <update>, <delete> 엘리먼트를 이용해 필요한 SQL 구문들을 등록합니다.

- 각 태그에서 반환타입 설정시, resultType 속성을 이용하여 지정할 수 있는데 resultType 에 관한 설정은 myBatis 환경설정 파일에서 설정할 수 있습니다.

(프로젝트 생성 - New - Other - MyBatis - MyBatis XML Mapper 로 생성 (board-mapping.xml) 후 src/main/resources의     mapping 패키지로 이동시킵니다.)

<?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="inserBoard">
		insert into board(seq,title, writer, content)
		values ((select nvl(max(seq), 0)+1 from board),#{title},#{writer},#{content})
	</insert>
	
	<update id="updateBoard">
		update board set title=#{title}, content=#{content} where seq=#{seq}
	</update>
	
	<delete id="deleteBoard">
		delete from board where seq=#{seq}
	</delete>
	
	<select id="getBoard" resultType="board">
		select * from board where seq=#{seq}
	</select>
	
	<select id="getBoardList" resultType="board">
		select * from board where title like '%'||#{searchKeyword}||'%' order by seq desc
	</select>
</mapper>

 

 

MyBatis 환경 설정

① 해당 프로젝트 클릭 - New - Other - MyBatis - MyBatis XML Mapper 로 선택 후 생성한 다음 src/main/resources 폴더로 이동 (일반적으로 이름은 sql-map-config.xml 로 사용)

 

상단부 아래와 같이 변경

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

 

총 코드

<?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>
	<!-- Properties 파일 설정 -->
	<properties resource="db.properties" />
	
	<!-- Alias 설정 -->
	<typeAliases>
		<typeAlias alias="board" type="com.springbook.biz.board.BoardVO" />
	</typeAliases>
	
	<!-- DataSource 설정 -->
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
			<!-- type="POOLED" : Connection pool -->
				<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>
	
	<!-- SQL Mapper 설정 -->
	<mappers>
		<mapper resource="mappings/board-mapping.xml" />
	</mappers>
</configuration>

 

- <properties>          : 사용할 프로퍼티 선언 혹은 외부 프로퍼티 파일 참조시 사용

- <typeAliases>        : <typeAlias> 엘리먼트 이용하여 자동 매핑 객체 설정

- <environments>   : 특정 DBMS로부터 커넥션 획득, DB 연동을 처리하기 위해 DataSource 정보 필요

                                        따라서 DataSource 정보설정에 이용

- <mapper> : 여러 <mapper>를 가질 수 있고, SQL 명령어들이 저장된 SQL 파일들을 등록

                           XML 문서는 클래스 파일이 아니기에 <typeAliases>처럼 패키지.클래스명이 아닌 / (슬러시)로 resource 값 표기

 

 

② DataSource 설정을 위한 db.properties 파일 생성

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:XE
jdbc.username=bjy
jdbc.password=qorwjddus96

 

 

 

SqlSession 객체 생성

MyBatis를 이용하여 DAO를 구현하는 SqlSession 객체는 SqlSessionFactory 객체로부터 생성됩니다.

 

SqlSessionFactory 코드

package com.springbook.biz.util;

import java.io.Reader;

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

public class SqlSessionFactoryBean {
	private static SqlSessionFactory sessionFactory = null;
	static{
		try{
			if(sessionFactory==null){
				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();
	}
}

 

<핵심>

sql-map-config.xml 파일로부터 설정 정보를 읽기 위한 입력 스트림 생성 후 입력 스트림을 통해 해당 파일을 읽어 SqlSessionFactory 객체 생성

Reader reader = Resources.getResourceAsReader("sql-map-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(reader);

 

DAO 클래스 작성

Mybatis를 이용해 DB 연동을 처리하는 BoardDAO 클래스 코드

package com.springbook.biz.board.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSession;

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.util.SqlSessionFactoryBean;

public class BoardDAO {
	private SqlSession mybatis;
	
	public BoardDAO() {
		mybatis = SqlSessionFactoryBean.getSqlSessionInstance();
	}

	// 글 등록
	public void insertBoard(BoardVO vo){
		mybatis.insert("BoardDAO.insertBoard", vo);
		mybatis.commit();
	}
	
	// 글 수정
	public void updateBoard(BoardVO vo){
		mybatis.update("BoardDAO.updateBoard", vo);
		mybatis.commit();
	}
	
	// 글 삭제
	public void deleteBoard(BoardVO vo){
		mybatis.delete("BoardDAO.deleteBoard", vo);
		mybatis.commit();
	}
	
	// 글 상세 조회 
	public BoardVO getBoard(BoardVO vo){
		return (BoardVO)mybatis.selectOne("BoardDAO.getBoard", vo);
	}
	
	// 글 목록 조회
	public List<BoardVO> getBoardList(BoardVO vo){
		return mybatis.selectList("BoardDAO.getBoardList", vo);
	}
}

각 메소드에선 2개의 정보가 인자로 전달되는데 1번째는 SQL의 id 정보(SQL Mapper에 선언된 네임스페이스, id 조합), 2번째는 parameterType 속성으로 지정된 파라미터 객체입니다.

또한 commit() 메소드를 통해 DB 수정을 확정해야만 반영이 됩니다. (오라클 sql문 작성시 commit()과 동일한 기능)

 

테스트 클라이언트 작성 및 실행

package com.springbook.biz.board;

import java.util.List;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

import com.springbook.biz.board.impl.BoardDAO;

public class BoardServiceClient {

	public static void main(String[] args) {
		BoardDAO boardDAO = new BoardDAO();
		
		BoardVO vo = new BoardVO();
		vo.setTitle("mybatis 임시 제목");
		vo.setWriter("mybatis writer");
		vo.setContent("mybatis 내용");
		boardDAO.insertBoard(vo);
		
		vo.setSearchCondition("TITLE");
		vo.setSearchKeyword("");
		// 4. 글 목록 검색 기능 테스트
		List<BoardVO> boardList = boardDAO.getBoardList(vo);
		for(BoardVO board : boardList){
			System.out.println("---> " + board.toString());
		}
	}
}

 

 

'SPRING FRAMEWORK' 카테고리의 다른 글

TIL_210705_JPA 개념  (0) 2021.06.29
TIL_210629_Spring Mapper XML 파일 설정  (0) 2021.06.29
TIL_210624_Spring 데이터 변환  (0) 2021.06.23
TIL_210624_Spring 다국어 처리  (0) 2021.06.23
TIL_210624_Spring 파일 업로드 처리  (0) 2021.06.23