스프링에서 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 |