이메일 인증을 위한 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;
}
}
위 코드는 다음과 같은 역할을 합니다.
- LettuceConnectionFactory: Redis 서버의 호스트와 포트 정보를 기반으로 연결을 생성합니다.
- RedisTemplate: Redis와 데이터를 직렬화/역직렬화하며, key-value 형태로 데이터를 저장하거나 불러오도록 도와줍니다.
- 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 |