-
[๊ตฌํ] ์คํ๋ง์ผ๋ก ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๋งํฌ ๋ง๋ค๊ธฐSPRING/PROJECT 2021. 12. 12. 22:42
๊ณต๋ถํ๋ฉด์ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ํ๋ฆฐ ๋ถ๋ถ์ด๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค!
๊ตฌํ ํ ๋ด์ฉ
- ๋น๋ฐ๋ฒํธ๋ฅผ ์ฐพ๊ณ ์ ํ๋ ์ด๋ฉ์ผ์ ์ ๋ ฅ๋ฐ๋๋ค.
- ์ด๋ฉ์ผ๊ณผ ๊ณ ์ ์ฝ๋๋ฅผ ์ ์ฅํ๋ค.
- ๊ณ ์ ์ฝ๋๋ก ๋งํฌ๋ฅผ ๋ง๋ ๋ค.
- ๋ฉ์ผ๋ก ๋งํฌ๋ฅผ ์ ์กํ๋ค.
- ํด๋น ๋งํฌ๋ก ์ ์ํ๋ค(ํ๋ก ํธ์ ์ฐ๊ฒฐํ ๋ ํฉ์๊ฐ ํ์ํ ๊ฒ ๊ฐ์ ์ฝ๊ฐ ๋ฏธ์์ฑ)
- ํด๋น ๊ณ ์ ์ฝ๋์ ๋ง๋ ์ด๋ฉ์ผ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฌ์ค์ ํ ์ ์๋ค.
- ๋ฐ์ ๋น๋ฐ๋ฒํธ๋ก ํด๋น ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฐ๊ฟ์ค๋ค.
- ์ฝ๋/์ด๋ฉ์ผ ์ ์ฅํด ๋จ๋ ๊ฒ์ ์ญ์ ํ๋ค;
1. ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๋งํฌ ์ ์ก ์ปจํธ๋กค๋ฌ
@GetMapping(value = "/user/password/find") public ResponseEntity<HashMap> findPasswordUrl(@RequestBody VerifyCodeDto codeDto) { VerifyCode verifyCode = verifyCodeService.saveCode(codeDto); boolean success = mailService.changePassword(verifyCode); HashMap<String, Object> responseMap = new HashMap<>(); if (success) { responseMap.put("status", 200); responseMap.put("message", "๋ฉ์ผ ๋ฐ์ก ์ฑ๊ณต"); responseMap.put("code", verifyCode.getCode()); return new ResponseEntity<HashMap>(responseMap, HttpStatus.OK); } else { responseMap.put("status", 500); responseMap.put("message", "๋ฉ์ผ ๋ฐ์ก ์คํจ"); return new ResponseEntity<HashMap>(responseMap, HttpStatus.INTERNAL_SERVER_ERROR); } }
(์ด๋ฉ์ผ๋ง ๋ค์ด์๋) codeDto๋ฅผ ์ ์ฅํด ๊ณ ์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ ์ฅํ๋ค.
๋ฉ์ผ๋ก ๋ณด๋ธ๋ค.
2. VerifyCodeService/ VerifyCodeRepository
https://dowlsovo.tistory.com/88 ์ด ๊ธ 5,6๋ฒ์ ๋์์๋ค.
[๊ตฌํ] ์ด๋ฉ์ผ ์ธ์ฆ ์ฝ๋ ๋ณด๋ด๊ธฐ
๊ณต๋ถํ๋ฉด์ ๋ง๋ค์๊ธฐ ๋๋ฌธ์ ํ๋ฆฐ ๋ถ๋ถ์ด๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค! ๊ตฌํ ํ ๋ด์ฉ 1) ๋ฉ์ผ ์ธ์ฆ ์ฝ๋๋ฅผ ๋ง๋ ๋ค. ํด๋น ๋ฉ์ผ๋ก ์ธ์ฆ ์ฝ๋๋ฅผ ๋ณด๋ธ๋ค. 2) ๋ฉ์ผ๋ก ์จ ์ธ์ฆ ์ฝ๋๋ฅผ ์ ๋ ฅํ๋ค.
dowlsovo.tistory.com
3. MailService
/* 2021-11-01 ๊น์์ง*/ @Service @RequiredArgsConstructor public class MailService { private final JavaMailSender javaMailSender; private final PasswordEncoder passwordEncoder; ... public boolean changePassword(VerifyCode verifyCode){ if(verifyCode.getCode() == null) return false; SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); simpleMailMessage.setTo(verifyCode.getEmail()); simpleMailMessage.setSubject("Captured-Moment ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๋งํฌ"); simpleMailMessage.setText("http://localhost:8080/user/password/" + verifyCode.getCode() + "\n" + "์ ๋งํฌ์์ ์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ง๋์ธ์"); javaMailSender.send(simpleMailMessage); return true; } }
๋ฐ์ ์ฌ๋, ๋ฉ์ผ ์ ๋ชฉ, ๋งํฌ๋ฅผ ๋ฃ์(๋งํฌ๋ ์์ ํด์ผ ํ๋๋ฐ ์ผ๋จ localhost๋ก ํด๋์ ๊ฒ) ๋ณด๋ผ ๋ด์ฉ์ ์ค์ ํ๊ณ ๋ฉ์ผ์ ๋ณด๋ธ๋ค.
4. ํ ์คํธ
๋ฉ์ผ๋์ฐฉ~~ 5. ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ํ๋ ์ปจํธ๋กค๋ฌ
@PostMapping(value = "/user/password/{code}") public ResponseEntity<HashMap> changePassword(@RequestBody UserRequestDto.PasswordDto requestDto, @PathVariable String code){ VerifyCode verifyCode = verifyCodeService.findByCode(code); HashMap<String, Object> responseMap = new HashMap<>(); if(verifyCode == null){ responseMap.put("status", 401); responseMap.put("message", "๋ง๋ฃ๋์๊ฑฐ๋ ์๋ชป๋ ๋งํฌ"); return new ResponseEntity<HashMap>(responseMap, HttpStatus.CONFLICT); } userService.updatePassword(verifyCode.getEmail(), requestDto); if(true) { verifyCodeService.deleteByEmail(verifyCode.getEmail()); responseMap.put("status", 200); responseMap.put("message", "๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ์ฑ๊ณต"); return new ResponseEntity<HashMap> (responseMap, HttpStatus.OK); } else{ responseMap.put("status", 500); responseMap.put("message", "๋น๋ฐ๋ฒํธ ๋ณ๊ฒฝ ์คํจ"); return new ResponseEntity<HashMap> (responseMap, HttpStatus.INTERNAL_SERVER_ERROR); } }
ํด๋น ์ฝ๋๋ฅผ ๊ฐ์ง VerifyCode๋ฅผ ์ฐพ์
๋ฐ์ Password๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฐ๊ฟ์ค๋ค.
6. UserRequestDto.PasswordDto
password๋ง ๋ฐ์ ์ ์๋ ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
@Getter @Setter public static class PasswordDto{ @ApiParam(value = "ํ์ ํจ์ค์๋", required = true) @ApiModelProperty(example = "ํจ์ค์๋") private String pw; }
7. VerifyCodeService
@Service @Transactional @AllArgsConstructor public class VerifyCodeService { private final VerifyCodeRepository repository; .... public VerifyCode findByCode(String code){ VerifyCode verifyCode = repository.findByCode(code); if(verifyCode != null) repository.deleteByEmail(verifyCode.getEmail()); return verifyCode; } }
๊ทธ๋ฅ ๊ฐ๋จํ ์ฝ๋์ ํด๋นํ๋ VerifyCode๋ฅผ ์ฐพ์์ ๋ฆฌํดํ๋ ๋ฉ์๋๋ค.
8. UserSevice
@Transactional @RequiredArgsConstructor public class UserServiceImpl implements UserService { private final UserRepository userRepository; private final PasswordEncoder passwordEncoder; // ํจ์ค์๋ ์ธ์ฝ๋ private final ImageUploadService imageUploadService; ... public String updatePassword(String email, UserRequestDto.PasswordDto requestDto){ User user = userRepository.findByEmail(email).orElseGet(() -> null ); requestDto.setPw(passwordEncoder.encode(requestDto.getPw())); user.updatePwd(requestDto); return email; } }
email์ ๋ง๋ user ์ ๋ณด๋ฅผ ๊บผ๋ด์์
์ธ์ฝ๋ฉํ ์๋ก์ด ๋น๋ฐ๋ฒํธ๊ฐ ๋ค์ด์๋ PasswordDto๋ก update๋ฅผ ํด์ฃผ๋ ์ฝ๋์ด๋ค.
... public class User extends Timestamped implements UserDetails { ... public void updatePwd(UserRequestDto.PasswordDto requestDto){ this.pw = requestDto.getPw(); } }
์ ๋ฐ์ดํธ ์ฝ๋์ด๋ค.
9. ํ ์คํธ
์๋ ์ด์ ๊ธฐ์กด ๋น๋ฐ๋ฒํธ ๋ฐ๋ ์ ๋น๋ฐ๋ฒํธ๋ก ๋ก๊ทธ์ธ๋ ์ฑ๊ณต ์ด์ ๋~~!!
'SPRING > PROJECT' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ตฌํ] Spring์์ Firebase ํธ์์๋ฆผ ๊ตฌํํ๊ธฐ (0) 2023.09.26 [๊ตฌํ] Spring์์ ์นด์นด์คํก ๋ก๊ทธ์ธ (0) 2023.09.25 [๊ตฌํ] Spring์์ ์๋ฌ๋ฅผ ๋ด๋ 3๊ฐ์ง ๋ฐฉ๋ฒ (2) 2023.04.02 [๊ตฌํ] ์คํ๋ง์ผ๋ก ์ด๋ฉ์ผ ์ธ์ฆ ์ฝ๋ ๋ฐ๊ธ, ์ธ์ฆํ๊ธฐ (0) 2021.12.12 [๋ฐฐํฌ] ์คํ๋ง ํ๋ก์ ํธ EC2๋ก AWS์ ๋ฐฐํฌํ๊ธฐ + RDS ๋ง๋ค๊ธฐ (0) 2021.12.09