Spring - 게시판구현(마이페이지/비밀번호변경, 회원 탈퇴)

Hyunny ·2023년 8월 16일
0

SPRING

목록 보기
6/14
post-thumbnail

🤍📝 비밀번호 변경

🔎 MyPageController
// 비밀번호 변경 
	@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;
		
	}
    
    
  🔎 MyPageServiceImpl
  // 비밀번호 변경 서비스 
	// @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
 /** 비밀번호 변경
	 * @param encode
	 * @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
<!-- 비밀번호 변경 -->
<!-- Member : 사용자 지정 별칭 (mybatis-config.xml) -->
<update id="changePw" parameterType="Member">
		UPDATE MEMBER SET 
		MEMBER_PW = #{memberPw}
		WHERE MEMBER_NO = #{memberNo}
</update>

 🔎 myPage.js
// 비밀번호 변경 제출 시 
const currentPw = document.getElementById("currentPw");
const newPw = document.getElementById("newPw");
const newPwConfirm = document.getElementById("newPwConfirm");
const changePwFrm = document.getElementById("changePwFrm");  // 비밀번호 변경 폼

// 비밀번호 변경 페이지 인 경우 
if(changePwFrm!=null){

    changePwFrm.addEventListener("submit", e=>{

        // 현재 비밀번호 미작성 시 
        if(currentPw.value.trim().length == 0){

        alert("비밀번호를 작성해주세요");
        e.preventDefault();
        currentPw.focus();
        currentPw.value="";
        return;
        }

        // 비밀번호 유효성 검사
        const regEX = /^[A-Za-z\d\-\_\#\@\!]{6,20}$/;

        if(!regEX.test(newPw.value)){
            alert("비밀번호가 유효하지 않습니다.");
            e.preventDefault();
            newPw.focus();
            return;
        }

        // 비밀번호 == 비밀번호 확인
        if(newPw.value != newPwConfirm.value){
            alert("비밀번호가 일치하지 않습니다");
            e.preventDefault();
            newPwConfirm.focus();
            return;
        }
    })
}

🤍📝 회원 탈퇴

🔎 MyPageController
@PostMapping("/secession")
	public String secession(String memberPw
							,@SessionAttribute("loginMember") Member loginMember
							,RedirectAttributes ra
							,SessionStatus status
							,HttpServletResponse resp) {
		
		// HttpServletResponse resp : 서버 -> 클라이언트 응답하는 방법 제공 객체 
		// RedirectAttributes ra : 리다이렉트 시 request로 값 전달하는 객체 
		
		// 1. 로그인한 회원의 회원 번호 얻어오기 
		int memberNo = loginMember.getMemberNo();

		// 2. 회원 탈퇴 서비스 호출 
		// - 비밀번호가 일치하면 MEMBER_DEL_FL -> 'Y'로 바꾸고 1 반환
		// - 비밀번호가 일치하지 않으면 -> 0 반환
		int result = service.secession(memberPw, memberNo);
		
		String path = "redirect:";
		String message = null;

		
		// 3. 탈퇴 성공 시 
		// - 로그아웃
		// - message : 탈퇴 되었습니다.
		// - 메인 페이지로 리다이렉트 
		// + 쿠키 삭제 
		if( result > 0 ) {
			
			message = "탈퇴 되었습니다.";
			path += "/";
			
			status.setComplete();  // 로그아웃
			
			// + 쿠키 삭제 
			Cookie cookie = new Cookie("saveId", "");
			// 같은 쿠키가 이미 존재하면 덮어쓰기 된다.
			
			cookie.setMaxAge(0); // 0초 생존 -> 삭제 
			cookie.setPath("/"); // 요청시 쿠키가 첨부되는 경로
			resp.addCookie(cookie); // 요청 객체를 통해서 클라이언트에게 전달
									// -> 클라이언트 컴퓨터에 파일로 생성
			
		}else {
			// 4. 탈퇴 실패 시 
			// - message : 현재 비밀번호가 일치하지 않습니다.
			// - 회원 탈퇴 페이지로 리다이렉트 
			
			message = "현재 비밀번호가 일치하지 않습니다.";
			path += "secession";
		}
		
		ra.addFlashAttribute("message", message);
		
		return path;
	}
    
  🔎 MyPageServiceImpl
	@Transactional(rollbackFor = {Exception.class} )
	@Override
	public int secession(String memberPw, int memberNo) {
		
		// 1. 회원 번호가 일치하는 회원의 비밀번호 조회
		String encPW = dao.selectEncPw(memberNo);
		
		if(bcrypt.matches(memberPw, encPW)) {
			
			return dao.secession(memberNo);
		}
		return 0;
	}
  
  🔎 MyPageDAO
  	/** 회원 탈퇴 dao
	 * @param memberNo
	 * @return result
	 */
	public int secession(int memberNo) {
		// sqlSessionTemplate : 마이바티스 + DBCP + close자동 + 트랜잭션처리 
		return sqlSession.update("myPageMapper.secession", memberNo);
	}
    
  🔎 myPage-mapper.xml
	 <!-- 회원 탈퇴 -->
	 <update id="secession" parameterType="_int">
		UPDATE MEMBER SET MEMBER_DEL_FL ='Y'
		WHERE MEMBER_NO = #{memberNo}
	 </update>

 


  
profile
개발 learning ... 📝

0개의 댓글