Skip to content

Commit

Permalink
feat: 인증 코드 sms 전송, 이메일 찾기 비즈니스 로직 수정(#28)
Browse files Browse the repository at this point in the history
redis에 인증 코드를 저장하던 방식에서 RDB에 저장하도록 수정
  • Loading branch information
Minjae-An committed Mar 27, 2024
1 parent 4bed3cd commit 3789e8f
Showing 1 changed file with 32 additions and 19 deletions.
51 changes: 32 additions & 19 deletions be/src/main/java/yeonba/be/login/service/LoginService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package yeonba.be.login.service;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
Expand All @@ -11,10 +13,12 @@
import yeonba.be.login.dto.request.UserPasswordInquiryRequest;
import yeonba.be.login.dto.request.UserPhoneNumberVerifyRequest;
import yeonba.be.login.dto.response.UserEmailInquiryResponse;
import yeonba.be.login.entity.VerificationCode;
import yeonba.be.login.repository.VerificationCodeCommand;
import yeonba.be.login.repository.VerificationCodeQuery;
import yeonba.be.user.entity.User;
import yeonba.be.user.repository.UserQuery;
import yeonba.be.util.EmailService;
import yeonba.be.util.RedisUtil;
import yeonba.be.util.SmsService;
import yeonba.be.util.TemporaryPasswordGenerator;
import yeonba.be.util.VerificationCodeGenerator;
Expand All @@ -30,18 +34,18 @@ public class LoginService {
private final String VERIFICATION_CODE_MESSAGE = "연바(연애는 바로 지금) 인증 코드 : %s";

private final UserQuery userQuery;
private final VerificationCodeCommand verificationCodeCommand;
private final VerificationCodeQuery verificationCodeQuery;

private final EmailService emailService;
private final SmsService smsService;

private final RedisUtil redisUtil;

/*
임시 비밀번호는 다음 과정을 거친다.
1. 요청 이메일 기반 사용자 조회
2. 임시 비밀번호 생성
3. 사용자 비밀번호, 임시 비밀번호로 변경
4. 임시 비밀번호 발급 메일 전송
임시 비밀번호는 다음 과정을 거친다.
1. 요청 이메일 기반 사용자 조회
2. 임시 비밀번호 생성
3. 사용자 비밀번호, 임시 비밀번호로 변경
4. 임시 비밀번호 발급 메일 전송
*/

// TODO : 비밀번호 암호화 로직 추가
Expand All @@ -61,40 +65,49 @@ public void sendTemporaryPasswordMail(UserPasswordInquiryRequest request) {
emailService.sendMail(email, TEMPORARY_PASSWORD_EMAIL_SUBJECT, text);
}

@Transactional(readOnly = true)
@Transactional
public void sendVerificationCodeMessage(UserPhoneNumberVerifyRequest request) {

// 전화 번호로 사용자 조회
String phoneNumber = request.getPhoneNumber();
if (!userQuery.isUserExist(phoneNumber)) {
throw new GeneralException(UserException.USER_NOT_FOUND);
}

// 인증 코드 재발급 요청시 기존 발급 내역 삭제
redisUtil.deleteData(phoneNumber);

// 인증 코드 생성 및 저장
String code = VerificationCodeGenerator.generateVerificationCode();
redisUtil.putData(phoneNumber, code, VERIFICATION_CODE_TTL);
LocalDateTime expiredAt = LocalDateTime.now()
.plus(VERIFICATION_CODE_TTL, ChronoUnit.MINUTES);
VerificationCode verificationCode = new VerificationCode(phoneNumber, code, expiredAt);
verificationCodeCommand.save(verificationCode);

// 인증 코드 sms 발송
String message = String.format(VERIFICATION_CODE_MESSAGE, code);
smsService.sendMessage(phoneNumber, message);
}

@Transactional(readOnly = true)
@Transactional
public UserEmailInquiryResponse findEmail(UserEmailInquiryRequest request) {

String phoneNumber = request.getPhoneNumber();
String verificationCode = request.getVerificationCode();
String code = request.getVerificationCode();

// 인증 코드 조회
String foundVerificationCode = (String) redisUtil.getData(phoneNumber)
.orElseThrow(() -> new GeneralException(LoginException.VERIFICATION_CODE_NOT_FOUND));
VerificationCode verificationCode = verificationCodeQuery.findBy(phoneNumber, code);

// 인증 코드 만료 여부 확인
if (verificationCode.isExpired(LocalDateTime.now())) {
throw new GeneralException(LoginException.EXPIRED_VERIFICATION_CODE);
}

// 인증 코드 일치 확인
if (!StringUtils.equals(foundVerificationCode, verificationCode)) {
if (!StringUtils.equals(code, verificationCode.getCode())) {
throw new GeneralException(LoginException.VERIFICATION_CODE_NOT_MATCH);
}

// 핸드폰 번호 기반 사용자 조회 및 인증 코드 내역 삭제
User user = userQuery.findByPhoneNumber(phoneNumber);
redisUtil.deleteData(phoneNumber);
verificationCodeCommand.delete(verificationCode);

return new UserEmailInquiryResponse(user.getEmail());
}
Expand Down

0 comments on commit 3789e8f

Please sign in to comment.