관리 메뉴

거니의 velog

(11) 마이바티스 프레임워크 사용하기 2 본문

Java_Spring Framework part1

(11) 마이바티스 프레임워크 사용하기 2

Unlimited00 2023. 11. 8. 13:48

4. 마이바티스 이용해 회원 정보 CRUD 실습하기

* 이번에는 앞에서 실습한 selectList() 메서드 외에 마이바티스에서 제공하는 다른 메서드를 사용해 보자. 마이바티스의 SqlSession 클래스에서 제공하는 CRUD를 실행할 때 많이 사용되는 메서드를 다음의 표로 정리했다.

* 게시판을 포함해 대부분의 프로그램이 갖고 있는
  Create(생성),
  Read(읽기),
  Update(갱신),
  Delete(삭제)
  기능을 CRUD 라고 부른다.

< SqlSession 클래스에서 제공하는 여러 가지 메서드 >

메서드 기능
List selectList(query_id) id에 대한 select 문을 실행한 후 여러 레코드를 List로 반환한다.
List selectList(query_id, 조건) id에 대한 select 문을 실행하면서 사용되는 조건도 전달한다.
T selectOne(query_id) id에 대한 select 문을 실행한 후 지정한 타입으로 한 개의 레코드를 반환한다.
T selectOne(query_id, 조건) id에 대한 select 문을 실행하면서 사용되는 조건도 전달한다.
Map<K, V> selectMap(query_id, 조건) id에 대한 select 문을 실행하면서 사용되는 조건도 전달한다. Map 타입으로 레코드를 반환한다.
int insert(query_id, Object obj) id에 대한 insert 문을 실행하면서 obj 객체의 값을 테이블에 추가한다.
int update(query_id, Object obj) obj 객체의 값을 조건문의 수정 값으로 사용해 id에 대한 update문을 실행한다.
int delete(query_id, Object obj) obj 객체의 값을 조건문의 조건 값으로 사용해 id에 대한 delete문을 실행한다.

* 그럼 이번에는 마이바티스의 메서드들을 이용해 회원 조회부터 추가, 수정, 삭제까지 회원 관리 기능(CRUD)을 구현해 보자.


(1) 회원의 ID와 비밀번호 조회

* 테이블의 회원 정보 중 문자열이나 정수와 같은 기본형 데이터를 조회해 보자.

1. 우선, 다음과 같이 com.spring.ex02 패키지를 만들고 필요한 실습 파일을 준비한다.

2. member.xml에 다음과 같이 SQL 문을 작성한다. <select> 태그의 SQL 문에 접근하기 위해 id를 설정한다. resultType은 SQL문을 실행했을 때 한 개의 데이터를 조회하므로 String(문자열), int(정수)로 지정한다.

	<!-- MemberDAO에서 접근 시 사용할 SQL문의 id를 지정한다. -->
	<!-- resultType 속성을 문자열로 지정해 SQL 문으로 조회한 이름(문자열)을 호출한 메서드로 반환한다. -->
	<select id="selectName" resultType="String">
    <![CDATA[
	select name from t_member
	where id = 'hong'			
    ]]>
	</select>
	
	<!-- MemberDAO에서 접근 시 사용할 SQL문의 id를 지정한다. -->
	<!-- resultType 속성을 int로 지정해 SQL 문으로 조회한 정수를 호출한 메서드로 반환한다. -->
	<select id="selectPwd" resultType="int" >
	  <![CDATA[ 
	    select pwd from t_member 
	    where id = 'hong'
	 ]]>
	 </select>

3. MemberServlet을 다음과 같이 작성한다. 서블릿에서는 MemberDAO의 selectName()과 selectPwd() 메서드를 호출한 후 각 데이터를 브라우저에 알림창으로 출력한다.

package com.spring.ex02;

import java.io.IOException;
import java.io.PrintWriter;

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("/mem2.do")
public class MemberServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {
		doHandle(request, response);
	}

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

	private void doHandle(HttpServletRequest request, HttpServletResponse response)	throws  ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		MemberDAO dao = new MemberDAO();
		String name = dao.selectName(); // MemberDAO의 selectName() 메서드를 호출한다.
		//int pwd = dao.selectPwd(); // MemberDAO의 selectPwd() 메서드를 호출한다
		PrintWriter pw = response.getWriter();
		pw.write("<script>");
		pw.write("alert(' 이름: " + name +"');"); // 조회한 이름을 브라우저로 출력한다.
		//pw.write("alert(' 비밀번호 : "+ pwd+"');");
		pw.write("</script>");
	}
	
}

4. MemberDAO 클래스를 다음과 같이 작성한다. member.xml의 <select> 태그의 id로 각각의 SQL문을 호출한 후 각 <select> 태그의 resultType에 설정한 같은 타입의 변수로 한 개의 데이터를 반환한다.

package com.spring.ex02;

import java.io.Reader;
import java.util.List;

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

public class MemberDAO {
	
	private static SqlSessionFactory sqlMapper = null;

	private static SqlSessionFactory getInstance() {
		
		if (sqlMapper == null) {
			try {
				String resource = "mybatis/SqlMapConfig.xml";
				Reader reader = Resources.getResourceAsReader(resource);
				sqlMapper = new SqlSessionFactoryBuilder().build(reader);
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sqlMapper;

	}

	public String selectName() {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		String name = session.selectOne("mapper.member.selectName"); // selectOne() 메서드로 인자로 지정한 SQL문을 실행한 후 한 개의 데이터(문자열)를 반환한다.
		return name;
	} 
		
	public int selectPwd() {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		int pwd = session.selectOne("mapper.member.selectPwd"); // selectOne() 메서드로 지정한 SQL문을 실행한 후 한 개의 데이터(정수)를 반환한다.
		return pwd;
	}

}

5. 다음의 주소로 요청한다. 서블릿에서 selectName() 메서드로 조회한 경우 아이디에 해당하는 회원 이름을 알림창으로 출력한다.

- http://localhost:8090/pro23/mem2.do

 

6. 서블릿에서 selectPwd() 메서드로 조회한 경우 아이디에 해당하는 비밀번호를 알림창으로 출력한다.

package com.spring.ex02;

import java.io.IOException;
import java.io.PrintWriter;

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("/mem2.do")
public class MemberServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {
		doHandle(request, response);
	}

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

	private void doHandle(HttpServletRequest request, HttpServletResponse response)	throws  ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		MemberDAO dao = new MemberDAO();
		//String name = dao.selectName(); // MemberDAO의 selectName() 메서드를 호출한다.
		int pwd = dao.selectPwd(); // MemberDAO의 selectPwd() 메서드를 호출한다
		PrintWriter pw = response.getWriter();
		pw.write("<script>");
		//pw.write("alert(' 이름: " + name +"');"); 
		pw.write("alert(' 비밀번호 : "+ pwd+"');"); // 조회한 비밀번호를 브라우저로 출력한다.
		pw.write("</script>");
	}
	
}


(2) HashMap을 이용한 모든 회원 정보 조회

* 이번에는 자바의 HashMap을 이용해 모든 회원을 조회하는 기능을 실습해 보자.

* <resultMap> 태그의 type 속성에는 HashMap이 지정되어 있다. 즉, SQL 문 실행 시 레코드의 컬럼 이름을 key로 지정하고, 그 값을 value로 해서 HashMap에 차례대로 저장한다.

1. member.xml을 다음과 같이 수정한다.

    <resultMap id="memResult" type="java.util.HashMap"> <!-- 조회한 레코드를 지정한 컬럼 이름을 key, 값을 value로 해서 저장한다. -->
      <result property="id" column="id" />
      <result property="pwd" column="pwd" />
      <result property="name" column="name" />
      <result property="email" column="email" />
      <result property="joinDate" column="joinDate" />
    </resultMap>

	<select id="selectAllMemberList" resultMap="memResult"> <!-- 조회한 회원 정보를 HashMap에 저장한다. -->
      <![CDATA[
         select * from t_member	order by joinDate desc	 	
      ]]>
	</select>

2. 브라우저에서 서블릿에 요청하면 selectAllMemberList() 메서드를 호출하여 조회한 회원 정보를 바인딩한 후 listMembers.jsp로 포워딩한다.

package com.spring.ex01;

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

import javax.servlet.RequestDispatcher;
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("/mem.do")
public class MemberServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

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

	private void doHandle(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		MemberDAO dao = new MemberDAO();
		//List<MemberVO> membersList = dao.selectAllMemberList(); 
		List<HashMap<String, String>> membersList = dao.selectAllMemberList(); // 모든 회원 정보를 조회한다.
		request.setAttribute("membersList", membersList);
		RequestDispatcher dispatch = request.getRequestDispatcher("test01/listMembers.jsp");
		dispatch.forward(request, response);
	}
}

3. MemberDAO 클래스에서는 selectList() 메서드를 호출하면서 id가 selectAllMemberList인 SQL문을 실행하도록 다음과 같이 코드를 수정한다.

package com.spring.ex01;

import java.io.Reader;
import java.util.HashMap;
import java.util.List;

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

public class MemberDAO {
	public static SqlSessionFactory sqlMapper = null;

	private static SqlSessionFactory getInstance() {
		if (sqlMapper == null) {
			try {
				String resource = "mybatis/SqlMapConfig.xml"; // MemberDAO의 각 메서드 호출 시 src/mybatis/SqlMapConfig.xml에서 설정 정보를 읽은 후 데이터베이스와의 연동 준비를 한다.
				Reader reader = Resources.getResourceAsReader(resource);
				sqlMapper = new SqlSessionFactoryBuilder().build(reader); // 마이바티스를 이용하는 sqlMapper 객체를 가져온다.
				reader.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return sqlMapper;

	}

//	public List<MemberVO> selectAllMemberList() {
//		sqlMapper = getInstance();
//		SqlSession session = sqlMapper.openSession(); // 실제 member.xml의 SQL문을 호출하는 데 사용되는 SqlSession 객체를 가져온다.
//		List<MemberVO> memlist = null;
//		memlist = session.selectList("mapper.member.selectAllMemberList"); // 여러 개의 레코드를 조회하므로 selectList() 메서드에 실행하고자 하는 SQL문의 id를 인자로 전달한다.
//		return memlist;
//	}
	
	 public List<HashMap<String, String>> selectAllMemberList() { 
		sqlMapper = getInstance(); 
     	SqlSession session = sqlMapper.openSession();
		List<HashMap<String, String>> memlist = null; 
		memlist = session.selectList("mapper.member.selectAllMemberList"); // 모든 회원 정보를 조회한다. 
		return memlist; 
	 }
	
}

4. 다음은 실행 결과이다. 이번에는 조회한 회원 정보를 HashMap에 저장해서 표시한다.

- http://localhost:8090/pro23/mem.do