Servlet JSP MVC Spring

[MVC] 정보 수정 및 삭제

vhxpffltm 2020. 3. 5. 21:30

이번에는 DB의 정보를 수정하고 삭제하는 기능을 MVC모델로 구현해보자.

 

일련의 과정은 아래와 같다.

1) '수정하기'를 클릭하면 컨트롤러에 요청한다.

2) 컨트롤러는 전송된 회원 정보를 가져온 후 테이블에서 회원정보를 수정한다.

3) 수정을 마친 후 컨트롤러는 회원목록을 보여준다.

 

삭제

1) '삭제'를 클릭하면 회원ID를 컨트롤러로 전달한다.

2) 컨트롤러는 request의 getpathonfo()메서드를 이용해 요청명을 가져온다.

3) 회원 ID를 SQL문으로 전달해 테이블에서 정보를 삭제한다.

 

 

수정 작업을 진행해보자. 새로운 패키지를 만들어 이전의 컨트롤러와 DAO 그리고 VO 클래스를 복사하여 붙여넣는다.

그리고 새 JSP파일을 관리할 test02 폴더를 만들어 이전의 JSP파일 역시 복사하여 붙여넣는다.

 

컨트롤러에는 요청 URL에 따른 getpathinfo() 메서드로 요청에 따라 무엇을 할지 결정할 것이다. 그리고 각 경우에 따라 VO객체에 DAO메서드들을 이용하여 테이블을 조작할 것이다.

 

MemberController.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package sec02xex02;
 
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
 
 
/**
 * Servlet implementation class MemberController
 */
@WebServlet("/member/*")
public class MemberController extends HttpServlet {
    private static final long serialVersionUID = 1L;
    MemberDAO memberDAO;
    
    public void init(ServletConfig config) throws ServletException {
        memberDAO = new MemberDAO(); //객체 초기화
    }
 
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doHandle(request, response);
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     *      response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doHandle(request, response);
    }
    
    private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String nextPage = null;
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        String action = request.getPathInfo();
        System.out.println("action:" + action);
        if (action == null || action.equals("/listMembers.do")) {
            List<MemberVO> membersList = memberDAO.listMembers();
            request.setAttribute("membersList", membersList);
            nextPage = "/test02/listMembers.jsp";
        } 
        
        else if (action.equals("/addMember.do")) {
            String id = request.getParameter("id");
            String pwd = request.getParameter("pwd");
            String name = request.getParameter("name");
            String email = request.getParameter("email");
            MemberVO memberVO = new MemberVO(id, pwd, name, email);
            memberDAO.addMember(memberVO);
            request.setAttribute("msg""addMember");
            nextPage = "/members/listMembers.do";
        } 
        else if (action.equals("/memberForm.do")) {
            nextPage = "/test02/memberForm.jsp";
        }
        
        else if(action.equals("/modMemberForm.do")){// 회원 수정 요청시 ID로 회원 정보 조회, 수정창으로 포워딩
            System.out.println("????? 수정 버튼 누르면 되야됨??");
             String id=request.getParameter("id");
             MemberVO memInfo = memberDAO.findMember(id); //전송된 ID로 회원 정보를 조회
             request.setAttribute("memInfo", memInfo); // 바인딩하여 수정전의 회원정보를 전달
             nextPage="/test02/modMemberForm.jsp";
        }
        
        else if(action.equals("/modMember.do")){ //테이블 회원정보를 수정
             String id=request.getParameter("id");
             String pwd=request.getParameter("pwd");
             String name= request.getParameter("name");
             String email= request.getParameter("email");
             MemberVO memberVO = new MemberVO(id, pwd, name, email); //각 값을 MemberVO 객체 속성에 설정
             memberDAO.modMember(memberVO);
             request.setAttribute("msg""modified"); // 수정 완료한 메세지를 보냄
             nextPage="/members/listMembers.do";
        }
        
        else if(action.equals("/delMember.do")){
             String id=request.getParameter("id"); // 삭제할 ID를 받아옴
             memberDAO.delMember(id); // DAO의  delMember
             request.setAttribute("msg""deleted"); // 삭제 완료 메세지 전달
             nextPage="/members/listMembers.do";
        }
        
        else {
            List<MemberVO> membersList = memberDAO.listMembers();
            request.setAttribute("membersList", membersList);
            nextPage = "/test02/listMembers.jsp";
        }
        RequestDispatcher dispatch = request.getRequestDispatcher(nextPage);
        dispatch.forward(request, response);
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

추가된 URL에 따라 역할이 다르다. 회원 수정창을 요청할때 어떤 회원 정보를 수정할지 수정할 회원 ID를 찾고 수정창의 입력에 따른 결과를 새로 설정하고 그리고 하나는 회원을 삭제하는 경우 3가지가 추가되었다.

 

번외인 오류사항으로 패키지를 새로 생성하여 톰캣 서버를 실행할때 아마 위 코드로는 실행이 안될것이다. 톰캣 서버 실행시 오류가 발생할텐데 중복된 URL때문이다.

이전의 패키지와 같은 이름의 URL을 사용하기에 URL이름을 바꿔야한다. URL이름을 바꾸어 작동하도록 해보자. nextPage 변수의 경로를 보면 Servlwt의 URL이름을 어떻게 바꿔야하는지 알 수 있다.

http://www.newlecture.com/answeris/1

 

MemberDAO.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//..... 중략......//
    public MemberVO findMember(String ID) {
            MemberVO meminfo = null;
            try {
                conn = dataFactory.getConnection();
                String query = "select * from t_member where id=?"//전달된 ID로 회원 정보를 조회
                pstmt.setString(1, ID);
                System.out.println(query);
                ResultSet rs = pstmt.executeQuery();
                rs.next();
                String id = rs.getString("id");
                String pwd = rs.getString("pwd");
                String name = rs.getString("name");
                String email = rs.getString("email");
                Date joinDate = rs.getDate("joinDate");
                meminfo = new MemberVO(id,pwd,name,email,joinDate);
                pstmt.close();
                conn.close();
            }
            catch(Exception e) {
                e.printStackTrace();
            }
            return meminfo;
        }
        
        public void modMember(MemberVO memberVO) {
            String id = memberVO.getId();
            String pd = memberVO.getPwd();
            String name = memberVO.getName();
            String email = memberVO.getEmail();
            try {
                conn = dataFactory.getConnection();
                String query = "update t_member set pwd=?,name=?,email=? where id=?";
                //update문을 이용해 전달된 수정 회원정보를 수정
                System.out.println(query);
                pstmt = conn.prepareStatement(query);
                pstmt.setString(1, pd);
                pstmt.setString(2, name);
                pstmt.setString(3, email);
                pstmt.setString(4, id);
                pstmt.executeUpdate(); //SQL문 실행
                pstmt.close();
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public void delMember(String id) {
            try {
                conn = dataFactory.getConnection();
                String query = "delete from t_member where id=?";
                System.out.println(query);
                pstmt = conn.prepareStatement(query);
                pstmt.setString(1, id);
                pstmt.executeUpdate();
            }
            catch (Exception e) {
                e.printStackTrace();
            }
        }
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 DAO클래스에서 추가된 부분이다. addMember() 함수 밑에 그대로 작성하면 된다. 

DB와 연동하여 쿼리문을 실행하고 각 값들을 설정하거나 지운다.

findMember() 메서드는 조회를 실행하고 실행하고 얻은 값들을 VO클래스로 전송하고 있다.

*findMember() 메서드에 7번 라인위에 pstmt = conn.prepareStatement(query) 를 추가해야한다.

 

 

JSP는 1개만 추가하면 된다. 설명은 생략한다. 수정 Form이다. 

이전의 JSP파일 2개에서 URL경로를 컨트롤러에서 수정한 경로로 변경해야한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<%@ 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");
%> 
<head>
<meta charset="UTF-8">
<title>회원 정보 수정창</title>
<style>
  .cls1 {
     font-size:40px;
     text-align:center;
   }
</style>
</head>
<body>
 <h1 class="cls1">회원 정보 수정창</h1>
<form  method="post" action="${contextPath}/members/modMember.do?id=${memInfo.id}">
 <table align="center" >
   <tr>
     <td width="200"><p align="right" >아이디</td>
     <td width="400"><input   type="text" name="id" value="${memInfo.id}" disabled ></td>
     
   </tr>
 <tr>
     <td width="200"><p align="right" >비밀번호</td>
     <td width="400"><input   type="password" name="pwd" value="${memInfo.pwd}" >
     </td>
   </tr>
   <tr>
     <td width="200"><p align="right" >이름</td>
     <td width="400"><input   type="text" name="name" value="${memInfo.name}" ></td>
   </tr>
   <tr>
     <td width="200"><p align="right" >이메일</td>
     <td width="400"><input   type="text" name="email"  value="${memInfo.email}" ></td>
   </tr>
   <tr>
     <td width="200"><p align="right" >가입일</td>
     <td width="400"><input   type="text"  name="joinDate" value="${memInfo.joinDate }" disabled  ></td>
   </tr>
   <tr align="center" >
    <td colspan="2" width="400"><input type="submit" value="수정하기" >
       <input type="reset" value="다시입력" > </td>
   </tr>
 </table>
</form>
</html>
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

실행결과는 아래와 같다.

http://localhost:8090/MVC/members/listMember.do의 경로로 먼저 회원 리스트를 출력한다.

 

 

수정버튼을 눌러 아무 회원의 내용을 수정해본다.

 

수정하기버튼을 누르면 수정이 완료된다. JSP의 alert로 변경됐다는 알람이 보이며 리스트가 새로 출력된다.

 

 

이제 '바디' 회원을 삭제해보자. 삭제 버튼을 눌러 delMember()를 호출하도록 하자.

 

 

이렇게 MVC패턴을 사용하여 회원 관리의 CRUD: 조회, 추가, 수정, 삭제 까지의 기능을 간단하게 알아보았다.

다음엔 이 MVC패턴을 가지고 답변형 게시판을 구현할 것이다.

 

Refernce

자바 웹을 다루는 기술<길벗>