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를 가져오면 끝.
과정은 이렇게 간단하지만 처음 접하게 될 경우 파일도 많고 코드들도 기존에 비해 길어보여서 나에겐 다소 어려웠고 지금도 어려우나... 최대한 간단하게 생각해보기로...
정해진 틀을 이해하고, 주어진 데이터를 가져오는것에 익숙해져야겠다.
쫄지마자..
쫄지마!ㅋ
'배우고 익혀 널리 알리자' 카테고리의 다른 글
V-World 2D 지도 API 매개변수 정리 (0) | 2020.08.20 |
---|---|
[KITRI 한국정보기술연구원] 웹 자바 플랫폼 기반 개발자 과정(수료 후기) (6) | 2020.08.02 |
[KITRI]한국정보기술연구원 웹 자바 플랫폼을 활용한 기업 솔루션 개발자 과정(97일) - 두 번째 프로젝트 진행중 & 면접 (0) | 2020.07.20 |
[KITRI]한국정보기술연구원 웹 자바 플랫폼을 활용한 기업 솔루션 개발자 과정(96일) - 두 번째 프로젝트 시작 (0) | 2020.07.11 |
[KITRI]한국정보기술연구원 웹 자바 플랫폼을 활용한 기업 솔루션 개발자 과정(94일) - JavaScript (0) | 2020.07.08 |