-
마이바티스(mybatis) 도입framework/Spring 2018. 8. 2. 12:04반응형
지난 시간까지 Jsp를 도입하며 완전한 MVC 패턴을 구현해 보았다. 이번시간에는 mybatis framework를 사용하여 자바 코드와 SQL문을 분리해 보도록 하겠다. 동시에 반복적으로 수행해야 하는 JDBC 코드를 캡슐화 하는 방법도 알아보자.
1) build.gradle 파일에 mybatis 라이브러리를 추가해 준다.
build.gardle 파일의 dependencies 에
// mybatis 라이브러리 Persistence Framework
// https://mvnrepository.com/artifact/org.mybatis/mybatis
compile group: 'org.mybatis', name: 'mybatis', version: '3.4.6'
와 같은 코드를 추가하고 gradle 명령어로 라이브러리를 다운로드 받는다2) src/main/resources 아래에 config 패키지를 만들고 mybatis-config.xml 파일 생성후 mybatis.org에 있는 xml 설정파일을 복사해 넣는다.
mybatis에 관한 설정은 xml으로 제어한다. 이 설정 파일에는 dbms 접속정보와 sql Mapper 위치등에 대한 정보를 저장하게 되고 자바 코드에서는 이런 정보를 완전히 분리하게 만든다. 설정 파일은 mybatis.org에 있는 문서에서 복사해서 써도 무관하다. 코드는 다음과 같다.
1234567891011121314151617181920212223242526<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><typeAliases><package name="domain"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/testdb"/><property name="username" value="test"/><property name="password" value="1111"/></dataSource></environment></environments><mappers><mapper resource="sql/MemberMapper.xml"/></mappers></configuration>cs 우리는 나중에 sql 패키지 아래에 MemberMapper를 추가할 것이기 때문에 미리 Mapper를 추가해 줬고, domain 패키지 내에있는 Member객체를 이용하기 위해 typeAliases로 domain패키지의 위치를 지정해 줬다.
3) ContextLoaderListner에 SqlSessionFactory 객체를 선언하고 Dao 생성자에 꽂아준다.
이제 DAO에서 연결을 관리하지 않으므로 연결을 관리하는 객체인 SqlSessionFactory를 미리 만들어 Dao에 전달해 줘야 한다. 이를 위해 우리는 이미 존재하는 ContextLoaderListner를 이용할 수 있다. ContextLoaderListner에 SqlSessionFactory 객체를 만들고 Dao에 주입한다. 말이 어렵지만 코드를 보면 가단하다.
123456789101112131415161718192021222324252627282930package listener;import javax.servlet.ServletContext;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import javax.servlet.annotation.WebListener;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import dao.MemberDao;@WebListenerpublic class ContextLoaderListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent sce) {try {SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("config/mybatis-config.xml"));MemberDao memberDao = new MemberDao(sqlSessionFactory);ServletContext sc = sce.getServletContext();sc.setAttribute("memberDao", memberDao);} catch (Exception e) {e.printStackTrace();}}}cs 4) Dao 생성자는 SqlSessionFactory를 주입하도록 바꾸고 메서드 역시 sqlSessionFactory를 받는 방법으로 바꿔준다.
이제 Dao에 주입되는 것이 sqlSessionFactory로 바뀌었기 때문에 생성자 역시 바꿔 줘야 한다. 메서드 역시 sqlSessionFactory를 받아 session을 오픈해서 sqlSession을 통해 데이터를 받는 방법으로 바꿔준다.
12345678910111213141516171819202122232425package dao;import java.util.List;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import domain.Member;public class MemberDao {SqlSessionFactory sqlSessionFactory;public MemberDao(SqlSessionFactory sqlSessionFactory) {this.sqlSessionFactory = sqlSessionFactory;}public List<Member> selectList() throws Exception {try (SqlSession sqlSession = sqlSessionFactory.openSession()) {return sqlSession.selectList("member.selectList"); // member는 namespace를 selectlist는 id를 나타낸다}}}cs 5) src/main/resources 아래에 sql 패키지를 만들고 MemberMapper.xml을 만든다.
이제 실질적인 sql 문을 담고있는 MemberMapper.xml을 작성할 차례이다. 우리는 이미 typeAlieses를 선언했기 때문에 domain패키지 내에 있는 클래스는 전체 경로를 다 담을 필요가 없다.
이때 주의 할 것은 database 상의 column명과 member 클래스의 프로퍼티명이 다른 경우에는 resultMap을 통해 그 사실을 알려줘야 한다는 것이다.
1234567891011121314<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="member"><resultMap type="Member" id="MemberMap"><id column="mid" property="id" /></resultMap><select id="selectList" resultMap="MemberMap">select mid, email from member</select></mapper>cs 이제 MVC 패턴에 mybatis까지 도입된 웹 애플리케이션이 완성되었다.
반응형'framework > Spring' 카테고리의 다른 글
pageController를 POJO로 변환 (0) 2018.08.07 FrontController 도입 (0) 2018.08.03 JSP 도입과 MVC 패턴 (0) 2018.07.31 JDBC+DAO 활용한 회원 리스트 만들기 (0) 2018.07.30 서블릿(servlet)을 이용한 회원관리 페이지 만들기 (2) 라이브러리 등록과 회원목록 출력 (0) 2018.07.26