국비 83 - 비밀번호 변경(스프링)

냐아암·2023년 8월 16일
0

국비

목록 보기
96/114

<%@ 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>

Controller

// 비밀번호 변경
	@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;
	}

MyPageService

/** 비밀번호 변경 서비스
	 * @param currentPw
	 * @param newPw
	 * @param memberNo
	 * @return result
	 */
	int changePw(String currentPw, String newPw, int memberNo);

🔑 입력받은 비밀번호를 암호화해서 DAO 접근

MyPageServiceImpl

// 비밀번호 변경 서비스
	// @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;
			
	}
    

MyPageDAO

/** 회원 비밀번호 조회
	 * @param memberNo
	 * @return encPw
	 */
	public String selectEncPw(int memberNo) {
		
		return sqlSession.selectOne("myPageMapper.selectEncPw", memberNo);
	}
    

🔑 resultType --> string !! (마이바티스 별칭 숙지)

SQL

<!-- 회원 비밀번호 조회 -->
	<!-- 
		마이바티스 기본 별칭
		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>

DAO

/** 비밀번호 변경
	 * @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);
	}
    

SQL

<!-- 비밀번호 변경 -->
	<update id="changePw" parameterType="Member">
		UPDATE MEMBER SET MEMBER_PW = #{memberPw} WHERE MEMBER_NO = #{memberNo}
	</update>
profile
개발 일지

0개의 댓글