관리 메뉴

거니의 velog

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

Java_Spring Framework part1

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

Unlimited00 2023. 11. 10. 08:47

(3) 조건 값으로 회원 정보 조회

* 다음은 검색창에서 검색 조건을 입력한 후 member.xml의 SQL문에 전달하여 조건에 대한 회원 정보를 조회하는 예제를 실습해 보자.

1. 다음과 같이 실습 파일을 준비하자.

2. member.xml을 다음과 같이 편집한다. 조건 값으로 조회하는 경우는 브라우저에서 전달되는 값이 있으므로 <select> 태그에 parameterType 속성을 전달되는 조건 값의 데이터 타입으로 지정한다. 조건 값이 문자열인 경우는 parameterType 속성을 String으로, 정수인 경우는 int로 설정한다.

* MemberDAO에서 메서드 호출 시 전달된 조건 값은 매개변수 이름으로 SQL문의 조건식에 #{전달된 매개변수 이름} 형식으로 사용한다. 그리고 조회되는 레코드가 한 개인 경우는 resultType 속성에 레코드를 저장할 memberVO를 설정한다.

	 <!-- MemberDAO에서 호출하는 id를 지정한다. -->
	 <!-- 조회되는 한 개의 레코드를 memberVO에 저장한다. -->
	 <!-- MemberDAO에 SQL문 호출 시 전달되는 매개변수의 데이터 타입을 지정한다. -->
	<select id="selectMemberById" resultType="memberVO"  parameterType="String" >
      <![CDATA[
         select * from t_member
         where
         id=#{id}			
      ]]>
	 </select>	
	
	<!-- SQL 문 실행시 매개변수의 이름을 pwd의 조건 값으로 사용한다. -->
	<select id="selectMemberByPwd" resultMap="memResult"  parameterType="int" >
      <![CDATA[
         select * from t_member
         where
         pwd = #{pwd}			
      ]]>
    </select>

3. 서블릿에서는 브라우저의 요청에 대해 MemberDAO 클래스의 메서드를 호출한 후 그 결과를 브라우저로 출력한다.

[MemberServlet.java]

private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		MemberDAO dao = new MemberDAO();
		MemberVO memberVO = new MemberVO();
		String action = request.getParameter("action");
		String nextPage = "";

		if (action== null || action.equals("listMembers")) {
			List<MemberVO> membersList = dao.selectAllMemberList();
			request.setAttribute("membersList", membersList);
			nextPage = "test02/listMembers.jsp";
		} else if (action.equals("selectMemberById")) { // 검색 조건이 selectMemberById이면 전송된 값을 getParameter()로 가져온 후 SQL문의 조건식에서 id의 조건 값으로 전달한다.
			String id = request.getParameter("value");
			memberVO = dao.selectMemberById(id);
			request.setAttribute("member", memberVO);
			nextPage = "test02/memberInfo.jsp";
		} else if (action.equals("selectMemberByPwd")) { // 검색 조건이 selectMemberByPwd이면 전송된 값을 getParameter()로 가져온 후 SQL문의 조건식에서 pwd의 조건 값으로 전달한다.
			int pwd = Integer.parseInt(request.getParameter("value"));
			List<MemberVO> membersList = dao.selectMemberByPwd(pwd);
			request.setAttribute("membersList", membersList);
			nextPage = "test02/listMembers.jsp";
		}
		
		RequestDispatcher dispatch = request.getRequestDispatcher(nextPage);  
		dispatch.forward(request, response);

	}

4. selectOne() 메서드는 하나의 레코드를 조회할 때 사용한다. selectOne() 메서드의 두 번째 인자는 첫 번째 인자의 SQL문에서 매개변수 이름 id로 조건 값을 전달한다.

[MemberDAO.java]

	public MemberVO selectMemberById(String id){
		sqlMapper=getInstance();
		SqlSession session=sqlMapper.openSession();
		// 서블릿에서 넘어온 id의 값을 selectOne() 메서드 호출 시 해당 SQL문의 조건 값으로 전달한다.
		// selectOne() : 레코드를 한 개만 조회할 때 사용한다.
		MemberVO memberVO = session.selectOne("mapper.member.selectMemberById",id);
		return memberVO;		
	}

	public List<MemberVO> selectMemberByPwd(int pwd) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		List<MemberVO> membersList = null;
		// 비밀번호가 같은 회원은 여러 명이 있을 수 있으므로 selectList() 메서드로 조회한다.
		// 정수 데이터인 pwd를 SQL문의 조건 값으로 전달한다.
		membersList = session.selectList("mapper.member.selectMemberByPwd", pwd);
		return membersList;
	}

5. search.jsp 를 다음과 같이 작성한다. 검색창에 입력한 값과 셀렉트 박스의 검색 조건을 선택해 서블릿으로 전송한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" 
    isELIgnored="false"  %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>회원 검색창</title>
</head>

<body>
    <form action="${pageContext.request.contextPath}/mem3.do">
        입력 : <input type="text" name="value" /> <!-- 검색할 값을 입력한다. -->
        <select name="action">
            <option value="listMembers">전체</option>
            <option value="selectMemberById">아이디</option>
            <option value="selectMemberByPwd">비밀번호</option>
        </select> <br> <!-- 셀렉트 박스의 검색 조건을 선택한다. -->
        <input type="submit" value="검색" />
    </form>
</body>

</html>

6. memberInfo.jsp에서는 검색 조건으로 조회한 회원 정보를 출력한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
import="java.io.*,java.util.*"
pageEncoding="UTF-8"
isELIgnored="false" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>

<head>
    <meta charset="UTF-8">
    <title>회원 정보 출력창</title>
</head>

<body>
    <table border=1 align="center" width="100%">
        <tr align="center" bgcolor="lightgreen">
            <td><b>아이디</b></td>
            <td><b>비밀번호</b></td>
            <td><b>이름</b></td>
            <td><b>이메일</b></td>
            <td><b>가입일</b></td>
        </tr>
        <tr align="center">
            <td>${member.id} </td>
            <td>${member.pwd} </td>
            <td>${member.name} </td>
            <td>${member.email} </td>
            <td>${member.joinDate}</td>
        </tr>
    </table>
</body>

</html>

7. 다음의 주소로 요청하여 셀렉트 박스에서 아이디를 선택하여 검색 조건을 설정한다. 입력 칸에 park이라고 입력한 후 검색을 클릭한다.

- http://localhost:8090/pro23/test02/search.jsp

8. 조회된 결과가 memberInfo.jsp 에 표시된다.

9. 이번에는 셀렉트 박스에서 검색 조건을 비밀번호로 설정한 후 검색을 클릭한다. 그러면 입력한 값과 같은 비밀번호를 가지는 회원 정보가 모두 표시된다.

10. 검색 조건을 전체로 설정해서 요청하면 전체 회원 정보가 표시된다.


(4) 회원 정보 추가

* 이번에는 회원 가입 창에서 입력한 회원 정보를 마이바티스를 이용해 등록해 보자.

1. 다음과 같이 com.spring.ex04 패키지를 만들고 실습 파일을 준비한다.

2. member.xml 을 다음과 같이 작성한다. insert 문은 <insert> 태그를 이용해 작성하고 등록할 회원 정보를 memberVO 빈에 설정한 후 <insert> 태그의 parameterType의 memberVO로 전달한다. values 다음에 #{속성이름}을 나열하면 memberVO 빈의 속성 값이 설정된다.

    <!-- MemberDAO 에서 회원 정보를 memberVO의 속성에 저장해서 넘긴다. -->
    <!-- memberVO의 속성 이름에 저장된 값을 value로 설정한다. -->
    <insert id="insertMember"  parameterType="memberVO">
		<![CDATA[
		 insert into t_member(id,pwd, name, email)
		 values(#{id}, #{pwd}, #{name}, #{email})
		]]>      
	</insert>

3. 브라우저에서 전송된 action 값이 insertMember면 함께 전송된 회원 정보를 가져와 MemberVO 객체에 설정한다. 그런 다음 MemberDAO의 insertMember() 메서드를 호출하면서 인자로 전달된다.

[MemberServlet.java]

		}else if(action.equals("insertMember")) {
			String id=request.getParameter("id");
            String pwd=request.getParameter("pwd");
            String name=request.getParameter("name");
            String email = request.getParameter("email");
            memberVO.setId(id);
            memberVO.setPwd(pwd);
            memberVO.setName(name);
            memberVO.setEmail(email);
            dao.insertMember(memberVO); // 회원 가입 창에서 전송된 회원 정보를 MemberVO에 설정한 후 insertMember() 메서드로 전달한다.
            nextPage="/mem4.do?action=listMembers";
        }
        
        RequestDispatcher dispatch = request.getRequestDispatcher(nextPage);  
	    dispatch.forward(request, response);

	}

4. MemberDAO 클래스에서 insert 문을 사용하려면 SqlSession 클래스의 insert() 메서드를 이용해야 한다. 다음과 같이 insert() 메서드의 첫 번째 인자에는 실행하고자 하는 SQL문의 id를 입력하고 두 번째 인자에는 SQL문으로 전달할 데이터를 지정한다. SQL문으로 전달할 데이터는 <insert> 태그의 parameterType 속성의 데이터 타입인 MemberVO 클래스와 일치해야 한다.

	public int insertMember(MemberVO memberVO) {
		sqlMapper = getInstance();
		SqlSession session = sqlMapper.openSession();
		int result = 0;
		result = session.insert("mapper.member.insertMember", memberVO); // 지정한 id의 SQL문에 memberVO의 값을 전달하여 회원 정보를 테이블에 추가한다.
		session.commit(); // 수동 커밋이므로 반드시 commit() 메서드를 호출하여 영구적으로 반영한다.
		return result;
	}

5. 회원 가입창에서 회원 정보를 전송하면 action 값으로 insertMember를 전달한다.

[memberForm.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    isELIgnored="false" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<%
   request.setCharacterEncoding("UTF-8");
%>
<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>회원 가입창</title>
    <style>
        .text_center {
            text-align: center;
        }
    </style>
</head>

<body>
    <form method="post" action="${contextPath}/mem4.do?action=insertMember"> <!-- action 값으로 insertMember를 MemberServlet으로 전달한다. -->
        <h1 class="text_center">회원 가입창</h1>
        <table align="center">
            <tr>
                <td width="200">
                    <p align="right">아이디</p>
                </td>
                <td width="400"><input type="text" name="id"></td>
            </tr>
            <tr>
                <td width="200">
                    <p align="right">비밀번호</p>
                </td>
                <td width="400"><input type="password" name="pwd"></td>
            </tr>
            <tr>
                <td width="200">
                    <p align="right">이름</p>
                </td>
                <td width="400">
                    <p><input type="text" name="name"></p>
                </td>
            </tr>
            <tr>
                <td width="200">
                    <p align="right">이메일</p>
                </td>
                <td width="400">
                    <p><input type="text" name="email"></p>
                </td>
            </tr>
            <tr>
                <td width="200">
                    <p>&nbsp;</p>
                </td>
                <td width="400"><input type="submit" value="가입하기"><input type="reset" value="다시입력"></td>
            </tr>
        </table>
    </form>
</body>

</html>

6. 다음의 주소로 요청하여 회원 정보를 입력하고 가입하기를 클릭하면 새 회원 정보가 추가되고 회원 목록이 표시된다.

- http://localhost:8090/pro23/test03/memberForm.jsp