본문 바로가기

Redis

Hello, Redis

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 로고

Redis는 REmote DIctionary Server의 약자로, key-value 구조의 비정형 데이터를 저장하고 관리하기 위한 NoSQL이다. 

Redis는 다음의 특징을 가지고 많은 개발자들이 사용하고 있다.

  • In-memory로 데이터를 넣고 관리하므로 빠른 속도를 기대할 수 있다.
  • 다양한 데이터 구조를 지원하여 문자열이 아닌 다른 다양한 타입의 데이터를 다룰 수 있다.
  • 클러스터 기능을 제공하여 저장 공간을 확장할 수 있다.
  • 백업 기능을 제공하여 주 저장소로도 사용할 수 있다.

3. 사용처?

위의 특징을 기반으로 Redis는 주로 다음의 용도로 사용된다.

  • 세션 캐싱 및 토큰 저장
  • pub-sub을 이용한 메시지 브로커
  • 최근 검색 목록 표시
  • 일일 방문자 수
  • 랭킹 시스템

4. 프로젝트에서의 적용?

개요의 코드에서는 인증 코드를 받은 사용자 식별, 작은 TTL 등으로 redis를 사용하여 주 저장소를 쓸데없이 사용하지 않음으로써 조금 더 나은 성능을 기대해볼 수 있다. 그렇다면 이 외에도 구구모 프로젝트에서 이 기술을 어디에 사용할 수 있을까?

  1. 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를 십분 활용할 수 있을 것 같다.

 

'Redis' 카테고리의 다른 글

Redis 기초  (5) 2024.07.25