...
// 비밀번호 변경
@PostMapping("/changePw")
public String changePw(String currentPw, String newPw
, @SessionAttribute("loginMember") Member loginMember
, RedirectAttributes ra) {
// 로그인한 회원 번호(DB에서 어떤 회원을 조회, 수정하는지 알아야 되니까)
int memberNo = loginMember.getMemberNo();
// 비밀번호 변경 서비스 호출
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);
...
...
// 비밀번호 변경 서비스
// @Transactional // 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);
}
/** 비밀번호 변경
* @param newPw
* @param memberNo
* @return result
*/
public int changePw(String newPw, int memberNo) {
// Mybatis에서 SQL 수행 시
// 전달할 수 있는 파라미터는 딱 하나!
// -> 여러 파라미터를 전달해야 하는 경우
// Map 또는 DTO로 묶어서 전달
Member member = new Member();
member.setMemberNo(memberNo);
member.setMemberPw(newPw);
return sqlSession.update("myPageMapper.changePw", member);
}
...
...
<!-- 비밀번호 조회 -->
<!--
마이바티스 기본 별칭
java mybatis
int _int
Integer int
String string
-->
<!-- 조회 결과가 1개인 경우(int, string 등)
또는 조회 결과를 모두 Map에 담는 경우
resultType을 사용
-->
<select id="selectEncPw" parameterType="_int" resultType="string">
SELECT MEMBER_PW FROM MEMBER WHERE MEMBER_NO = #{memberNo}
</select>
<!-- 비밀번호 변경 -->
<!-- Member : 사용자 지정 별칭 (mybatis-config.xml) -->
<update id="changePw" parameterType="Member">
UPDATE MEMBER SET
MEMBER_PW = #{memberPw}
WHERE MEMBER_NO = #{memberNo}
</update>
...
현재 비밀번호가 DB에 저장된 로그인 회원의 비밀번호와 일치하면 1단계 통과!
새 비밀번호가 유효성 검사를 통과하면 2단계 통과!
마지막으로 새 비밀번호와 새 비밀번호 확인이 일치하면 최종 3단계까지 통과이다.
이 조건을 모두 충족했을 경우 '변경하기' 버튼을 클릭하면
위와 같은 alert 창이 출력되며 비밀번호가 변경된다. 😉