배우고 익혀 널리 알리자

[KITRI]한국정보기술연구원 웹 자바 플랫폼을 활용한 기업 솔루션 개발자 과정(95일) - MyBatis

로춘남 2020. 7. 10. 08:35
728x90

JavaScript와 jQuery에 이은 MyBatis 진도. 하루하루 진도가 빠르기 때문에 모든걸 다 이해하는건 힘들어서 복습을 통해 조금이라도 기억을 유지하는것으로 목표를 두고 있다.

일단 MyBatis는 JDBC를 사용하기 편리하게 소스코드(java)와 SQL(xml)을 분리하여 개발 할 수 있게 해주는 프레임워크다.

흔히 ORM이라고 말하는 객체와 관계를 연결해주는 개념(Object / Relation / Mapping) 에서 객체와 테이블 시스템(RDBMS)을 변형 및 연결해주는 작업으로 이중 가장 많이 사용하는 ORM이 바로 MyBatis와 Hibernate(JPA)가 대표적이다. 하나하나씩 배울수록 해야할일들이 많아지지만 유지보수가 편리해진다는 프레임워크의 특성을 잘 나타내고 있는듯하다.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  
  <!-- dtd는 앞에 파일들을 쓸 수 있게 해주는 역할. 지정한다고 봐야하나? -->

<mapper namespace="member">
	<select id="selectMember" resultType="member"> <!-- member는 result 타입 입니당 -->
		SELECT * FROM member
	</select>

</mapper>

<!-- XML 덕분에 쿼리를 보는게 좀 더 수월해짐 -->

상단의 Public 부분은 mybatis 홈페이지에서 가져올 수 있으며, 저걸 외워서 쓰는 사람은 거의 없다고 봐야지 않을까..

일단 길어.. 그리고 dtd 파일 형식은 앞에 있는 파일들을 쓸 수 있게 해주는 역할로 지정한다고 이해하는게 좀 더 쉬울 것 같다.

mapper는 쿼리문을 따로 가져와서 타입을 설정해 주는데 위에서는 result로 구분해놨으며,

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>
<!-- 자주사용하는 객체를 alias 명칭으로 지정 -->
	<typeAliases>
		<typeAlias alias="member" type="servlet.MemberVO" />
	</typeAliases>


<!-- DB Connection 설정 -->
  <environments default="">
    <environment id="">
      <transactionManager type="JDBC"/>
      
      
      <dataSource type="JNDI">
      	<property name = "data_source" value="java:jdbc/myoralce"/>
        
      </dataSource>
      
      
      
    </environment>
  </environments>
  
  <!--SQL 쿼리가 있는 mapper 파일 위치 설정  -->
  <mappers>
    <mapper resource="mybatis/member-mapper.xml"/>
  </mappers>
</configuration>

앞서 말했지만, 상단에 표시된 코드들은 마이바티스를 쓸 때 반드시 필요한 코드들이며, 자주 사용하는 객체를 alisas라는 명칭으로 지정을 한다. 코드에서는 servlet.MemberVO를 자주 사용하는 객체로 지정하였다.

이후 연결해줄 수 있는 DB Connection을 설정해주며, SQL 쿼리가 있는 mapper 파일의 위치 역시 설정해준다.

package servlet;

public class MemberVO {
	private String id;
	private String pwd;
	private String name;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	
}

 

package servlet;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import util.MybatisConnector;

public class MemberDAO {
	private static MemberDAO dao = null;
	private SqlSessionFactory factory = null;

	private MemberDAO() {
		factory = MybatisConnector.getInstance().getSqlSessionFactory();

	}

	public static MemberDAO getInstance() {
		if (dao == null) {
			dao = new MemberDAO();
		}
		return dao;
	}

	public List<MemberVO> selectList() {
		List<MemberVO> mlist = null;
		SqlSession sqlSession = factory.openSession(); // connection
											//namespace.id
		mlist = sqlSession.selectList("member.selectMember");
		sqlSession.close();
		return mlist;
	}
}
package servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/mybatis")
public class MybatisController extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		MemberDAO dao = new MemberDAO.getInstance();
		List<MemberVO>	mlist = mdao.selectList();
		System.out.println("id:"+mlist.get(0).getId());
		System.out.println("pwd:"+mlist.get(0).getPwd());
		System.out.println("name:"+mlist.get(0).getName());
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
package util;

import java.io.IOException;
import java.io.Reader;

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

public class MybatisConnector {
	private static MybatisConnector connector = null;
	private SqlSessionFactory factory = null;
	
	private MybatisConnector() {
		try {
		Reader reader = Resources.getResourceAsReader("mybatis/mybatis-config.xml");
		factory = new SqlSessionFactoryBuilder().build(reader);
	} catch (IOException e) {
		e.printStackTrace();
	}
	}
	
	public static MybatisConnector getInstance() {
		if(connector==null) {
			connector = new MybatisConnector();
		}
		return connector;
	}
	public SqlSessionFactory getSqlSessionFactory() {
		return factory;
	}
}

 mybatis 를 따로 설정하면, 이후 과정은 이전에 배웠던 JSP/Servlet과 거의 동일하다고 보면된다.

DAO와 VO 등 데이터를 보고 가져올 수 있는 클래스들을 만들고 Controller를 통해 통제한다. 그리고 Connector를 통해

쿼리분이 연결되어 있는 mybatis mapper를 가져오면 끝.

 

과정은 이렇게 간단하지만 처음 접하게 될 경우 파일도 많고 코드들도 기존에 비해 길어보여서 나에겐 다소 어려웠고 지금도 어려우나... 최대한 간단하게 생각해보기로...

 

정해진 틀을 이해하고, 주어진 데이터를 가져오는것에 익숙해져야겠다.

쫄지마자..

쫄지마!ㅋ

 

728x90