Spring - 회원 상세정보 수정 및 삭제 처리 시 비밀번호 확인 구현
1. 컨트롤러(흐름제어)
MemberController
01) 회원정보 수정처리 mapping(member/update.do)
02) 비밀번호 체크
if(수정 처리후 전체 회원 목록 페이지로 리다이렉트)
else(다시 동일한 화면을 출력하기 위해서 가입일자와 수정일자 그리고 불일치 문구를 model에 저장,
상세 보기화면으로 포워드)
03) 회원정보 삭제처리 mapping(member/delete.do)
04) 비밀번호 체크
if(삭제 처리후 전체 회원 목록 페이지로 리다이렉트) else(불일치문구 출력, 상세보기화면으로 포워드)
package com.example.spring01.member.controller; import java.util.List; import javax.inject.Inject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import com.example.spring01.member.model.dto.MemberVO; import com.example.spring01.member.service.MemberService; @Controller // 현재의 클래스를 controller bean에 등록시킴 public class MemberController { private static final Logger logger = LoggerFactory.getLogger(MemberController.class); // MemberService 객체를 스프링에서 생성하여 주입시킴 @Inject MemberService memberService; // 01 회원 목록 // url pattern mapping @RequestMapping("member/list.do") public String memberList(Model model){ // controller => service => dao 요청 List<MemberVO> list = memberService.memberList(); model.addAttribute("list", list); return "member/member_list"; } // 02_01 회원 등록 페이지로 이동 @RequestMapping("member/write.do") public String memberWrite(){ return "member/member_write"; } // 02_02 회원 등록 처리 후 ==> 회원목록으로 리다이렉트 // @ModelAttribute에 폼에서 입력한 데이터가 저장된다. @RequestMapping("member/insert.do") // * 폼에서 입력한 데이터를 받아오는 법 3가지 //public String memberInsert(HttpServlet request){ //public String memberInsert(String userId, String userPw, String userName, String userEmail){ public String memberInsert(@ModelAttribute MemberVO vo){ // 테이블에 레코드 입력 memberService.insertMember(vo); // * (/)의 유무에 차이 // /member/list.do : 루트 디렉토리를 기준 // member/list.do : 현재 디렉토리를 기준 // member_list.jsp로 리다이렉트 return "redirect:/member/list.do"; } // 03 회원 상세정보 조회 @RequestMapping("member/view.do") public String memberView(@RequestParam String userId, Model model){ // 회원 정보를 model에 저장 model.addAttribute("dto", memberService.viewMember(userId)); //System.out.println("클릭한 아이디 확인 : "+userId); logger.info("클릭한 아이디 : "+userId); // member_view.jsp로 포워드 return "member/member_view"; } // 04. 회원 정보 수정 처리 @RequestMapping("member/update.do") public String memberUpdate(@ModelAttribute MemberVO vo, Model model){ // 비밀번호 체크 boolean result = memberService.checkPw(vo.getUserId(), vo.getUserPw()); if(result){ // 비밀번호가 일치하면 수정 처리후, 전체 회원 목록으로 리다이렉트 memberService.updateMember(vo); return "redirect:/member/list.do"; } else { // 비밀번호가 일치하지 않는다면, div에 불일치 문구 출력, viwe.jsp로 포워드 // 가입일자, 수정일자 저장 MemberVO vo2 = memberService.viewMember(vo.getUserId()); vo.setUserRegdate(vo2.getUserRegdate()); vo.setUserUpdatedate(vo2.getUserUpdatedate()); model.addAttribute("dto", vo); model.addAttribute("message", "비밀번호 불일치"); return "member/member_view"; } } // 05. 회원정보 삭제 처리 // @RequestMapping : url mapping // @RequestParam : get or post방식으로 전달된 변수값 @RequestMapping("member/delete.do") public String memberDelete(@RequestParam String userId, @RequestParam String userPw, Model model){ // 비밀번호 체크 boolean result = memberService.checkPw(userId, userPw); if(result){ // 비밀번호가 맞다면 삭제 처리후, 전체 회원 목록으로 리다이렉트 memberService.deleteMember(userId); return "redirect:/member/list.do"; } else { // 비밀번호가 일치하지 않는다면, div에 불일치 문구 출력, viwe.jsp로 포워드 model.addAttribute("message", "비밀번호 불일치"); model.addAttribute("dto", memberService.viewMember(userId)); return "member/member_view"; } } } | cs |
2. 서비스(비지니스로직, DB연동 이외의 작업)
MemberServiceImpl
회원정보 수정 및 삭제를 위한 비밀번호 체크 메서드 추가
(MemberService, MemberServiceImpl - memberDao.checkPw메서드 호출)
package com.example.spring01.member.service; import java.util.List; import javax.inject.Inject; import org.springframework.stereotype.Service; import com.example.spring01.member.model.dao.MemberDAOImpl; import com.example.spring01.member.model.dto.MemberVO; // 현재 클래스를 스프링에서 관리하는 service bean으로 등록 @Service public class MemberServiceImpl implements MemberService { // MemberDAOImpl 객체를 스프링에서 생성하여 주입시킴 @Inject MemberDAOImpl memberDao; // 01. 전체 회원 목록 조회 @Override public List<MemberVO> memberList() { return memberDao.memberList(); } // 02. 회원 등록 @Override public void insertMember(MemberVO vo) { memberDao.insertMember(vo); } // 03. 회원 정보 상세 조회 @Override public MemberVO viewMember(String userId) { return memberDao.viewMember(userId); } // 04. 회원 정보 수정 처리 @Override public void deleteMember(String userId) { memberDao.deleteMember(userId); } // 05. 회원 정보 삭제 처리 @Override public void updateMember(MemberVO vo) { memberDao.updateMember(vo); } // 06. 회원 정보 수정 및 삭제를 위한 비밀번호 체크 @Override public boolean checkPw(String userId, String userPw) { return memberDao.checkPw(userId, userPw); } } | cs |
3. 모델(비지니스로직, DB연동)
MemberDAOImpl
아이디와 비밀번호가 일치하는지 비교하기 위해서 map에 저장
아이디와 비밀번호가 일치하여 tbl_member의 레코드가 1이면 true를 리턴
package com.example.spring01.member.model.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import org.apache.ibatis.session.SqlSession; import org.springframework.stereotype.Repository; import com.example.spring01.member.model.dto.MemberVO; // 현재 클래스를 DAO bean으로 등록시킴 @Repository public class MemberDAOImpl implements MemberDAO { // SqlSession 객체를 스프링에서 생성하여 주입시켜준다. // 의존관계 주입(Dependency Injection, DI) // 느스한 결함 // IoC(Inversion of Control, 제어의 역전) @Inject // Inject애노테이션이 없으면 sqlSession은 null상태이지만 // Inject애노테이션이 있으면 외부에서 객체를 주입시켜주게 된다. // try catch문, finally문, 객체를 close할 필요가 없어졌다. SqlSession sqlSession; // 01. 전체 회원 목록 조회 @Override public List<MemberVO> memberList() { return sqlSession.selectList("member.memberList"); } // 02. 회원 등록 @Override public void insertMember(MemberVO vo) { sqlSession.insert("member.insertMember", vo); } // 03. 회원 정보 상세 조회 @Override public MemberVO viewMember(String userId) { return sqlSession.selectOne("member.viewMember", userId); } // 04. 회원 정보 수정 처리 @Override public void deleteMember(String userId) { sqlSession.delete("member.deleteMember",userId); } // 05. 회원 정보 삭제 처리 @Override public void updateMember(MemberVO vo) { sqlSession.update("member.updateMember", vo); } // 06. 회원 정보 수정 및 삭제를 위한 비밀번호 체크 @Override public boolean checkPw(String userId, String userPw) { boolean result = false; Map<String, String> map = new HashMap<String, String>(); map.put("userId", userId); map.put("userPw", userPw); int count = sqlSession.selectOne("member.checkPw", map); if(count == 1) result= true; return result; } } | cs |
MemberMapper.xml
아이디와 비밀번호가 일치하는 레코드가 있는지 확인하는 쿼리 작성
select count(*) from 테이블 where 아이디 and 비밀번호
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 다른 mapper와 중복되지 않도록 네임스페이스 기재 --> <mapper namespace="member"> <!-- 01. 회원록록 --> <select id="memberList" resultType="com.example.spring01.member.model.dto.MemberVO"> SELECT user_id AS userId, user_name AS userName, user_email AS userEmail, user_regdate AS userRegdate FROM tbl_member ORDER BY userId </select> <!-- 02. 회원 등록 --> <insert id="insertMember"> INSERT INTO tbl_member (user_id, user_pw, user_name, user_email) VALUES (#{userId}, #{userPw}, #{userName}, #{userEmail}) </insert> <!-- 03. 회원정보 상세조회 --> <select id="viewMember" resultType="com.example.spring01.member.model.dto.MemberVO"> SELECT user_id AS userId, user_name AS userName, user_email AS userEmail, user_regdate AS userRegdate, user_regdate AS userUpdatedate FROM tbl_member WHERE user_id = #{userId} </select> <!-- 04. 회원정보 수정처리 --> <update id="updateMember"> UPDATE tbl_member SET user_pw = #{userPw}, user_name = #{userName}, user_email = #{userEmail}, user_updatedate = SYSDATE WHERE user_id = #{userId} </update> <!-- 05. 회원정보 삭제 처리 --> <delete id="deleteMember"> DELETE FROM tbl_member WHERE user_id = #{userId} </delete> <!-- 06. 비밀번호 체크 --> <select id="checkPw" resultType="int"> SELECT COUNT(*) FROM tbl_member WHERE user_id = #{userId} AND user_pw = #{userPw} </select> </mapper> | cs |
4. 뷰
member_view.jsp
수정버튼, 삭제버튼 클릭 이벤트 발생시 확인 대화상자를 띄우고 비밀번호가 일치하면 각각 요청 처리
비밀번호가 불일치 하면 div에 불일치 문구 출력
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>회원정보 상세 페이지</title> <%@ include file="../include/member_header.jsp" %> <script> $(document).ready(function(){ $("#btnUpdate").click(function(){ // 확인 대화상자 if(confirm("수정하시겠습니까?")){ document.form1.action = "${path}/member/update.do"; document.form1.submit(); } }); }); $(document).ready(function(){ $("#btnDelete").click(function(){ // 확인 대화상자 if(confirm("삭제하시겠습니까?")){ document.form1.action = "${path}/member/delete.do"; document.form1.submit(); } }); }); </script> </head> <body> <%@ include file="../include/member_menu.jsp" %> <h2>회원정보 상세</h2> <form name="form1" method="post"> <table border="1" width="400px"> <tr> <td>아이디</td> <!-- id는 수정이 불가능하도록 readonly속성 추가 --> <td><input name="userId" value="${dto.userId}" readonly="readonly"></td> </tr> <tr> <td>비밀번호</td> <td><input type="password" name="userPw"></td> </tr> <tr> <td>이름</td> <td><input name="userName" value="${dto.userName}"></td> </tr> <!-- 누락된 부분 --> <tr> <td>이메일주소</td> <td><input name="userEmail" value="${dto.userEmail}"></td> </tr> <!-- 누락된 부분 --> <tr> <td>회원가입일자</td> <td> <fmt:formatDate value="${dto.userRegdate}" pattern="yyyy-MM-dd HH:mm:ss"/> </td> </tr> <tr> <td>회원정보 수정일자</td> <td> <fmt:formatDate value="${dto.userUpdatedate}" pattern="yyyy-MM-dd HH:mm:ss"/> </td> </tr> <tr> <td colspan="2" align="center"> <input type="button" value="수정" id="btnUpdate"> <input type="button" value="삭제" id="btnDelete"> <div style="color: red;">${message}</div> </td> </tr> </table> </form> </body> </html> | cs |
5. 실행화면
수정버튼클릭 이벤트 확인대화상자
삭제버튼클릭 이벤트 확인대화상자
비밀번호 불일치 문구 출력
비밀번호 일치시 수정 처리
비밀번호 일치시 삭제 처리
댓글을 사용할 수 없습니다.