<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My Page</title>
<link rel="stylesheet" href="/resources/css/myPage/myPage-style.css">
</head>
<body>
<main>
<jsp:include page="/WEB-INF/views/common/header.jsp"/>
<!-- 마이페이지 - 내 정보 -->
<section class="myPage-content">
<!-- 사이드메뉴 include -->
<!-- jsp 액션 태그 -->
<jsp:include page="/WEB-INF/views/myPage/sideMenu.jsp"/>
<!-- 오른쪽 마이페이지 주요 내용 부분 -->
<section class="myPage-main">
<h1 class="myPage-title">비밀번호 변경</h1>
<span class="myPage-subject">현재 비밀번호가 일치하는 경우 새 비밀번호로 변경할 수 있습니다.</span>
<form action="changePw" method="POST" name="myPageFrm" id="changePwFrm">
<div class="myPage-row">
<label>현재 비밀번호</label>
<input type="password" name="currentPw" id="currentPw" maxlength="30" >
</div>
<div class="myPage-row">
<label>새 비밀번호</label>
<input type="password" name="newPw" id="newPw" maxlength="30">
</div>
<div class="myPage-row">
<label>새 비밀번호 확인</label>
<input type="password" name="newPwConfirm" id="newPwConfirm" maxlength="30">
</div>
<button class="myPage-submit">변경하기</button>
</form>
</section>
</section>
</main>
<jsp:include page="/WEB-INF/views/common/footer.jsp"/>
</body>
</html>
// 비밀번호 변경
@PostMapping("/changePw") // 매개변수랑 name 속성 값 같아서 어노테이션 생략
public String changePw(String currentPw, String newPw, @SessionAttribute("loginMember") Member loginMember
, RedirectAttributes ra) {
// 로그인한 회원 번호(DB에서 어떤 회원을 조회, 수정하는지 알아야 하니까)
int memberNo = loginMember.getMemberNo();
// 비밀번호 변경 service 호출
int result = service.changePw(currentPw, newPw, memberNo);
String path = "redirect:";
String message = null;
if(result>0) { // 성공
message = "비밀번호가 변경되었습니다.";
path +="info"; // 내정보
} else { // 실패
message = "현재 비밀번호가 일치하지 않습니다.";
path +="changePw"; // 비밀번호 변경 페이지
}
ra.addFlashAttribute("message", message);
return path;
}
/** 비밀번호 변경 서비스
* @param currentPw
* @param newPw
* @param memberNo
* @return result
*/
int changePw(String currentPw, String newPw, int memberNo);
🔑 입력받은 비밀번호를 암호화해서 DAO 접근
// 비밀번호 변경 서비스
// @Tracsactional // Unchecked Exception 발생 시 rollback
@Transactional(rollbackFor = {Exception.class})
// 모든 Exception 발생 시 rollback
@Override
public int changePw(String currentPw, String newPw, int memberNo) {
// 1. 현재 비밀번호, DB에 저장된 비밀번호 비교
// 1) 회원 번호가 일치하는 MEMBER 테이블의 MEMBER_PW 조회
String encPw = dao.selectEncPw(memberNo);
// 2) bcrypt.matches(평문, 암호문) -> 같으면 true -> 이때 비밀번호 수정
if(bcrypt.matches(currentPw, encPw)) {
// 2. 비밀번호 변경(UPDATE DAO 호출) -> 결과 반환
return dao.changePw(bcrypt.encode(newPw), memberNo);
}
// 3. 비밀번호가 일치하지 않으면 0 반환
return 0;
}
/** 회원 비밀번호 조회
* @param memberNo
* @return encPw
*/
public String selectEncPw(int memberNo) {
return sqlSession.selectOne("myPageMapper.selectEncPw", memberNo);
}
🔑 resultType --> string !! (마이바티스 별칭 숙지)
<!-- 회원 비밀번호 조회 -->
<!--
마이바티스 기본 별칭
java mybatis
int _int
Integer int
String string
-->
<!--
조회 결과가 1개인 경우(int, string 등)
또는 조회 결과를 모두 Map에 담는 경우
resultType 사용
(resultMap X)
-->
<select id="selectEncPw" parameterType="_int" resultType="string">
SELECT MEMBER_PW FROM MEMBER WHERE MEMBER_NO = #{memberNo}
</select>
/** 비밀번호 변경
* @param newPw
* @param memberNo
* @return result
*/
public int changePw(String newPw, int memberNo) {
// Mybatis에서 SQL 수행 시
// 전달할 수 있는 파라미터는 딱 하나
// -> 여러 파라미터를 전달해야 하는 경우
// Map 또는 DTO 로 묶어서 전달
Member member = new Member();
member.setMemberPw(newPw);
member.setMemberNo(memberNo);
return sqlSession.update("myPageMapper.changePw", member);
}
<!-- 비밀번호 변경 -->
<update id="changePw" parameterType="Member">
UPDATE MEMBER SET MEMBER_PW = #{memberPw} WHERE MEMBER_NO = #{memberNo}
</update>