SPRING/PROJECT

[๊ตฌํ˜„] ์Šคํ”„๋ง์œผ๋กœ ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๋งํฌ ๋งŒ๋“ค๊ธฐ

ozllzL 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. ํ…Œ์ŠคํŠธ

์•ˆ๋…•์ด์˜ ๊ธฐ์กด ๋น„๋ฐ€๋ฒˆํ˜ธ
๋ฐ”๋€œ

์ƒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋กœ๊ทธ์ธ๋„ ์„ฑ๊ณต ์ด์ œ ๋~~!!