본문 바로가기

IT공부/스프링

스프링에서 MyBatis 사용하기

스프링에서 MyBatis 사용하기

테이블 생성

book_ex 스키마에 tbl_member 테이블을 생성한다.

 

create table tbl_member (
    userid varchar(50) not null,
    userpw varchar(50) not null,
    username varchar(50) not null,
    email varchar(100),
    regdate timestamp default now(),
    updatedate timestamp default now(),
    primary key(userid)
);

 

도메인 클래스 생성

도메인 클래스를 생성한다. 도메인이란 하나의 대상을 구성하는 핵심 키워드들이라고 할 수 있다. 예를 들어 '사람'이라는 대상은 눈, 코, 입, 손, 발, 장기등으로 도메인이 구성된다. 도메인 클래스는 특정 테이블과 밀접한 연관을 갖는 클래스를 말한다. 위에서 tbl_member 테이블의 도메인 클래스는 아래와 같다.

 

package org.project.domain;

 

import java.util.Date;

 

public class MemberVO {

 

       private String userid;

       private String userpw;

       private String username;

       private String email;

       private Date regdate;

       private Date updatedate;

      

       public String getUserid() {

               return userid;

       }

...

}

DAO 인터페이스 생성

DAO 인터페이스를 사용하는 이유는 향후에 데이터베이스가 변경되더라도 단순히 DAO 구현 클래스만을 변경하기만 하면 되기 때문이다.

 

간단하게 데이터베이스 현재 시간 체크 기능과 tbl_member 테이블에 데이터를 추가하는 기능을 구현해보자.

 

아래와 같이 패키지를 생성하고 MemberDAO 인터페이스를 생성한다.

package org.project.persistence;

 

import org.project.domain.MemberVO;

 

public interface MemberDAO {

      

       public String getTime();

      

       public void insertMember(MemberVO vo);

 

       public MemberVO readMember(String userid)throws Exception;

 

       public MemberVO readWithPW(String userid,

                              String userpw)throws Exception;

      

}

 

아래와 같이 mappers 폴더 하위에 memberMapper.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="org.project.mapper.MemberMapper">

 

  <select id="getTime" resultType="string">

  select now()

  </select>

 

  <insert id="insertMember" >

  insert into tbl_member (userid,userpw, username, email) values

  (#{userid}, #{userpw}, #{username}, #{email})

  </insert>

 

  <select id="selectMember"

          resultType="org.project.domain.MemberVO">

  select

    *

  from

    tbl_member

  where userid = #{userid}

  </select>

 

  <select id="readWithPW"

         resultType="org.project.domain.MemberVO">

  select

    *

  from

    tbl_member

  where

    userid = #{userid} and userpw = #{userpw}

  </select>

 

 

</mapper> 

 

매퍼 파일을 인식하기 위해서 root-context.xml에 아래와 같이 추가해준다.

 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

       <property name="dataSource" ref="dataSource" />

      

       <property name="configLocation" value="classpath:/mybatis-config.xml"></property>

       <property name="mapperLocations"

         value="classpath:mappers/**/*Mapper.xml"></property>   

</bean>

DAO 인터페이스 구현 클래스 생성

DAO 구현 클래스에서는 SqlSessionTemplate 클래스를 사용하여 데이터베이스 작업을 한다. SqlSessionTemplate 은 데이터베이스 연결작업과 연결을 끊는 작업을 해주므로 개발자는 직접 코드를 작성하지 않아도 된다. 트랜잭션관리, 쓰레드 처리 안정성을 보장해준다. 

 

아래와 같이 root-context.xml에 추가해준다.

 

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate"

   destroy-method="clearCache">

  <constructor-arg name="sqlSessionFactory"

       ref="sqlSessionFactory"></constructor-arg>

</bean>

 

구현 클래스를 아래와 같이 작성한다.

 

package org.project.persistence;

 

import java.util.HashMap;

import java.util.Map;

 

import javax.inject.Inject;

 

import org.apache.ibatis.session.SqlSession;

import org.springframework.stereotype.Repository;

import org.project.domain.MemberVO;

 

@Repository

public class MemberDAOImpl implements MemberDAO {

      

       @Inject

       private SqlSession sqlSession;

 

       private static final String namespace =

                      "org.project.mapper.MemberMapper";

 

       @Override

       public String getTime() {

 

               return sqlSession.selectOne(namespace+".getTime");

       }

 

 

       @Override

       public void insertMember(MemberVO vo) {

               sqlSession.insert(namespace+".insertMember", vo);

       }

 

 

       @Override

       public MemberVO readMember(String userid) throws Exception {

               return (MemberVO)

                             sqlSession.selectOne(namespace+".selectMember", userid);

       }

 

 

       @Override

       public MemberVO readWithPW(String userid, String pw) throws Exception {

              

               Map<String, Object> paramMap = new HashMap<String, Object>();

              

               paramMap.put("userid", userid);

               paramMap.put("userpw", pw);

              

               return sqlSession.selectOne(namespace+".readWithPW", paramMap);

       }

 

}

 

보통 DAO를 인식시키기 위해 @Repository 어노테이션을 사용한다. 이 어노테이션을 스프링이 인식하여 빈으로 생성하기 위해 root-context.xml에 아래와 같이 추가한다.

 

<context:component-scan base-package="org.project.persistence">

</context:component-scan>

 

아래 그림을 보면 MemberDAOImpl 클래스가 빈으로 등록되었다고 나온다.

 

테스트 코드를 작성한다.

 

package org.project.web;

 

import javax.inject.Inject;

 

 

import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.test.context.ContextConfiguration;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import org.project.domain.MemberVO;

import org.project.persistence.MemberDAO;

 

 

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(

       locations ={"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})

public class MemberDAOTest {

 

       @Inject

       private MemberDAO dao;

      

       @Test

       public void testTime()throws Exception{

              

               System.out.println(dao.getTime());

              

       }

      

       @Test

       public void testInsertMember()throws Exception{

              

               MemberVO vo = new MemberVO();

               vo.setUserid("user00");

               vo.setUserpw("user00");

               vo.setUsername("USER00");

               vo.setEmail("user00@aaa.com");

              

               dao.insertMember(vo);

              

       }     

 

}

테스트를 해보면 아래와 같이 로그가 상세히 찍히는 것을 확인할 수 있다(log4jdbc 설정을 했기 때문이다.).

 

'IT공부 > 스프링' 카테고리의 다른 글

게시판 CRUD구현  (0) 2020.07.06
STS에서 Git 사용하기  (0) 2020.07.05
스프링 MVC  (0) 2020.07.04
MyBatis 연동  (0) 2020.07.03
MySQL 연결 테스트  (0) 2020.07.03