마이 페이지 - 비밀번호 변경 기능 구현 (23.08.16)

·2023년 8월 16일
0

Spring

목록 보기
9/36
post-thumbnail

🌷 비밀번호 변경


👀 코드로 살펴보기

🌱 MyPageController.java

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

🌱 MyPageService.java

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

🌱 MyPageServiceImpl.java

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

🌱 MyPageDAO.java

...
	/** 회원 비밀번호 조회
	 * @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);
	}
...

🌱 MyPage-mapper.xml

...
	<!-- 비밀번호 조회 -->
	<!-- 
		마이바티스 기본 별칭
		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 창이 출력되며 비밀번호가 변경된다. 😉

profile
풀스택 개발자 기록집 📁

0개의 댓글