Amazon ElastiCache는 인 메모리 데이터베이스 캐싱 시스템을 제공하여 애플리케이션이 데이터를 검색 할 수있는 성능, 속도 및 중복성을 향상시키는 클라우드 캐싱 서비스입니다.
로컬에서는 AWS ElastiCache를 접속하지 못하기 때문에 yml profile을 따로 설정해주어 local에서는 Redis를 사용하겠습니다.
그리고 Redis는 이메일 인증에 사용하려고합니다.
이메일 인증 코드를 발급 후 해당 인증코드를 잠시 저장하여 인증시에 활용하려는 목적입니다.
Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터 베이스 관리 시스템 (DBMS)입니다.(NoSQL)
데이터베이스, 캐시, 메세지 브로커로 사용되며 인메모리 데이터 구조를 가진 저장소입니다.
사용이유
데이터 베이스는 데이터를 물리 디스크에 직접 쓰기 때문에 서버에 문제가 발생하여 다운되더라도 데이터가 손실되지 않습니다. 하지만 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져서 느려질 수 있습니다.
일반적으로 서비스 운영 초반이거나 규모가 작은, 사용자가 많지 않은 서비스의 경우에는 WEB - WAS - DB 의 구조로도 데이터 베이스에 무리가 가지 않습니다.
$ brew install redis
$ brew services start redis
$ redis-cli
> set key value
> get key
> del key
> rename key newkey
https://devlog-wjdrbs96.tistory.com/314
AWS 인스턴스 및 플랫폼 서비스들은 생성 방식이 비슷하므로
생략했다.
build.gradle - dependency
implementation 'org.springframework.boot:spring-boot-starter-data-redis' // redis
Properites
@Getter
@AllArgsConstructor
@ConfigurationProperties("spring.data.redis")
public class RedisProperties {
private String host;
private int port;
}
로 yml 정보를 받아온다
default 로 localhost와 6379 가 입력되어있다.
그리고 EC2 위에서는 ElastiCache로 받아온다.
생성자 주입으로 받아왔다.
@Configuration
@EnableConfigurationProperties(RedisProperties.class)
@RequiredArgsConstructor
public class RedisConfig {
private final RedisProperties properties;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(properties.getHost(), properties.getPort());
return lettuceConnectionFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
Lettuce와 Jebis가 있는데 Lettuce를 사용하는 것이 좋다.
비동기로 요청을 처리하기에 보다 성능이 좋다.
성능 테스트 차이는
https://jojoldu.tistory.com/418 를 참고했다.
Lettuce는 TPS/CPU/Connection 개수/응답속도 등 전 분야에서 우위에 있다고 한다.
고로 Lettuce를 사용하여 빈 객체를 등록했다.
@Slf4j
@RequiredArgsConstructor
@Service
public class RedisService {
private final RedisTemplate<String, String> redisTemplate;
public String redisString(String validCode) {
ValueOperations<String, String> operations = redisTemplate.opsForValue();
operations.set("validCode", validCode);
String redis = operations.get("validCode");
log.info("input = {} ",redis);
return redis;
}
}
메일 인증 코드에 해당 기능을 사용할 것이기때문에 <String,String> 으로 해당 값 넣어줬다.
추가로 잘 받아와지는지 테스트 코드를 짤 예정이기에 반환값으로는 같은 키 값으로 value를 가져왔다.
@SpringBootTest
class RedisServiceTest {
@Autowired
RedisService redisService;
@Test
void redis값저장_불러오기(){
String uid = UUID.randomUUID().toString();
String getRedisValue = redisService.redisString(uid);
Assertions.assertThat(uid).isEqualTo(getRedisValue);
}
}
UUID를 통해 값을 랜덤적으로 넣어주고 해당 값을 가져오는지 검증테스트를 진행했다.
https://ko.theastrologypage.com/amazon-elasticache#menu-1
https://aws-hyoh.tistory.com/entry/SAA-27-ElastiCache
https://wildeveloperetrain.tistory.com/21
https://devlog-wjdrbs96.tistory.com/374
https://junghyungil.tistory.com/165
https://jojoldu.tistory.com/418