이메일 인증을 위한 Redis 설정과 문제 해결 과정

2024. 12. 7. 17:51·Backend Programming

이메일 인증을 위한 Redis 도입 배경

회원가입 시 이메일 인증은 보안성과 신뢰성을 높이기 위한 중요한 과정입니다. 이를 구현하면서 "이메일 인증 정보는 오래 저장할 필요가 없으니, 영구 저장소가 아닌 일시적인 데이터를 저장할 수 있는 시스템을 선택하는 게 맞겠다"는 판단을 내렸습니다.
이 과정에서 적합한 데이터베이스를 조사하던 중 Redis를 알게 되었고, 다음과 같은 이유로 선택하게 되었습니다.

  • Key-Value 형태의 NoSQL 데이터베이스: 복잡한 관계형 데이터를 다룰 필요가 없었기 때문입니다.
  • 일시적인 데이터 저장: 이메일 인증번호와 같은 데이터는 짧은 시간 동안만 유지되므로, Redis의 TTL(Time-To-Live) 기능이 적합했습니다.

 

Redis를 사용하며 겪은 시행착오와 해결 과정

시행착오와 문제 분석

처음 Redis를 설정했을 때, Redis와 통신하려는 시도에서 다음과 같은 오류가 발생했습니다.

java.net.UnknownHostException: redis: nodename nor servname provided, or not known

 

docker-compose.yml과 application.yml에 Redis의 호스트와 포트를 정확히 설정했음에도 UnknownHostException이 발생했습니다. 네트워크 설정이 올바르게 되어 있는지 확인하고, EC2의 보안 그룹은 컨테이너 간 내부 네트워크 통신에는 영향을 미치지 않으므로 인바운드 규칙 설정 문제는 아니었습니다.

 

이를 해결하기 위해 구글링하며 Redis 연결에 필요한 요소들을 점검했으나 해결방안에는 문제가 없어보였고, 근본부터 구현이 문제인 것같다고 생각되어 구현에 대한 것을 검색했고 제 코드와 다른 점을 비교했습니다. 결국 다른 코드에서 LettuceConnectionFactory와 RedisConfig 클래스를 추가한 것을 발견했습니다.

 

RedisConfig 클래스의 도입

Spring Boot는 기본적으로 Redis와 통신하기 위한 Bean을 자동으로 생성하지 않으므로, Redis 연결을 위한 설정을 명시적으로 추가해야 합니다. 예를 들어, Redis와의 연결을 관리하는 RedisConnectionFactory나, 데이터를 저장하고 가져오기 위한 RedisTemplate과 같은 Bean이 등록되지 않은 상태에서는 Redis와의 통신이 불가능합니다.

 

RedisConfig 코드

문제를 해결하기 위해 아래와 같은 RedisConfig 클래스를 작성했습니다.

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@RequiredArgsConstructor
@Configuration
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(host, port);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

 

위 코드는 다음과 같은 역할을 합니다.

  1. LettuceConnectionFactory: Redis 서버의 호스트와 포트 정보를 기반으로 연결을 생성합니다.
  2. RedisTemplate: Redis와 데이터를 직렬화/역직렬화하며, key-value 형태로 데이터를 저장하거나 불러오도록 도와줍니다.
  3. StringRedisSerializer: Redis에 저장되는 key와 value를 String 형태로 직렬화/역직렬화합니다.

 

마무리

Redis는 이메일 인증과 같은 일시적인 데이터를 저장하기에 매우 적합한 솔루션임을 확인했습니다. 특히, RedisTemplate과 LettuceConnectionFactory를 통해 Redis와의 연결 및 데이터를 제어할 수 있었습니다.
이번 경험을 통해 Redis와 Spring의 통합 과정에서 발생할 수 있는 문제를 깊이 이해할 수 있었고, 올바른 설정의 중요성을 다시 한번 깨닫게 되었습니다.

 

저작자표시 (새창열림)

'Backend Programming' 카테고리의 다른 글

CI/CD? 배포 자동화를 해보자  (0) 2024.12.13
EC2를 활용한 HTTPS 및 도메인 설정  (3) 2024.12.12
라우팅과 라우팅 테이블의 이해  (0) 2024.11.28
JPA 영속성 컨텍스트  (3) 2024.11.01
빈은 어떻게 관리되어서 응답을 하는가?  (1) 2024.10.20
'Backend Programming' 카테고리의 다른 글
  • CI/CD? 배포 자동화를 해보자
  • EC2를 활용한 HTTPS 및 도메인 설정
  • 라우팅과 라우팅 테이블의 이해
  • JPA 영속성 컨텍스트
chanheess
chanheess
'왜' 그렇게 했는가?에 대한 생각으로 공부 및 작업의 저장관리
  • chanheess
    왜 그렇게 생각했는가?
    chanheess
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Backend Programming
      • Game Programming
        • Unreal
        • DirectX
      • C++
        • Memo
        • Basic
        • Effective Modern
      • Algorithm
        • Memo
        • Baekjoon
        • Programmers
        • HackerRank, LeetCode
      • Data Structure
      • Design Pattern
      • Etc
        • Memo
        • Daily Log
        • Book
  • 최근 글

  • 최근 댓글

  • 태그

    SpringSecurity
    c++ 기초 플러스
    백준
    알고리즘
    프로그래머스
    JWT
    티스토리챌린지
    Java
    spring
    오블완
    dp
    JPA
    위클리 챌린지
    dfs
  • hELLO· Designed By정상우.v4.10.0
chanheess
이메일 인증을 위한 Redis 설정과 문제 해결 과정
상단으로

티스토리툴바