Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

KSI일기장

0428spring 마이페이지(2) 비밀번호변경(암호화) 본문

Spring

0428spring 마이페이지(2) 비밀번호변경(암호화)

MyDiaryYo 2023. 5. 3. 17:13

MyPageController

@Controller //bean으로 등록
@RequestMapping("/member/myPage")
@SessionAttributes({"loginMember"})	//session scope에서 loginMember를 얻어옴
public class MyPageController {

	@Autowired
	private MyPageService service;	//Service 연결

	//회원 정보 조회 이동
	@GetMapping("/info")
	public String info() {
		return "member/myPage-info";
		// WEB-INF/views/member/myPage-info
	}

	//비밀번호 변경 이동
	@GetMapping("/changePw")
	public String changePw() {
		return "member/myPage-changePw";
		// WEB-INF/views/member/myPage-info
	}

	
  //비밀번호 변경(암호화)
	@PostMapping("/changePw")
	public String changePw(@RequestParam Map<String, Object> paramMap,
							@ModelAttribute("loginMember") Member loginMember,
							RedirectAttributes ra) {

		//로그인된 회원의 번호를 paramMap에 추가
		paramMap.put("memberNo", loginMember.getMemberNo());

		//비밀번호 변경 서비스 호출
		int result = service.changePw(paramMap);


		String message = null;
		String path = null;

		if(result>0) {
			message = "비밀번호 변경 성공";
			path = "info";

		}else {
			message = "현재 비밀번호가 일치하지 않습니다";
			path = "changePw";
		}
		ra.addFlashAttribute("message", message);

		return "redirect:" + path;

	}

MyPageService

/**비밀번호 변경 서비스
	 * @param paramMap
	 * @return
	 */
	int changePw(Map<String, Object> paramMap);

MyPageServiceImpl

//비밀번호 변경
	@Override
	public int changePw(Map<String, Object> paramMap) {
		//bcrypt

		//1)DB에서 현재 회원의 비밀번호를 조회한다
		String encPw = dao.checkPw((int)paramMap.get("memberNo"));
							//->Map상태라서 int로 다운캐스팅

		//2)입력된 현재 비밀번호(평문)와 DB조회된 비밀번호(암호화) 비교(bcrypt.matches() 이용)

		//3)비교결과 일치하면 받아온 새로운 비밀번호 암호화해서 update구문 실행
		if(bcrypt.matches( (String)paramMap.get("currentPw"), encPw) ) {
						//Map상태라서 String으로 다운캐스팅

			paramMap.put("newPw", bcrypt.encode( (String)paramMap.get("newPw")) );

			return dao.updatePw(paramMap);
		}

		//비밀번호가 일치하지 않으면 0 반환
		return 0;
	}

MyPageDAO

/**비밀번호 변경 DAO
	 * @param paramMap
	 * @return
	 */
	public int updatePw(Map<String, Object> paramMap) {
		return sqlSession.update("myPageMapper.updatePw", paramMap);
	}
    
    /**현재 로그인한 회원 비밀번호 조회 DAO
	 * @param memberNo
	 * @return
	 */
	public String checkPw(int memberNo) {

		return sqlSession.selectOne("myPageMapper.checkPw", memberNo);
	}

mypage-mapper.xml

<!-- 비밀번호 비교를 위한 비밀번호 조회 -->
  	<select id="checkPw" resultType="string">
  		SELECT MEMBER_PW FROM MEMBER_S
  		WHERE MEMBER_NO = ${memberNo}
  	</select>
  	
  	<!-- 비밀번호 변경 -->
  	<update id="updatePw">
  		UPDATE MEMBER_S SET
		MEMBER_PW = #{newPw}
		WHERE MEMBER_NO = ${memberNo};
  	</update>

-> resultType을 쓰고 안쓰고의 차이는 insert, update문은 넘겨주는 result값이 0,1로 int이므로 resultType기본값이 int여서 안적어줘도 되고, 

 select문은 string으로 적어줘야 한다