푸들푸들

1220 비밀번호 변경 본문

구디아카데미/JAVA

1220 비밀번호 변경

COCO_develop 2024. 12. 20. 10:21

resultType

* insert, update, delete -> vo

* select -> Map

 

비밀번호 변경

변경 전 pw가 일치하면 변경 진행

@Mapper
public interface MemberMapper {
	int insertPrepw(Member member);
	int updateMemberPw(Map<String, Object> paramMap);
}
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.app.mapper.MemberMapper">
	<!-- 1) pw 수정 -->
	<update id="updateMemberPw" parameterType="map">
		UPDATE member
		SET pw =#{newPw}
		WHERE id = #{member.id} AND pw = #{member.pw}		
	</update>
	
	<!-- 2) 1)의 반환값이 1이면 이전 pw를 prepw테이블에 백업 -->
	<insert id="insertPrepw" parameterType="com.example.app.vo.Member">
		INSERT INTO prepw(
			id, pw
		) VALUES (
		 	#{id}, #{pw}
		)
	</insert>
</mapper>
@Service
@Transactional
public class MemberService {
	public void modifyMemberPw(Member member, String newPw) {
		// member.getPw() -> 인코딩
		member.setPw(SHA256Util.encoding(member.getPw()));
		// newPw -> 인코딩
		newPw = SHA256Util.encoding(newPw);
		
		// 수정
		Map<String,Object> paramMap = new HashMap<>();
		paramMap.put("member",member);
		paramMap.put("newPw",newPw);
		int updateRow = memberMapper.updateMemberPw(paramMap);
		
		// 수정에 성공하면 이전 pw 백업
		if(updateRow == 1) {
			int insertRow = memberMapper.insertMember(member);
			if(insertRow == 0) {
				throw new RuntimeException("prepw테이블에 입력 실패");
			}
		}
	}
}

--> 이전 pw가 계속 쌓임 -> 매달 1일 0시에 prepw에 한 id당 5개이하 행만 남기고 삭제 (scheduler)

 

 

비밀번호 분실

시스템이 새로운 pw로 변경 후 고객 메일로 발송

@Mapper
public interface MemberMapper {
	int updateMemberPwBySys(Member member);
}
<!-- System이 pw 강제 수정 -->
<update id="updateMemberPwBySys" parameterType="com.example.app.vo.Member">
    UPDATE member
    SET pw =#{Pw}
    WHERE id = #{id} AND mail = #{mail}
</update>
@Service
@Transactional
public class MemberService {
	@Autowired MemberMapper memberMapper;
	@Autowired JavaMailSender javaMailSender;
	
	public void sendMailNewPw(Member member) {
		// 시스템이 새로운 pw로 변경 후 메일로 발송
		String changePw = UUID.randomUUID().toString().replace("-", "").substring(0,4);
		member.setPw(SHA256Util.encoding(changePw));
		int row = memberMapper.updateMemberPwBySys(member);
		if(row == 1) { // 변경된 pw를 메일로 전송
			SimpleMailMessage mailMsg = new SimpleMailMessage();
			mailMsg.setFrom("관리자 메일 주소");
			mailMsg.setTo(member.getMail());
			mailMsg.setSubject("변경된 pw입니다");
			mailMsg.setText("변경된 pw: "+changePw);
			
			javaMailSender.send(mailMsg);
		}
	}
}