1. 개요
다음 코드는 구구모 프로젝트에서 팀원 분이 구현한 메일 전송 코드의 일부를 발췌한 것이다.
//mail을 어디서 보내는지, 어디로 보내는지 , 인증 번호를 html 형식으로 어떻게 보내는지 작성합니다.
public String joinEmail(String email) {
makeRandomNumber();
String setFrom = //송신 이메일
String title = "gugumo 회원가입 인증번호"; // 이메일 제목
String content =
"나의 APP을 방문해주셔서 감사합니다." + //html 형식으로 작성 !
"<br><br>" +
"인증 번호는 " + authNumber + "입니다." +
"<br>"
;
mailSend(setFrom, email, title, content);
return Integer.toString(authNumber);
}
//이메일을 전송합니다.
public void mailSend(String setFrom, String toMail, String title, String content) {
MimeMessage message = mailSender.createMimeMessage();//JavaMailSender 객체를 사용하여 MimeMessage 객체를 생성
try {
MimeMessageHelper helper = new MimeMessageHelper(message,true,"utf-8");//이메일 메시지와 관련된 설정을 수행합니다.
// true를 전달하여 multipart 형식의 메시지를 지원하고, "utf-8"을 전달하여 문자 인코딩을 설정
helper.setFrom(setFrom);//이메일의 발신자 주소 설정
helper.setTo(toMail);//이메일의 수신자 주소 설정
helper.setSubject(title);//이메일의 제목을 설정
helper.setText(content,true);//이메일의 내용 설정 두 번째 매개 변수에 true를 설정하여 html 설정으로한다.
mailSender.send(message);
} catch (MessagingException e) {//이메일 서버에 연결할 수 없거나, 잘못된 이메일 주소를 사용하거나, 인증 오류가 발생하는 등 오류
// 이러한 경우 MessagingException이 발생
// e.printStackTrace();//e.printStackTrace()는 예외를 기본 오류 스트림에 출력하는 메서드
log.info("메일 전송 에러 발생");
}
redisUtil.setDataExpire(Integer.toString(authNumber), toMail, 60*5L);
}
}
위의 로직은 회원가입 시 5분의 유효기간을 가지는 6자리 코드를 사용자에게 전송하는 로직이다. 이메일 전송 마지막 줄에 5분의 유효 기간을 두고 인증번호와 사용자의 이메일을 저장한다.
이는 db로도 가능할 거 같은데 이를 사용한 당위성을 찾으면서 redis에 대해 간단히 알아보고자 한다.
2. Redis란?

Redis는 REmote DIctionary Server의 약자로, key-value 구조의 비정형 데이터를 저장하고 관리하기 위한 NoSQL이다.
Redis는 다음의 특징을 가지고 많은 개발자들이 사용하고 있다.
- In-memory로 데이터를 넣고 관리하므로 빠른 속도를 기대할 수 있다.
- 다양한 데이터 구조를 지원하여 문자열이 아닌 다른 다양한 타입의 데이터를 다룰 수 있다.
- 클러스터 기능을 제공하여 저장 공간을 확장할 수 있다.
- 백업 기능을 제공하여 주 저장소로도 사용할 수 있다.
3. 사용처?
위의 특징을 기반으로 Redis는 주로 다음의 용도로 사용된다.
- 세션 캐싱 및 토큰 저장
- pub-sub을 이용한 메시지 브로커
- 최근 검색 목록 표시
- 일일 방문자 수
- 랭킹 시스템
4. 프로젝트에서의 적용?
개요의 코드에서는 인증 코드를 받은 사용자 식별, 작은 TTL 등으로 redis를 사용하여 주 저장소를 쓸데없이 사용하지 않음으로써 조금 더 나은 성능을 기대해볼 수 있다. 그렇다면 이 외에도 구구모 프로젝트에서 이 기술을 어디에 사용할 수 있을까?
- FCM 토큰 관리
파이어베이스 토큰은 로그인 시 마다 저장 및 갱신되고, 로그아웃 시 이 토큰이 만료될 필요가 있다. 또, redis를 사용하면 주 저장소에 가해지는 부하를 줄일 수 있다.
2. JWT 관리
1번의 경우와 마찬가지이다.
https://sol-devlog.tistory.com/22
Redis를 통한 JWT Refresh Token 관리
Spring Security와 JWT 그리고 Redis를 통한 Access Token 재발급 2024.05.18 글이 새로 업데이트 되었습니다. 저장소 Playground/spring-security-jwt at main · solchan98/Playground🛝 개발 공부 놀이터 🛝. Contribute to so
sol-devlog.tistory.com
이 글을 참고해 Refresh Token의 개념을 도입하여 더 잘 관리할 수 있다는 생각이 들었다.
3. 최근 검색 목록
구구모는 작게 보면 게시판 프로젝트이다. 검색 기능은 이미 구현되어 있는 상태이고, 굳이 검색 히스토리를 무거운 주 저장소에 보낼 필요가 없다. 추후 이를 구현하기로 하면 Redis를 십분 활용할 수 있을 것 같다.