프로젝트에서 Email 전송과 해당 인증번호를 저장하는 방식에 대하여 고민하다가
Redis에 대해서 알게되었다.
프로젝트에 사용한 내용을 정리해보고자 한다
[ 참고 블로그 ]
https://wildeveloperetrain.tistory.com/21
Redis란? 레디스의 기본적인 개념 (인메모리 데이터 구조 저장소)
Redis란? Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)입니다. 데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리
wildeveloperetrain.tistory.com
https://bcp0109.tistory.com/328
Spring Boot 에서 Redis 사용하기
1. Overview Spring Boot 에서 spring-data-redis 라이브러리를 활용해서 Redis 를 사용하는 방법을 알아봅니다. Redis 에 대한 개념과 로컬 설치 방법은 Redis 설치 및 명령어 글을 확인해주세요. 2. Java 의 Redis Cl
bcp0109.tistory.com
1. Redis 란?
Redis란 무엇일까?
Redis는 Key, Value 구조로 이루어진 데이터베이스이다.
그리고 우리가 알고 있는 mySql, oracle, postgreSql과 같은 관계형 데이터베이스(RDBMS)가 아닌
NoSQL형 데이터베이스이다.
Redis는 그 중 Key-Value 기반으로 만들어진 데이터베이스이다.
[ RDBMS, NoSQL이란 무엇일까? ]
https://sangbok-diary.tistory.com/12
RDBMS, NoSql이란 무엇일까?
https://khj93.tistory.com/entry/Database-RDBMS%EC%99%80-NOSQL-%EC%B0%A8%EC%9D%B4%EC%A0%90 [Database] RDBMS와 NoSQL의 차이점 이번 포스팅에서는 RDBMS와 NoSQL의 차이점을 알아보려고 합니다. 그전에 RDBMS는 무엇이고 왜 사용
sangbok-diary.tistory.com
2. Redis에는 어떠한 데이터가 오게될까?
위에서 설명했듯 Key - Value로 이루어진 데이터베이스이다.
Key에는 기본적으로 String 형태의 자료형이 들어갑니다.
Value에는 다양한 데이터 타입을 입력할 수 있습니다.
3. 그렇다면 왜 Redis를 사용하는 것일까?
사실 Key - Value로 이루어진 자료형인 HashMap이 존재하는데 왜 Redis를 사용하는 것일까?
(1) HashMap은 어플리케이션이 종료되면 데이터가 다 없어져버린다
(2) 유효시간 설정이 가능하다
(3) 데이터의 일치성 보장이 가능하며, 데이터 처리 속도가 빠르다
(4) Redis에서는 정렬 기능을 제공한다
또한 관련 블로그 자료를 참고하면 좋다
https://chagokx2.tistory.com/99
Redis 성능 향상을 위한 Redis 세션 저장소와 캐시 저장소의 분리
Redis 성능 향상을 위한 Redis 세션 저장소와 캐시 저장소의 분리 Overview 현재까지 진행된 프로젝트 상황을 살펴보면 세션과 캐시를 Redis에서 관리하고 있다. 세션을 Redis에서 관리하는 이유 캐시를
chagokx2.tistory.com
4. Redis는 이메일 인증에 어떤 식으로 사용될까 ?
이메일 인증의 순서를 먼저 살펴보자
[ 인증 순서 ]
(1) 이메일 입력
(2) 인증 번호 생성
(3) key - 인증번호, value - 회원 이메일, 유효시간을 설정합니다
(3) 해당 생성 된 인증번호를 메일 전송
(4) 해당 인증 번호를 유저가 입력 시 인증번호 체크
(5) 입력한 이메일과 value가 일치하는지, 인증번호 유효시간이 유효한지
(6) 회원가입 성공
[ 인증 코드 로직 ]
(1) RedisUtil
@RequiredArgsConstructor
@Service
public class RedisUtil {
private final StringRedisTemplate template;
public String getData(String key) {
ValueOperations<String, String> valueOperations = template.opsForValue();
return valueOperations.get(key);
}
public boolean existData(String key) {
return Boolean.TRUE.equals(template.hasKey(key));
}
public void setDataExpire(String key, String value, long duration) {
ValueOperations<String, String> valueOperations = template.opsForValue();
Duration expireDuration = Duration.ofSeconds(duration);
valueOperations.set(key, value, expireDuration);
}
public void deleteData(String key) {
template.delete(key);
}
}
Redis와 소통할 클래스입니다.
getData에서는 key 값을 가지고 Redis에서 조회를 진행합니다
setDataExpire에서는 key, value, 유효시간을 가지고 Redis에 데이터를 입력합니다.
(2) EmailService
@Service
@RequiredArgsConstructor
@Slf4j
public class EmailService {
private final JavaMailSender mailSender;
private final RedisUtil redisUtil;
private static String code = "";
@Async
public void sendMail(String email) throws UnsupportedEncodingException, MessagingException {
sendRedis(email);
MimeMessage message = mailSender.createMimeMessage();
message.addRecipients(Message.RecipientType.TO, email);
message.setSubject("Qaru의 회원가입을 축하드립니다");
String text = "";
text+= "<div style='margin:100px;'>";
text+= "<div style='border:1px solid black; font-family:verdana';>";
text+= "<h3 style='color:blue;'>Qaru 회원가입 인증번호입니다.</h3>";
text+= "인증 번호는 3분간 유효합니다.";
text+= "<div style='font-size:130%'>";
text+= "인증번호 : " + code;
text+= "</div>";
message.setText(text, "utf-8", "html");
message.setFrom(new InternetAddress("tkdqhr6777@naver.com", "Qaru"));
mailSender.send(message);
}
public String sendRedis(String email) {
code = "";
try {
code = createCode();
// 60 * 3L = 3분
redisUtil.setDataExpire(code, email, 60 * 3L);
} catch (Exception e) {
e.printStackTrace();
}
return code;
}
private String createCode() {
String code = RandomStringUtils.randomNumeric(6);
boolean codeCheck = true;
while(codeCheck){
if(!StringUtils.hasText(redisUtil.getData(code))){
// 현재 해당 코드 등록되지 않은 경우
codeCheck = false;
}else{
// 코드 등록된 경우 새로운 난수 코드 발행
code = RandomStringUtils.randomNumeric(6);
}
}
return code;
}
}
sendEmail에서는 인증 메일을 만들어서 이메일을 전송합니다.
sendRedis에서는 생성된 코드와 입력받은 이메일을 기반으로 redis에 데이터를 저장합니다.
createCode에서는 무작위 숫자를 6자리 생성하고, 해당 key(코드) 값이 redis에서 존재 시 새로운 코드를 생성합니다.
(3) authNumCheck
public Boolean authNumCheck(UserAuthRequest request) {
String email = redisUtil.getData(request.getAuthNum());
if(!StringUtils.hasText(email)){
return false;
}
if(email.equals(request.getEmail())){
return true;
}else{
return false;
}
}
authNumCheck에서는 해당 인증번호로 redis에서 데이터를 조회합니다.
해당 인증 번호로 조회되는 데이터가 있는지, 인증 받은 이메일과 redis의 이메일이 일치하는지를 체크하여, 회원가입을 진행합니다.
5. 결론
Redis는 사용하기에 따라 굉장히 유용한 DB라는 걸 알게 되었습니다.
Key - Value로 무언가를 사용해야하는 경우, 사용하면 정렬기능도 사용이 가능하며, 빠른 속도도 보장 받을 수 있습니다.
또한 이메일 처럼 인증 번호의 유효시간을 설정하여 체크하여야하는 경우, 유효 시간으로 판단할 수 있습니다.
또한 JWT처럼 토큰 값과 유효시간으로 체크하는 경우데도 사용하기 좋은 DB 이기에 추후 다른 프로젝트에서도 활용해보면 좋을꺼같습니다
'Spring' 카테고리의 다른 글
DI란 무엇일까? (0) | 2024.01.22 |
---|---|
AOP란 무엇일까 ? (0) | 2024.01.22 |
Spring 로그인 / Session : JWT 차이점과 장단점 (0) | 2024.01.10 |
JPA N+1 문제가 생기는 이유와 해결 과정 대해서... (0) | 2024.01.09 |
배치와 스케줄링에 대하여... (2) | 2024.01.07 |